[SM-2066] Reinclude servicemix-components required by lwcontainer.

git-svn-id: https://svn.apache.org/repos/asf/servicemix/smx3/trunk@1088548 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/common/pom.xml b/common/pom.xml
new file mode 100644
index 0000000..db87d0b
--- /dev/null
+++ b/common/pom.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+<!--
+
+    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.
+-->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.servicemix</groupId>
+        <artifactId>servicemix</artifactId>
+        <version>3.4-SNAPSHOT</version>
+    </parent>
+
+    <groupId>org.apache.servicemix</groupId>
+    <artifactId>common</artifactId>
+    <version>3.4-SNAPSHOT</version>
+    <name>ServiceMix :: Common</name>
+    <packaging>pom</packaging>
+
+    <modules>
+        <module>servicemix-components</module>
+    </modules>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.servicemix</groupId>
+                <artifactId>servicemix-build</artifactId>
+                <version>1.0</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>copy</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-checkstyle-plugin</artifactId>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.apache.servicemix</groupId>
+                        <artifactId>servicemix-build</artifactId>
+                        <version>1.0</version>
+                    </dependency>
+                </dependencies>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/common/servicemix-components/pom.xml b/common/servicemix-components/pom.xml
new file mode 100644
index 0000000..b2c4e70
--- /dev/null
+++ b/common/servicemix-components/pom.xml
@@ -0,0 +1,329 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+<!--
+
+    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.
+-->
+
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.servicemix</groupId>
+    <artifactId>common</artifactId>
+    <version>3.4-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>servicemix-components</artifactId>
+  <packaging>jar</packaging>
+  <name>ServiceMix :: Components</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.servicemix</groupId>
+      <artifactId>servicemix-core</artifactId>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>commons-httpclient</groupId>
+      <artifactId>commons-httpclient</artifactId>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>commons-vfs</groupId>
+      <artifactId>commons-vfs</artifactId>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>commons-net</groupId>
+      <artifactId>commons-net</artifactId>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>commons-pool</groupId>
+      <artifactId>commons-pool</artifactId>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>commons-logging</groupId>
+      <artifactId>commons-logging</artifactId>      
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.xfire</groupId>
+      <artifactId>xfire-aegis</artifactId>
+      <optional>true</optional>      
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.xfire</groupId>
+      <artifactId>xfire-spring</artifactId>
+      <optional>true</optional>
+    </dependency>       
+    <dependency>
+      <groupId>org.codehaus.xfire</groupId>
+      <artifactId>xfire-core</artifactId>
+      <optional>true</optional>
+      <exclusions>
+        <exclusion>
+          <groupId>org.springframework</groupId>
+          <artifactId>spring</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.ws</groupId>
+      <artifactId>wsif</artifactId>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.ws</groupId>
+      <artifactId>wsif-j2c</artifactId>
+      <optional>true</optional>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.geronimo.specs</groupId>
+      <artifactId>geronimo-servlet_2.4_spec</artifactId>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.geronimo.specs</groupId>
+      <artifactId>geronimo-javamail_1.3.1_spec</artifactId>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.geronimo.specs</groupId>
+      <artifactId>geronimo-saaj_1.1_spec</artifactId>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.geronimo.specs</groupId>
+      <artifactId>geronimo-jaxrpc_1.1_spec</artifactId>
+      <optional>true</optional>
+    </dependency>
+
+    <!-- Drools dependencies -->
+    <dependency>
+      <groupId>drools</groupId>
+      <artifactId>drools-all-jdk1.4</artifactId>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>janino</groupId>
+      <artifactId>janino</artifactId>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>antlr</groupId>
+      <artifactId>antlr</artifactId>
+      <optional>true</optional>
+    </dependency>
+
+    <dependency>
+      <groupId>groovy</groupId>
+      <artifactId>groovy-all-1.0-jsr</artifactId>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>quartz</groupId>
+      <artifactId>quartz</artifactId>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>rome</groupId>
+      <artifactId>rome</artifactId>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>org.mortbay.jetty</groupId>
+      <artifactId>jetty</artifactId>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>jivesoftware</groupId>
+      <artifactId>smack</artifactId>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>jivesoftware</groupId>
+      <artifactId>smackx</artifactId>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>activesoap</groupId>
+      <artifactId>activesoap</artifactId>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>groovy</groupId>
+      <artifactId>groovy-all-1.0-jsr</artifactId>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>org.livetribe</groupId>
+      <artifactId>livetribe-jsr223</artifactId>
+      <version>2.0.5</version>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>com.sun.script</groupId>
+      <artifactId>groovy-engine</artifactId>
+      <version>20080611</version>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>jdom</groupId>
+      <artifactId>jdom</artifactId>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>org.mortbay.jetty</groupId>
+      <artifactId>jetty</artifactId>
+      <optional>true</optional>
+    </dependency>
+
+
+    <dependency>
+      <groupId>axis</groupId>
+      <artifactId>axis-jaxrpc</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>axis</groupId>
+      <artifactId>axis</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <!--  
+    <dependency>
+      <groupId>net.java.dev.saaj</groupId>
+      <artifactId>saaj-impl</artifactId>
+      <scope>test</scope>
+    </dependency>
+    -->
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.activemq</groupId>
+      <artifactId>activemq-ra</artifactId>
+      <exclusions>
+        <exclusion>
+          <groupId>org.springframework</groupId>
+          <artifactId>spring</artifactId>
+        </exclusion>
+      </exclusions>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-aop</artifactId>
+      <version>${spring-version}</version>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-context-support</artifactId>
+      <version>${spring-version}</version>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-web</artifactId>
+      <version>${spring-version}</version>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-jms</artifactId>
+      <version>${spring-version}</version>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>hsqldb</groupId>
+      <artifactId>hsqldb</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+  
+  <repositories>
+    <repository>
+      <id>codehaus-snapshots</id>
+      <url>http://repository.codehaus.org</url>
+    </repository>
+  </repositories>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <workingDirectory>${basedir}</workingDirectory>
+          <includes>
+            <include>**/*Test.*</include>
+          </includes>
+          <excludes>
+            <!--  exclude abstract tests -->
+            <exclude>**/Abstract*.*</exclude>
+            <exclude>**/*$*</exclude>
+
+            <!--  Need external resources -->
+            <exclude>**/Jabber*.*</exclude>
+            <exclude>**/FTP*.*</exclude>
+
+            <!--  These ones can not work, need rewrite -->
+            <exclude>**/JmsOverJcaWithFullXATest.*</exclude>
+
+            <!--  exclude until amq4 stable -->
+            <exclude>**/JmsOverJca*.*</exclude>
+
+            <!-- enable when GERONIMO-1419 is solved -->
+            <exclude>**/HttpSoapAttachmentsTest.*</exclude>
+
+            <!-- The following tests fails with m2 -->
+            <exclude>**/HttpTest.*</exclude>
+            <exclude>**/ValidationTest.*</exclude>
+            <exclude>**/HttpSoapTest.*</exclude>
+            <exclude>**/SaajMarshalerTest.*</exclude>
+            <exclude>**/SaajTest.*</exclude>
+            <exclude>**/XsltPublisherTest.*</exclude>
+            <exclude>**/BinaryFileTest.*</exclude>
+            <exclude>**/FileTest.*</exclude>
+            <exclude>**/CounterMonitorComponentTest.*</exclude>
+            <exclude>**/OptionalAxisQueriesTest.*</exclude>
+            <exclude>**/JmsBindingTest.*</exclude>
+            <exclude>**/WsifTest.*</exclude>
+            <exclude>**/HttpSoapAndSaajTest.*</exclude>
+            <exclude>**/JmsBindingClusterTest.*</exclude>
+            <exclude>**/JmsBindingUsingEndpointSubscriptionTest.*</exclude>
+            <exclude>**/GroovyTransformTest.*</exclude>
+            <exclude>**/TransformComponentTest.*</exclude>
+
+            <!-- Hangs -->
+            <exclude>**/SaajSoapActionTest.*</exclude>
+	        
+            <!-- https://issues.apache.org/activemq/browse/SM-529 -->
+            <exclude>**/MPSSettingTest.*</exclude>
+          
+          </excludes>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/activesoap/ASInOutBinding.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/activesoap/ASInOutBinding.java
new file mode 100644
index 0000000..be436d8
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/activesoap/ASInOutBinding.java
@@ -0,0 +1,92 @@
+/*
+ * 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.servicemix.components.activesoap;
+
+import java.io.StringWriter;
+
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.apache.servicemix.components.util.OutBinding;
+import org.codehaus.activesoap.RestService;
+
+/**
+ * Converts an inbound JBI message into an <a href="http://activesoap.codehaus.org/">ActiveSOAP</a>
+ * request-response and outputs the response back into JBI
+ *
+ * @version $Revision: 429277 $
+ */
+public class ASInOutBinding extends OutBinding {
+
+    private RestService service;
+    private ASMarshaler marshaler = new ASMarshaler();
+
+    public ASInOutBinding(RestService service) {
+        this.service = service;
+    }
+
+    /**
+     * @deprecated use getMarshaler instead
+     */
+    public ASMarshaler getMarshaller() {
+        return marshaler;
+    }
+
+    /**
+     * @deprecated use setMarshaler instead
+     */
+    public void setMarshaller(ASMarshaler marshaler) {
+        this.marshaler = marshaler;
+    }
+
+    /**
+     * @return the marshaler
+     */
+    public ASMarshaler getMarshaler() {
+        return marshaler;
+    }
+
+    /**
+     * @param marshaler the marshaler to set
+     */
+    public void setMarshaler(ASMarshaler marshaler) {
+        this.marshaler = marshaler;
+    }
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+    protected void process(MessageExchange messageExchange, NormalizedMessage inMessage) throws Exception {
+        XMLStreamReader in = marshaler.createStreamReader(inMessage);
+
+        StringWriter buffer = new StringWriter();
+        XMLStreamWriter out = marshaler.createStreamWriter(buffer);
+
+        org.codehaus.activesoap.MessageExchange asExchange = service.createMessageExchange(in, out);
+        marshaler.fromNMS(asExchange, inMessage);
+
+        service.invoke(asExchange);
+
+        NormalizedMessage outMessage = messageExchange.createMessage();
+
+        marshaler.setContent(outMessage, buffer.toString());
+        marshaler.toNMS(outMessage, asExchange);
+
+        answer(messageExchange, outMessage);
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/activesoap/ASInvocation.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/activesoap/ASInvocation.java
new file mode 100644
index 0000000..0597990
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/activesoap/ASInvocation.java
@@ -0,0 +1,46 @@
+/*
+ * 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.servicemix.components.activesoap;
+
+import org.codehaus.activesoap.transport.Invocation;
+import org.codehaus.activesoap.util.XMLStreamFactory;
+
+import javax.xml.stream.XMLStreamReader;
+
+/**
+ * An <a href="http://activesoap.codehaus.org/">ActiveSOAP</a> {@link Invocation} which uses JBI.
+ *
+ * @version $Revision: 426415 $
+ */
+public class ASInvocation extends Invocation {
+    private ASTransport asTransport;
+
+    public ASInvocation(ASTransport transport, XMLStreamFactory streamFactory) {
+        super(transport, streamFactory);
+        this.asTransport = transport;
+    }
+
+    public void invokeOneWay() throws Exception {
+        String xml = getRequestText();
+        asTransport.invokeOneWay(this, xml);
+    }
+
+    public XMLStreamReader invokeRequest() throws Exception {
+        String xml = getRequestText();
+        return asTransport.invokeRequest(this, xml);
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/activesoap/ASMarshaler.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/activesoap/ASMarshaler.java
new file mode 100644
index 0000000..844afcb
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/activesoap/ASMarshaler.java
@@ -0,0 +1,75 @@
+/*
+ * 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.servicemix.components.activesoap;
+
+import java.io.Writer;
+
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+import javax.xml.transform.Source;
+
+import org.apache.servicemix.jbi.jaxp.StringSource;
+import org.codehaus.activesoap.MessageExchange;
+import org.codehaus.activesoap.util.XMLStreamFactory;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class ASMarshaler {
+
+    private XMLStreamFactory streamFactory = new XMLStreamFactory();
+
+    public void setContent(NormalizedMessage message, String xml) throws MessagingException {
+        message.setContent(new StringSource(xml));
+    }
+
+    public XMLStreamReader createStreamReader(NormalizedMessage message) throws XMLStreamException {
+        Source content = message.getContent();
+        return streamFactory.getInputFactory().createXMLStreamReader(content);
+    }
+
+
+    public XMLStreamWriter createStreamWriter(Writer writer) throws XMLStreamException {
+        return streamFactory.getOutputFactory().createXMLStreamWriter(writer);
+    }
+
+    /**
+     * Converts from an NMS message to an ActiveSOAP message exchange
+     */
+    public void fromNMS(MessageExchange asExchange, NormalizedMessage normalizedMessage) {
+    }
+
+    /**
+     * Converts from an ActiveSOAP message exchange to an NMS message
+     */
+    public void toNMS(NormalizedMessage normalizedMessage, MessageExchange asExchange) {
+    }
+
+
+    // Properties
+    //-------------------------------------------------------------------------
+    public XMLStreamFactory getStreamFactory() {
+        return streamFactory;
+    }
+
+    public void setStreamFactory(XMLStreamFactory streamFactory) {
+        this.streamFactory = streamFactory;
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/activesoap/ASOutBinding.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/activesoap/ASOutBinding.java
new file mode 100644
index 0000000..cb067ad
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/activesoap/ASOutBinding.java
@@ -0,0 +1,80 @@
+/*
+ * 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.servicemix.components.activesoap;
+
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.stream.XMLStreamReader;
+
+import org.apache.servicemix.components.util.OutBinding;
+import org.codehaus.activesoap.RestService;
+
+/**
+ * Converts an inbound JBI message into an <a href="http://activesoap.codehaus.org/">ActiveSOAP</a>
+ * one way invocation.
+ *
+ * @version $Revision: 429277 $
+ */
+public class ASOutBinding extends OutBinding {
+
+    private RestService service;
+    private ASMarshaler marshaler = new ASMarshaler();
+
+    public ASOutBinding(RestService service) {
+        this.service = service;
+    }
+
+    /**
+     * @deprecated use getMarshaler instead
+     */
+    public ASMarshaler getMarshaller() {
+        return marshaler;
+    }
+
+    /**
+     * @deprecated use setMarshaler instead
+     */
+    public void setMarshaller(ASMarshaler marshaler) {
+        this.marshaler = marshaler;
+    }
+
+    /**
+     * @return the marshaler
+     */
+    public ASMarshaler getMarshaler() {
+        return marshaler;
+    }
+
+    /**
+     * @param marshaler the marshaler to set
+     */
+    public void setMarshaler(ASMarshaler marshaler) {
+        this.marshaler = marshaler;
+    }
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+    protected void process(MessageExchange messageExchange, NormalizedMessage inMessage) throws Exception {
+        XMLStreamReader in = marshaler.createStreamReader(inMessage);
+
+        org.codehaus.activesoap.MessageExchange asExchange = service.createMessageExchange(in, null);
+        marshaler.fromNMS(asExchange, inMessage);
+        service.invoke(asExchange);
+
+        done(messageExchange);
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/activesoap/ASTransport.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/activesoap/ASTransport.java
new file mode 100644
index 0000000..10a37b2
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/activesoap/ASTransport.java
@@ -0,0 +1,95 @@
+/*
+ * 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.servicemix.components.activesoap;
+
+import org.codehaus.activesoap.transport.Invocation;
+import org.codehaus.activesoap.transport.TransportClient;
+import org.codehaus.activesoap.util.XMLStreamFactory;
+
+import javax.jbi.messaging.DeliveryChannel;
+import javax.jbi.messaging.Fault;
+import javax.jbi.messaging.InOnly;
+import javax.jbi.messaging.InOut;
+import javax.jbi.messaging.MessageExchangeFactory;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.stream.XMLStreamReader;
+import java.io.Reader;
+
+/**
+ * An <a href="http://activesoap.codehaus.org/">ActiveSOAP</a> transport which uses JBI.
+ *
+ * @version $Revision: 426415 $
+ */
+public class ASTransport implements TransportClient {
+
+    private ASMarshaler marshaler = new ASMarshaler();
+
+
+    private DeliveryChannel channel;
+    private XMLStreamFactory streamFactory;
+
+    public ASTransport(DeliveryChannel channel) {
+        this(channel, new XMLStreamFactory());
+    }
+
+    public ASTransport(DeliveryChannel channel, XMLStreamFactory streamFactory) {
+        this.channel = channel;
+        this.streamFactory = streamFactory;
+    }
+
+    public Invocation createInvocation() {
+        return new ASInvocation(this, streamFactory);
+    }
+
+    public void invokeOneWay(Invocation invocation, Reader request) throws Exception {
+        throw new UnsupportedOperationException("Should never be invoked directly");
+    }
+
+    public Reader invokeRequest(Invocation invocation, Reader request) throws Exception {
+        throw new UnsupportedOperationException("Should never be invoked directly");
+    }
+
+    public void close() throws Exception {
+        channel.close();
+    }
+
+    public void invokeOneWay(ASInvocation invocation, String xml) throws Exception {
+        MessageExchangeFactory fac = channel.createExchangeFactory();
+        InOnly exchange = fac.createInOnlyExchange();
+        NormalizedMessage inMessage = exchange.createMessage();
+        marshaler.setContent(inMessage, xml);
+        exchange.setInMessage(inMessage);
+        channel.send(exchange);
+    }
+
+    public XMLStreamReader invokeRequest(ASInvocation invocation, String xml) throws Exception {
+        MessageExchangeFactory fac = channel.createExchangeFactory();
+        InOut exchange = fac.createInOutExchange();
+        NormalizedMessage inMessage = exchange.createMessage();
+        marshaler.setContent(inMessage, xml);
+        exchange.setInMessage(inMessage);
+        boolean answer = channel.sendSync(exchange);
+        if (answer) {
+            NormalizedMessage outMessage = exchange.getOutMessage();
+            return marshaler.createStreamReader(outMessage);
+        }
+        else {
+            Fault fault = exchange.getFault();
+            return marshaler.createStreamReader(fault);
+        }
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/activesoap/package.html b/common/servicemix-components/src/main/java/org/apache/servicemix/components/activesoap/package.html
new file mode 100644
index 0000000..08b7021
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/activesoap/package.html
@@ -0,0 +1,28 @@
+<!--
+
+    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.
+
+-->
+<html>
+<head>
+</head>
+<body>
+
+Bindings for integrating <a href="http://activesoap.codehaus.org/">ActiveSOAP</a> services and for ActiveSOAP to use
+JBI as its transport bindings.
+
+</body>
+</html>
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/cache/CacheComponent.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/cache/CacheComponent.java
new file mode 100644
index 0000000..31defb1
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/cache/CacheComponent.java
@@ -0,0 +1,110 @@
+/*
+ * 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.servicemix.components.cache;
+
+import java.util.Map;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.Fault;
+import javax.jbi.messaging.InOut;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+
+import org.apache.servicemix.components.util.TransformComponentSupport;
+import org.apache.servicemix.expression.Expression;
+import org.apache.servicemix.expression.PropertyExpression;
+import org.apache.servicemix.jbi.NoOutMessageAvailableException;
+
+/**
+ * Implements a caching layer on top of a service invocation to avoid calling an expensive remote service too often.
+ * The cache can be a simple Map based cache or a full <a href="http://www.jcp.org/en/jsr/detail?id=107">JCache</a> instance.
+ *
+ * @version $Revision: 426415 $
+ */
+public class CacheComponent extends TransformComponentSupport {
+
+    public static final PropertyExpression KEY_PROPERTY_EXPRESSION = new PropertyExpression("org.apache.servicemix.key");
+
+    private Map cache;
+    private Expression keyExpression = KEY_PROPERTY_EXPRESSION;
+
+    public Map getCache() {
+        return cache;
+    }
+
+    public void setCache(Map cache) {
+        this.cache = cache;
+    }
+
+    public Expression getKeyExpression() {
+        return keyExpression;
+    }
+
+    public void setKeyExpression(Expression keyExpression) {
+        this.keyExpression = keyExpression;
+    }
+
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+    protected void init() throws JBIException {
+        super.init();
+        if (cache == null) {
+            throw new JBIException("You must specify a cache property");
+        }
+    }
+
+    protected boolean transform(MessageExchange exchange, NormalizedMessage in, NormalizedMessage out) throws MessagingException {
+        Object key = keyExpression.evaluate(exchange, in);
+        if (key != null) {
+            NormalizedMessage message = (NormalizedMessage) cache.get(key);
+            if (message != null) {
+                getMessageTransformer().transform(exchange, message, out);
+                return true;
+            }
+        }
+
+        InOut inOut = getExchangeFactory().createInOutExchange();
+        NormalizedMessage request = inOut.createMessage();
+        getMessageTransformer().transform(exchange, in, request);
+        inOut.setInMessage(request);
+        getDeliveryChannel().sendSync(inOut);
+
+        NormalizedMessage response = inOut.getOutMessage();
+        Fault fault = inOut.getFault();
+        Exception error = inOut.getError();
+        if (fault != null) {
+            fail(exchange, fault);
+        }
+        else if (error != null) {
+            fail(exchange, error);
+        }
+        else if (response != null) {
+            getMessageTransformer().transform(exchange, response, out);
+
+            if (key != null) {
+                cache.put(key, response);
+            }
+        }
+        else {
+            throw new NoOutMessageAvailableException(exchange);
+        }
+        return true;
+    }
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/cache/LRUCache.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/cache/LRUCache.java
new file mode 100644
index 0000000..52acd8d
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/cache/LRUCache.java
@@ -0,0 +1,52 @@
+/*
+ * 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.servicemix.components.cache;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * Represnts an LRUCache of a fixed maximum size which by default will
+ * remove items based on access order but can be used to use insertion order
+ *
+ * @version $Revision: 426415 $
+ */
+public class LRUCache extends LinkedHashMap {
+    private static final long serialVersionUID = -5754338187296859149L;
+
+    protected static final int DEFAULT_INITIAL_CAPACITY = 1000;
+    protected static final float DEFAULT_LOAD_FACTOR = (float) 0.75;
+
+    private int maxSize;
+
+    public LRUCache(int initialCapacity, float loadFactor, boolean accessOrder, int maxSize) {
+        super(initialCapacity, loadFactor, accessOrder);
+        this.maxSize = maxSize;
+    }
+
+    public LRUCache(int maxSize) {
+        this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR, true, maxSize);
+    }
+
+    public LRUCache(int maxSize, boolean accessOrder) {
+        this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR, accessOrder, maxSize);
+    }
+
+    protected boolean removeEldestEntry(Map.Entry eldest) {
+        return size() > maxSize;
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/cache/package.html b/common/servicemix-components/src/main/java/org/apache/servicemix/components/cache/package.html
new file mode 100644
index 0000000..3a9b0f2
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/cache/package.html
@@ -0,0 +1,27 @@
+<!--
+
+    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.
+
+-->
+<html>
+<head>
+</head>
+<body>
+
+A component which peforms caching using the <a href="http://servicemix.org/JCache">JCache API</a>
+
+</body>
+</html>
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/DroolsComponent.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/DroolsComponent.java
new file mode 100644
index 0000000..32bc7aa
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/DroolsComponent.java
@@ -0,0 +1,185 @@
+/*
+ * 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.servicemix.components.drools;
+
+import java.net.URL;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.DeliveryChannel;
+import javax.jbi.messaging.ExchangeStatus;
+import javax.jbi.messaging.Fault;
+import javax.jbi.messaging.InOnly;
+import javax.jbi.messaging.InOut;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessageExchangeFactory;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.namespace.QName;
+
+import org.apache.servicemix.JbiConstants;
+import org.apache.servicemix.components.util.OutBinding;
+import org.drools.FactException;
+import org.drools.RuleBase;
+import org.drools.WorkingMemory;
+import org.drools.io.RuleBaseLoader;
+import org.springframework.core.io.Resource;
+
+/**
+ * A component which implements a rules based routing using <a href="http://drools.org/">Drools</a> to decide
+ * where to route the message.
+ *
+ * @version $Revision: 478818 $
+ */
+public class DroolsComponent extends OutBinding {
+
+    private RuleBase ruleBase;
+    private Resource ruleBaseResource;
+    private URL ruleBaseURL;
+    private ThreadLocal routed = new ThreadLocal();
+
+    public RuleBase getRuleBase() {
+        return ruleBase;
+    }
+
+    public void setRuleBase(RuleBase ruleBase) {
+        this.ruleBase = ruleBase;
+    }
+
+    public Resource getRuleBaseResource() {
+        return ruleBaseResource;
+    }
+
+    public void setRuleBaseResource(Resource ruleBaseResource) {
+        this.ruleBaseResource = ruleBaseResource;
+    }
+
+    public URL getRuleBaseURL() {
+        return ruleBaseURL;
+    }
+
+    public void setRuleBaseURL(URL ruleBaseURL) {
+        this.ruleBaseURL = ruleBaseURL;
+    }
+
+    // Helper methods for the rule base
+    //-------------------------------------------------------------------------
+    public void forwardToService(MessageExchange exchange, NormalizedMessage in, QName name) throws MessagingException {
+        DeliveryChannel channel = getDeliveryChannel();
+        MessageExchangeFactory factory = channel.createExchangeFactoryForService(name);
+        InOnly outExchange = factory.createInOnlyExchange();
+        String processCorrelationId = (String)exchange.getProperty(JbiConstants.CORRELATION_ID);
+        if (processCorrelationId != null) {
+            outExchange.setProperty(JbiConstants.CORRELATION_ID, processCorrelationId);
+        }
+        forwardToExchange(exchange, outExchange, in);
+    }
+
+
+    public void forwardToInterface(QName name, MessageExchange exchange, NormalizedMessage in) throws MessagingException {
+        DeliveryChannel channel = getDeliveryChannel();
+        MessageExchangeFactory factory = channel.createExchangeFactory(name);
+        InOnly outExchange = factory.createInOnlyExchange();
+        String processCorrelationId = (String)exchange.getProperty(JbiConstants.CORRELATION_ID);
+        if (processCorrelationId != null) {
+            outExchange.setProperty(JbiConstants.CORRELATION_ID, processCorrelationId);
+        }
+        forwardToExchange(exchange, outExchange, in);
+    }
+
+    public void route(MessageExchange exchange, NormalizedMessage in, QName service, QName interfaceName, QName operation) throws MessagingException {
+        if (routed.get() != null) {
+            throw new IllegalStateException("Drools component has already routed this exchange");
+        }
+        routed.set(Boolean.TRUE);
+        DeliveryChannel channel = getDeliveryChannel();
+        MessageExchangeFactory factory = channel.createExchangeFactory();
+        MessageExchange me = factory.createExchange(exchange.getPattern());
+        me.setInterfaceName(interfaceName);
+        me.setService(service);
+        me.setOperation(operation);
+        NormalizedMessage nm = me.createMessage(); 
+        me.setMessage(nm, "in");
+        getMessageTransformer().transform(exchange, in, nm);
+        channel.sendSync(me); 
+        if (me.getStatus() == ExchangeStatus.ERROR) {
+            fail(exchange, me.getError());
+        } else if (me.getStatus() == ExchangeStatus.DONE) {
+            done(exchange);
+        } else {
+            NormalizedMessage out = me.getMessage("out");
+            if (out != null) {
+                nm = exchange.createMessage();
+                exchange.setMessage(nm, "out");
+                getMessageTransformer().transform(exchange, out, nm);
+            } else {
+                Fault f = me.getFault();
+                Fault of = exchange.createFault();
+                exchange.setFault(of);
+                getMessageTransformer().transform(exchange, f, of);
+            }
+            channel.send(exchange);
+            done(me);
+        }
+        
+    }
+
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+    protected void init() throws JBIException {
+        super.init();
+        try {
+            if (ruleBase == null) {
+                if (ruleBaseResource != null) {
+                    ruleBase = RuleBaseLoader.loadFromInputStream(ruleBaseResource.getInputStream());
+                }
+                else if (ruleBaseURL != null) {
+                    ruleBase = RuleBaseLoader.loadFromUrl(ruleBaseURL);
+                }
+                else {
+                    throw new IllegalArgumentException("You must specify a ruleBase, ruleBaseResource or ruleBaseURL property");
+                }
+            }
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+            throw new JBIException(e);
+        }
+    }
+
+    protected void process(MessageExchange exchange, NormalizedMessage in) throws Exception {
+        WorkingMemory memory = ruleBase.newWorkingMemory();
+        populateWorkingMemory(memory, exchange, in);
+        routed.set(null);
+        memory.fireAllRules();
+        if (routed.get() == null) {
+            if (exchange instanceof InOut) {
+                fail(exchange, new Exception("Drools component has not routed the exchange"));
+            } else {
+                done(exchange);
+            }
+        }
+    }
+
+    protected void populateWorkingMemory(WorkingMemory memory, MessageExchange exchange, NormalizedMessage in) throws MessagingException, FactException {
+        memory.setApplicationData("context", getContext());
+        memory.setApplicationData("deliveryChannel", getDeliveryChannel());
+        memory.setApplicationData("jbi", new JbiHelper(this, exchange, in, memory));
+        memory.assertObject(in);
+        memory.assertObject(exchange);
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/FactMessagingException.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/FactMessagingException.java
new file mode 100644
index 0000000..50aa1d0
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/FactMessagingException.java
@@ -0,0 +1,30 @@
+/*
+ * 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.servicemix.components.drools;
+
+import org.drools.FactException;
+
+import javax.jbi.messaging.MessagingException;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class FactMessagingException extends MessagingException {
+    public FactMessagingException(FactException e) {
+        super(e.getMessage(), e);
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/JbiHelper.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/JbiHelper.java
new file mode 100644
index 0000000..e35174d
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/JbiHelper.java
@@ -0,0 +1,86 @@
+/*
+ * 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.servicemix.components.drools;
+
+import javax.jbi.messaging.DeliveryChannel;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.namespace.QName;
+
+import org.drools.WorkingMemory;
+
+/**
+ * A helper class for use inside a rule to forward a message to an endpoint
+ *
+ * @version $Revision: 426415 $
+ */
+public class JbiHelper {
+    private DroolsComponent component;
+    private MessageExchange exchange;
+    private NormalizedMessage in;
+    private WorkingMemory memory;
+
+    public JbiHelper(DroolsComponent component, 
+                     MessageExchange exchange, 
+                     NormalizedMessage in,
+                     WorkingMemory memory) {
+        this.component = component;
+        this.exchange = exchange;
+        this.in = in;
+        this.memory = memory;
+    }
+
+    /**
+     * Forwards the inbound message to the given
+     *
+     * @param uri
+     * @param localPart
+     */
+    public void forwardToService(String uri, String localPart) throws MessagingException {
+        QName service = new QName(uri, localPart);
+        component.forwardToService(exchange, in, service);
+    }
+
+    public void forwardToService(QName name, QName operation, QName interfaceName) throws MessagingException {
+        component.forwardToService(exchange, in, name);
+    }
+
+    public void invoke(QName service, QName operation, QName interfaceName) throws MessagingException {
+        component.invoke(exchange, in, service, interfaceName, operation);
+    }
+
+    public void route(QName service, QName operation, QName interfaceName) throws MessagingException {
+        component.route(exchange, in, service, interfaceName, operation);
+    }
+
+    public DeliveryChannel getDeliveryChannel() throws MessagingException {
+        return getComponent().getContext().getDeliveryChannel();
+    }
+
+    public DroolsComponent getComponent() {
+        return component;
+    }
+
+    public MessageExchange getExchange() {
+        return exchange;
+    }
+
+    public NormalizedMessage getIn() {
+        return in;
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/dsl/ForwardConsequenceFactory.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/dsl/ForwardConsequenceFactory.java
new file mode 100644
index 0000000..fd9a77f
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/dsl/ForwardConsequenceFactory.java
@@ -0,0 +1,85 @@
+/*
+ * 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.servicemix.components.drools.dsl;
+
+import javax.jbi.messaging.MessagingException;
+import javax.xml.namespace.QName;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.components.drools.JbiHelper;
+import org.drools.rule.Rule;
+import org.drools.smf.Configuration;
+import org.drools.smf.ConsequenceFactory;
+import org.drools.smf.FactoryException;
+import org.drools.spi.Consequence;
+import org.drools.spi.RuleBaseContext;
+import org.drools.spi.Tuple;
+
+/**
+ * @version $Revision: 556864 $
+ */
+public class ForwardConsequenceFactory implements ConsequenceFactory {
+    private static transient Log log = LogFactory.getLog(ForwardConsequenceFactory.class);
+
+    public Consequence newConsequence(Rule rule, RuleBaseContext ruleBaseContext, final Configuration configuration) throws FactoryException {
+    	final String[] services = configuration.getAttribute("service").split(",");
+        return new JbiConsequence() {
+            protected void invokeJbiOperation(JbiHelper helper, Tuple tuple) throws MessagingException {
+            	for (int i = 0; i < services.length; i++) {
+	                QName service = toQName(configuration, services[i]);
+	                helper.forwardToService(service, null, null);
+            	}
+            }
+        };
+    }
+
+    /**
+     * Converts the String into a QName
+     */
+    protected QName toQName(Configuration configuration, String text) {
+        if (text == null) {
+            return null;
+        }
+        String[] names = configuration.getAttributeNames();
+        String localPart = text;
+        String prefix = null;
+        int idx = text.indexOf(':');
+        if (idx >= 0) {
+            prefix = "xmlns:" + text.substring(0, idx);
+            localPart = text.substring(idx + 1);
+        }
+        String uri = "";
+        for (int i = 0; i < names.length; i++) {
+            String name = names[i];
+            if (prefix == null) {
+                if ("xmlns".equals(name)) {
+                    uri = configuration.getAttribute(name);
+                    break;
+                }
+            }
+            else {
+                if (name.equals(prefix)) {
+                    uri = configuration.getAttribute(name);
+                    break;
+                }
+            }
+        }
+        log.debug("Creating QName with uri: " + uri + " name: " + localPart);
+        return new QName(uri, localPart);
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/dsl/InvokeConsequenceFactory.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/dsl/InvokeConsequenceFactory.java
new file mode 100644
index 0000000..448d8fb
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/dsl/InvokeConsequenceFactory.java
@@ -0,0 +1,85 @@
+/*
+ * 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.servicemix.components.drools.dsl;
+
+import javax.jbi.messaging.MessagingException;
+import javax.xml.namespace.QName;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.components.drools.JbiHelper;
+import org.drools.rule.Rule;
+import org.drools.smf.Configuration;
+import org.drools.smf.ConsequenceFactory;
+import org.drools.smf.FactoryException;
+import org.drools.spi.Consequence;
+import org.drools.spi.RuleBaseContext;
+import org.drools.spi.Tuple;
+
+/**
+ * @version $Revision: 556864 $
+ */
+public class InvokeConsequenceFactory implements ConsequenceFactory {
+
+    private static transient Log log = LogFactory.getLog(InvokeConsequenceFactory.class);
+
+    public Consequence newConsequence(Rule rule, RuleBaseContext ruleBaseContext, Configuration configuration) throws FactoryException {
+        final QName operation = toQName(configuration, configuration.getAttribute("operation"));
+        final QName service = toQName(configuration, configuration.getAttribute("service"));
+        final QName interfaceName = toQName(configuration, configuration.getAttribute("interface"));
+        return new JbiConsequence() {
+            protected void invokeJbiOperation(JbiHelper helper, Tuple tuple) throws MessagingException {
+                helper.invoke(service, operation, interfaceName);
+            }
+        };
+    }
+
+    /**
+     * Converts the String into a QName
+     */
+    protected QName toQName(Configuration configuration, String text) {
+        if (text == null) {
+            return null;
+        }
+        String[] names = configuration.getAttributeNames();
+        String localPart = text;
+        String prefix = null;
+        int idx = text.indexOf(':');
+        if (idx >= 0) {
+            prefix = "xmlns:" + text.substring(0, idx);
+            localPart = text.substring(idx + 1);
+        }
+        String uri = "";
+        for (int i = 0; i < names.length; i++) {
+            String name = names[i];
+            if (prefix == null) {
+                if ("xmlns".equals(name)) {
+                    uri = configuration.getAttribute(name);
+                    break;
+                }
+            }
+            else {
+                if (name.equals(prefix)) {
+                    uri = configuration.getAttribute(name);
+                    break;
+                }
+            }
+        }
+        log.debug("Creating QName with uri: " + uri + " name: " + localPart);
+        return new QName(uri, localPart);
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/dsl/JaxenCondition.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/dsl/JaxenCondition.java
new file mode 100644
index 0000000..8ea0743
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/dsl/JaxenCondition.java
@@ -0,0 +1,87 @@
+/*
+ * 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.servicemix.components.drools.dsl;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+
+import org.apache.servicemix.expression.JaxenVariableContext;
+import org.apache.servicemix.expression.JaxenXPathExpression;
+import org.drools.WorkingMemory;
+import org.drools.rule.Declaration;
+import org.drools.rule.Rule;
+import org.drools.spi.Condition;
+import org.drools.spi.Tuple;
+
+/**
+ * Represents a Jaxen based condition using the W3C DOM.
+ *
+ * @version $Revision: 426415 $
+ */
+public class JaxenCondition implements Condition {
+    private Rule rule;
+    private JaxenXPathExpression expression;
+
+    public JaxenCondition(Rule rule, JaxenXPathExpression expression) {
+        this.rule = rule;
+        this.expression = expression;
+    }
+
+    public Declaration[] getRequiredTupleMembers() {
+        Collection list = rule.getParameterDeclarations();
+        Declaration[] answer = new Declaration[list.size()];
+        list.toArray(answer);
+        return answer;
+    }
+
+    public boolean isAllowed(Tuple tuple) {
+        List list = (List) rule.getParameterDeclarations();
+        WorkingMemory memory = tuple.getWorkingMemory();
+        JaxenVariableContext variableContext = expression.getVariableContext();
+        variableContext.setVariables(null);
+
+        for (Iterator iter = list.iterator(); iter.hasNext();) {
+            Declaration declaration = (Declaration) iter.next();
+            String name = declaration.getIdentifier();
+            Object value = tuple.get(declaration);
+            variableContext.setVariableValue(name, value);
+        }
+        NormalizedMessage message = (NormalizedMessage) findFirst(memory, NormalizedMessage.class);
+        MessageExchange exchange = (MessageExchange) findFirst(memory, MessageExchange.class);
+
+        try {
+            return expression.matches(exchange, message);
+        }
+        catch (MessagingException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    protected Object findFirst(WorkingMemory memory, Class type) {
+        List objects = memory.getObjects(type);
+        Object answer = null;
+        if (objects.size() > 0) {
+            answer = objects.get(0);
+        }
+        return answer;
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/dsl/JaxenConditionFactory.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/dsl/JaxenConditionFactory.java
new file mode 100644
index 0000000..64fa9e9
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/dsl/JaxenConditionFactory.java
@@ -0,0 +1,71 @@
+/*
+ * 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.servicemix.components.drools.dsl;
+
+import org.apache.servicemix.expression.JaxenXPathExpression;
+import org.drools.rule.Rule;
+import org.drools.smf.ConditionFactory;
+import org.drools.smf.Configuration;
+import org.drools.smf.FactoryException;
+import org.drools.spi.Condition;
+import org.drools.spi.RuleBaseContext;
+import org.jaxen.NamespaceContext;
+import org.jaxen.SimpleNamespaceContext;
+
+/**
+ * A condition which uses Jaxen based XPath expressions
+ *
+ * @version $Revision: 449611 $
+ */
+public class JaxenConditionFactory implements ConditionFactory {
+
+    public Condition[] newCondition(Rule rule, RuleBaseContext ruleBaseContext, Configuration configuration) throws FactoryException {
+        String text = configuration.getText();
+        if (text == null) {
+            throw new FactoryException("No XPath provided!");
+        }
+        try {
+            JaxenXPathExpression expression = new JaxenXPathExpression();
+            expression.setXpath(text);
+            expression.setNamespaceContext(createNamespaceContext(configuration));
+            expression.afterPropertiesSet();
+            return new Condition[]{ new JaxenCondition(rule, expression) };
+        }
+        catch (Exception e) {
+            throw new FactoryException(e);
+        }
+    }
+
+    protected NamespaceContext createNamespaceContext(Configuration configuration) {
+        SimpleNamespaceContext answer = new SimpleNamespaceContext();
+        String[] names = configuration.getAttributeNames();
+        for (int i = 0; i < names.length; i++) {
+            String name = names[i];
+            if (name.equals("xmlns")) {
+                answer.addNamespace("", configuration.getAttribute(name));
+            }
+            else {
+                if (name.startsWith("xmlns:")) {
+                    String prefix = name.substring(6);
+                    String uri = configuration.getAttribute(name);
+                    answer.addNamespace(prefix, uri);
+                }
+            }
+        }
+        return answer;
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/dsl/JbiConsequence.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/dsl/JbiConsequence.java
new file mode 100644
index 0000000..28bdd0d
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/dsl/JbiConsequence.java
@@ -0,0 +1,45 @@
+/*
+ * 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.servicemix.components.drools.dsl;
+
+import org.apache.servicemix.components.drools.JbiHelper;
+import org.drools.spi.Consequence;
+import org.drools.spi.ConsequenceException;
+import org.drools.spi.Tuple;
+
+import javax.jbi.messaging.MessagingException;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public abstract class JbiConsequence implements Consequence {
+
+    public void invoke(Tuple tuple) throws ConsequenceException {
+        JbiHelper helper = (JbiHelper) tuple.getWorkingMemory().getApplicationData("jbi");
+        if (helper == null) {
+            throw new ConsequenceException("No 'jbi' application data available");
+        }
+        try {
+            invokeJbiOperation(helper, tuple);
+        }
+        catch (MessagingException e) {
+            throw new ConsequenceException(e);
+        }
+    }
+    
+    protected abstract void invokeJbiOperation(JbiHelper helper, Tuple tuple) throws MessagingException;
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/dsl/RouteConsequenceFactory.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/dsl/RouteConsequenceFactory.java
new file mode 100644
index 0000000..c45a1de
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/dsl/RouteConsequenceFactory.java
@@ -0,0 +1,84 @@
+/*
+ * 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.servicemix.components.drools.dsl;
+
+import javax.jbi.messaging.MessagingException;
+import javax.xml.namespace.QName;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.components.drools.JbiHelper;
+import org.drools.rule.Rule;
+import org.drools.smf.Configuration;
+import org.drools.smf.ConsequenceFactory;
+import org.drools.smf.FactoryException;
+import org.drools.spi.Consequence;
+import org.drools.spi.RuleBaseContext;
+import org.drools.spi.Tuple;
+
+/**
+ * @version $Revision: 359186 $
+ */
+public class RouteConsequenceFactory implements ConsequenceFactory {
+    private static transient Log log = LogFactory.getLog(RouteConsequenceFactory.class);
+
+    public Consequence newConsequence(Rule rule, RuleBaseContext ruleBaseContext, Configuration configuration) throws FactoryException {
+        final QName operation = toQName(configuration, configuration.getAttribute("operation"));
+        final QName service = toQName(configuration, configuration.getAttribute("service"));
+        final QName interfaceName = toQName(configuration, configuration.getAttribute("interface"));
+        return new JbiConsequence() {
+            protected void invokeJbiOperation(JbiHelper helper, Tuple tuple) throws MessagingException {
+                helper.route(service, operation, interfaceName);
+            }
+        };
+    }
+
+    /**
+     * Converts the String into a QName
+     */
+    protected QName toQName(Configuration configuration, String text) {
+        if (text == null) {
+            return null;
+        }
+        String[] names = configuration.getAttributeNames();
+        String localPart = text;
+        String prefix = null;
+        int idx = text.indexOf(':');
+        if (idx >= 0) {
+            prefix = "xmlns:" + text.substring(0, idx);
+            localPart = text.substring(idx + 1);
+        }
+        String uri = "";
+        for (int i = 0; i < names.length; i++) {
+            String name = names[i];
+            if (prefix == null) {
+                if ("xmlns".equals(name)) {
+                    uri = configuration.getAttribute(name);
+                    break;
+                }
+            }
+            else {
+                if (name.equals(prefix)) {
+                    uri = configuration.getAttribute(name);
+                    break;
+                }
+            }
+        }
+        log.debug("Creating QName with uri: " + uri + " name: " + localPart);
+        return new QName(uri, localPart);
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/package.html b/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/package.html
new file mode 100644
index 0000000..9d31d62
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/drools/package.html
@@ -0,0 +1,27 @@
+<!--
+
+    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.
+
+-->
+<html>
+<head>
+</head>
+<body>
+
+A component which peforms rules based routing using <a href="http://drools.org/">Drools</a> to decide where to route the message.
+
+</body>
+</html>
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/email/MailMarshalerSupport.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/email/MailMarshalerSupport.java
new file mode 100644
index 0000000..9d6b538
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/email/MailMarshalerSupport.java
@@ -0,0 +1,247 @@
+/*
+ * 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.servicemix.components.email;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.util.Collection;
+import java.util.Date;
+import java.util.Iterator;
+
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.mail.Address;
+import javax.mail.internet.AddressException;
+import javax.mail.internet.InternetAddress;
+import javax.xml.transform.Source;
+import javax.xml.transform.TransformerException;
+
+import org.apache.servicemix.components.util.MarshalerSupport;
+import org.apache.servicemix.expression.Expression;
+import org.apache.servicemix.expression.PropertyExpression;
+
+/**
+ * A useful base class for mail marshalers.
+ *
+ * @version $Revision: 472747 $
+ */
+public abstract class MailMarshalerSupport extends MarshalerSupport {
+    private DateFormat dateFormat = DateFormat.getInstance();
+
+    private Expression to = new PropertyExpression("org.apache.servicemix.email.to");
+    private Expression cc = new PropertyExpression("org.apache.servicemix.email.cc");
+    private Expression bcc = new PropertyExpression("org.apache.servicemix.email.bcc");
+    private Expression from = new PropertyExpression("org.apache.servicemix.email.from", "noone@servicemix.org");
+    private Expression text = new PropertyExpression("org.apache.servicemix.email.text");
+    private Expression html = new PropertyExpression("org.apache.servicemix.email.html");
+    private Expression subject = new PropertyExpression("org.apache.servicemix.email.subject", "Message from ServiceMix");
+    private Expression replyTo = new PropertyExpression("org.apache.servicemix.email.replyTo");
+    private Expression sentDate = new PropertyExpression("org.apache.servicemix.email.sentDate");
+    private Expression attachments = new PropertyExpression("org.apache.servicemix.email.attachments");
+
+    public Expression getTo() {
+        return to;
+    }
+
+    public void setTo(Expression to) {
+        this.to = to;
+    }
+
+    public Expression getCc() {
+        return cc;
+    }
+
+    public void setCc(Expression cc) {
+        this.cc = cc;
+    }
+
+    public Expression getBcc() {
+        return bcc;
+    }
+
+    public void setBcc(Expression bcc) {
+        this.bcc = bcc;
+    }
+
+    public Expression getFrom() {
+        return from;
+    }
+
+    public void setFrom(Expression from) {
+        this.from = from;
+    }
+
+    public Expression getText() {
+        return text;
+    }
+
+    public void setText(Expression text) {
+        this.text = text;
+    }
+
+    public Expression getHtml() {
+        return html;
+    }
+
+    public void setHtml(Expression html) {
+        this.html = html;
+    }
+
+    public Expression getSubject() {
+        return subject;
+    }
+
+    public void setSubject(Expression subject) {
+        this.subject = subject;
+    }
+
+    public Expression getReplyTo() {
+        return replyTo;
+    }
+
+    public void setReplyTo(Expression replyTo) {
+        this.replyTo = replyTo;
+    }
+
+    public Expression getSentDate() {
+        return sentDate;
+    }
+
+    public void setSentDate(Expression sentDate) {
+        this.sentDate = sentDate;
+    }
+
+    public DateFormat getDateFormat() {
+        return dateFormat;
+    }
+
+    public void setDateFormat(DateFormat dateFormat) {
+        this.dateFormat = dateFormat;
+    }
+
+    public Expression getAttachments() {
+        return attachments;
+    }
+
+    public void setAttachments(Expression attachments) {
+        this.attachments = attachments;
+    }
+    // Implementation methods
+    //-------------------------------------------------------------------------
+    protected Date getSentDate(MessageExchange exchange, NormalizedMessage normalizedMessage) throws MessagingException {
+        return asDate(sentDate.evaluate(exchange, normalizedMessage));
+    }
+
+    protected String getSubject(MessageExchange exchange, NormalizedMessage normalizedMessage) throws MessagingException {
+        return asString(subject.evaluate(exchange, normalizedMessage));
+    }
+
+    protected String getText(MessageExchange exchange, NormalizedMessage normalizedMessage) throws MessagingException, TransformerException {
+        String text = asString(this.text.evaluate(exchange, normalizedMessage));
+        if (text == null) {
+            // lets just turn the XML body to text
+            Source content = normalizedMessage.getContent();
+            if (content != null) {
+                text = getTransformer().toString(content);
+            }
+        }
+        return text;
+    }
+    
+    protected String getHtml(MessageExchange exchange, NormalizedMessage normalizedMessage) throws MessagingException, TransformerException {
+        return (this.html != null) ? asString(this.html.evaluate(exchange, normalizedMessage)) : null;
+    }
+
+    protected Address asAddress(Object value) throws AddressException {
+        if (value instanceof Address) {
+            return (Address) value;
+        }
+        if (value instanceof String) {
+            return new InternetAddress((String) value);
+        }
+        if (value != null) {
+            throw new IllegalArgumentException("Expression does not evaluate to an Address. Is of type: " + value.getClass().getName() + " with value: " + value);
+        }
+        return null;
+    }
+
+    protected Date asDate(Object value) {
+        if (value instanceof Date) {
+            return (Date) value;
+        }
+        if (value instanceof String) {
+            String text = (String) value;
+            try {
+                return dateFormat.parse(text);
+            }
+            catch (ParseException e) {
+                throw new IllegalArgumentException("Invalid date format for: " + text + ". Reason: " + e);
+            }
+        }
+        if (value != null) {
+            throw new IllegalArgumentException("Expression does not evaluate to a Date. Is of type: " + value.getClass().getName() + " with value: " + value);
+
+        }
+        return null;
+    }
+
+    protected Address[] asAddressArray(Object value) throws AddressException {
+    	if (value instanceof String) {
+    		Address[] addresses = InternetAddress.parse((String)value);
+    		return addresses;
+    	}
+        if (value instanceof Address[]) {
+            return (Address[]) value;
+        }
+        if (value instanceof Collection) {
+            Collection collection = (Collection) value;
+            Address[] answer = new Address[collection.size()];
+            int i = 0;
+            for (Iterator iter = collection.iterator(); iter.hasNext();) {
+                answer[i++] = asAddress(iter.next());
+            }
+            return answer;
+        }
+        if (value != null) {
+            throw new IllegalArgumentException("Expression does not evaluate to an Address[]. Is of type: " + value.getClass().getName() + " with value: " + value);
+        }
+        return null;
+    }
+
+    protected Object asStringOrStringArray(Object value) {
+        if (value instanceof String) {
+            return value;
+        }
+        if (value instanceof String[]) {
+            return value;
+        }
+        if (value instanceof Collection) {
+            Collection collection = (Collection) value;
+            String[] answer = new String[collection.size()];
+            int i = 0;
+            for (Iterator iter = collection.iterator(); iter.hasNext();) {
+                answer[i++] = asString(iter.next());
+            }
+            return answer;
+        }
+        if (value != null) {
+            throw new IllegalArgumentException("Expression does not evaluate to a String[]. Is of type: " + value.getClass().getName() + " with value: " + value);
+        }
+        return null;
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/email/MimeMailMarshaler.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/email/MimeMailMarshaler.java
new file mode 100644
index 0000000..e5b16f2
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/email/MimeMailMarshaler.java
@@ -0,0 +1,296 @@
+/*
+ * 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.servicemix.components.email;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+import javax.activation.DataHandler;
+import javax.activation.DataSource;
+import javax.activation.FileDataSource;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.mail.Address;
+import javax.mail.BodyPart;
+import javax.mail.Message;
+import javax.mail.Multipart;
+import javax.mail.Part;
+import javax.mail.internet.AddressException;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
+import javax.xml.transform.TransformerException;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.jbi.jaxp.StringSource;
+
+/**
+ * The default marshaler from the {@link NormalizedMessage} to a Mime email using
+ * expressions for each field required on the email.
+ *
+ * @version $Revision: 472747 $
+ */
+public class MimeMailMarshaler extends MailMarshalerSupport {
+    private static Log log = LogFactory.getLog(MimeMailPoller.class);
+
+    /**
+     * Populates the MessageExchange with values extracted from the mail message using expressions.
+     *
+     * @param exchange          the JBI message exchange
+     * @param normalizedMessage the normalized message from JBI
+     * @param mimeMessage       the mime email
+     * @throws javax.mail.MessagingException if the message could not be constructed or there was an error creating an address
+     */
+	public void prepareExchange(MessageExchange exchange, NormalizedMessage normalizedMessage, MimeMessage mimeMessage) throws javax.mail.MessagingException {
+		String from     = InternetAddress.toString(mimeMessage.getFrom());
+		String to 		= InternetAddress.toString(mimeMessage.getRecipients(Message.RecipientType.TO));
+		String cc 		= InternetAddress.toString(mimeMessage.getRecipients(Message.RecipientType.CC));
+		String replyTo 	= InternetAddress.toString(mimeMessage.getReplyTo());
+		String sentDate = getDateFormat().format(mimeMessage.getSentDate());
+		String text = null;
+        String html = null;
+        MimeMultipart mp = null;
+        Object content = null;
+        Object subContent = null;
+        MimeMultipart subMP = null;
+
+		try {
+            content = mimeMessage.getContent();
+            if (content instanceof String)
+                // simple mail
+                text = asString(content);
+            else if (content instanceof MimeMultipart) {
+                // mail with attachment
+                mp = (MimeMultipart)content;
+                int nbMP = mp.getCount();
+                for (int i=0; i < nbMP; i++) {
+                    Part part = mp.getBodyPart(i);
+                    String disposition = part.getDisposition();
+                    if ((disposition != null) &&
+                        ((disposition.equals(Part.ATTACHMENT) ||
+                         (disposition.equals(Part.INLINE))))) {
+                        //Parts marked with a disposition of Part.ATTACHMENT from part.getDisposition() are clearly attachments
+                        DataHandler att = part.getDataHandler();
+                        normalizedMessage.addAttachment(att.getName(), att);
+                    } else {
+                        MimeBodyPart mbp = (MimeBodyPart)part;
+                        if (mbp.isMimeType("text/plain")) {
+                          // Handle plain
+                            text = (String)mbp.getContent();
+                        } else if (mbp.isMimeType("text/html")) {
+                          // Handle html contents
+                            html = (String)mbp.getContent();
+                        } else if (mbp.isMimeType("multipart/related")){
+                            // Special case for multipart/related message type
+                            subContent = mbp.getContent();
+                            if (subContent instanceof MimeMultipart) {
+                                subMP = (MimeMultipart)subContent;
+                                int nbsubMP = subMP.getCount();
+                                for (int j=0; j < nbsubMP; j++) {
+                                    MimeBodyPart subMBP = (MimeBodyPart)part;
+                                    // add a property into the normalize message
+                                    normalizedMessage.setProperty("org.apache.servicemix.email.alternativeContent" + j, subMBP.getContent());
+                                }
+                            }
+                        } else // strange mail...log a warning
+                            log.warn("Some mail contents can not be traited and is not include into message");
+                    }
+                }
+            } else { // strange mail...log a warning
+                log.warn("Some mail contents can not be traited and is not include into message");
+            }
+		} catch (MessagingException e) {
+			throw new javax.mail.MessagingException("Error while setting content on normalized message",e);
+		} catch (IOException e) {
+            throw new javax.mail.MessagingException("Error while fetching content",e);
+        }
+
+        normalizedMessage.setProperty("org.apache.servicemix.email.from", from);
+        normalizedMessage.setProperty("org.apache.servicemix.email.to", to);
+        normalizedMessage.setProperty("org.apache.servicemix.email.cc", cc);
+        normalizedMessage.setProperty("org.apache.servicemix.email.text", text);
+        normalizedMessage.setProperty("org.apache.servicemix.email.replyTo", replyTo);
+        normalizedMessage.setProperty("org.apache.servicemix.email.sentDate", sentDate);
+        normalizedMessage.setProperty("org.apache.servicemix.email.html", html);
+
+        try {
+            normalizedMessage.setContent(new StringSource(text));
+        } catch (MessagingException e) {
+            throw new javax.mail.MessagingException("Error while setting content on normalized message",e);
+        }
+	}
+
+    /**
+     * Populates the mime email message with values extracted from the message exchange using expressions.
+     *
+     * @param mimeMessage       the mime email
+     * @param exchange          the JBI message exchange
+     * @param normalizedMessage the normalized message from JBI
+     * @throws javax.mail.MessagingException if the message could not be constructed or there was an error creating an address
+     */
+    public void prepareMessage(MimeMessage mimeMessage, MessageExchange exchange, NormalizedMessage normalizedMessage) throws javax.mail.MessagingException {
+        try {
+            Address[] to = getTo(exchange, normalizedMessage);
+            if (to != null) {
+                mimeMessage.setRecipients(Message.RecipientType.TO, to);
+            }
+            Address[] cc = getCc(exchange, normalizedMessage);
+            if (cc != null) {
+                mimeMessage.setRecipients(Message.RecipientType.CC, cc);
+            }
+            Address[] bcc = getBcc(exchange, normalizedMessage);
+            if (bcc != null) {
+                mimeMessage.setRecipients(Message.RecipientType.BCC, bcc);
+            }
+            Address from = getFrom(exchange, normalizedMessage);
+            if (from != null) {
+                mimeMessage.setFrom(from);
+            }
+            String text = getText(exchange, normalizedMessage);
+            String html = getHtml(exchange, normalizedMessage);
+            if ((text != null) && (html == null)) {
+                mimeMessage.setText(text);
+            }
+            else if ((text != null) && (html != null)) {
+                MimeMultipart content = new MimeMultipart("alternative");
+                MimeBodyPart textBodyPart = new MimeBodyPart();
+                MimeBodyPart htmlBodyPart = new MimeBodyPart();
+                textBodyPart.setText(text);
+                htmlBodyPart.setContent(html, "text/html");
+                content.addBodyPart(textBodyPart);
+                content.addBodyPart(htmlBodyPart);
+
+                mimeMessage.setContent(content);
+            }
+            String subject = getSubject(exchange, normalizedMessage);
+            if (subject != null) {
+                mimeMessage.setSubject(subject);
+            }
+            Date sentDate = getSentDate(exchange, normalizedMessage);
+            if (sentDate != null) {
+                mimeMessage.setSentDate(sentDate);
+            }
+            Address[] replyTo = getReplyTo(exchange, normalizedMessage);
+            if (replyTo != null) {
+                mimeMessage.setReplyTo(replyTo);
+            }
+
+            // add attachment from message and properties
+            HashMap attachments = this.getAttachments(exchange, normalizedMessage);
+            if (attachments != null) {
+                Set attNames = attachments.keySet();
+                Iterator itAttNames = attNames.iterator();
+                if (itAttNames.hasNext()) { // there is at least one attachment
+                    // Create the message part
+                    BodyPart messageBodyPart = new MimeBodyPart();
+                    // Fill the message
+                    messageBodyPart.setText(text);
+                    // Create a Multipart
+                    Multipart multipart = new MimeMultipart();
+                    // Add part one
+                    multipart.addBodyPart(messageBodyPart);
+                    while (itAttNames.hasNext()) {
+                        String oneAttachmentName = (String)itAttNames.next();
+                        // Create another body part
+                        messageBodyPart = new MimeBodyPart();
+                        // Set the data handler to the attachment
+                        messageBodyPart.setDataHandler(new DataHandler((DataSource)attachments.get(oneAttachmentName)));
+                        // Set the filename
+                        messageBodyPart.setFileName(oneAttachmentName);
+                        // Set Disposition
+                        messageBodyPart.setDisposition(Part.ATTACHMENT);
+                        // Add part to multipart
+                        multipart.addBodyPart(messageBodyPart);
+                    }
+                    // Put parts in message
+                    mimeMessage.setContent(multipart);
+                 }
+            }
+        }
+        catch (MessagingException e) {
+            throw new javax.mail.MessagingException(e.getMessage(), e);
+        }
+        catch (TransformerException e) {
+            throw new javax.mail.MessagingException(e.getMessage(), e);
+        }
+    }
+
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+    protected Address getFrom(MessageExchange exchange, NormalizedMessage normalizedMessage) throws MessagingException, AddressException {
+        return asAddress(getFrom().evaluate(exchange, normalizedMessage));
+    }
+
+    protected Address[] getTo(MessageExchange exchange, NormalizedMessage normalizedMessage) throws MessagingException, AddressException {
+        return asAddressArray(getTo().evaluate(exchange, normalizedMessage));
+    }
+
+    protected Address[] getCc(MessageExchange exchange, NormalizedMessage normalizedMessage) throws MessagingException, AddressException {
+        return asAddressArray(getCc().evaluate(exchange, normalizedMessage));
+    }
+
+    protected Address[] getBcc(MessageExchange exchange, NormalizedMessage normalizedMessage) throws MessagingException, AddressException {
+        return asAddressArray(getBcc().evaluate(exchange, normalizedMessage));
+    }
+
+    protected Address[] getReplyTo(MessageExchange exchange, NormalizedMessage normalizedMessage) throws MessagingException, AddressException {
+        return asAddressArray(getReplyTo().evaluate(exchange, normalizedMessage));
+    }
+
+    protected HashMap getAttachments(MessageExchange exchange, NormalizedMessage normalizedMessage) {
+        HashMap attachments = new HashMap();
+        String filePath = "";
+        String oneAttachmentName = "";
+        try {
+            // get attachment from property org.apache.servicemix.email.attachment
+            String listAttachment = (String)getAttachments().evaluate(exchange, normalizedMessage);
+            if (StringUtils.isNotBlank(listAttachment)) {
+                StringTokenizer st = new StringTokenizer(listAttachment, ",");
+                if (st != null) {
+                    while (st.hasMoreTokens()) {
+                        filePath = st.nextToken();
+                        File file = new File(filePath);
+                        attachments.put(file.getName(), new FileDataSource(file));
+                    }
+                }
+            }
+        } catch (MessagingException e) {
+            log.warn("file not found for attachment : " + e.getMessage() + " : " + filePath);
+        }
+        // get attachment from Normalize Message
+        Set attNames = normalizedMessage.getAttachmentNames();
+        Iterator itAttNames = attNames.iterator();
+        while (itAttNames.hasNext()) {
+            oneAttachmentName = (String)itAttNames.next();
+            DataSource oneAttchmentInputString = normalizedMessage.getAttachment(oneAttachmentName).getDataSource();
+            attachments.put(oneAttachmentName, oneAttchmentInputString);
+        }
+
+        return attachments;
+    }
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/email/MimeMailPoller.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/email/MimeMailPoller.java
new file mode 100644
index 0000000..6e61120
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/email/MimeMailPoller.java
@@ -0,0 +1,233 @@
+/*
+ * 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.servicemix.components.email;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.DeliveryChannel;
+import javax.jbi.messaging.InOnly;
+import javax.jbi.messaging.MessageExchangeFactory;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.mail.Flags;
+import javax.mail.Folder;
+import javax.mail.Session;
+import javax.mail.Store;
+import javax.mail.internet.MimeMessage;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.components.util.PollingComponentSupport;
+
+/**
+ * A polling component which looks for emails in a mail server and sends them
+ * into the JBI bus as messages, deleting the messages by default when they
+ * are processed.
+ * 
+ * @version $Revision: 426415 $
+ */
+public class MimeMailPoller extends PollingComponentSupport {
+	
+	private static Log log = LogFactory.getLog(MimeMailPoller.class);
+	
+	private Session session;
+	private String hostName;
+	private String userName;
+	private String password;
+	private String mailBox;
+	private boolean debug;
+	private int maxFetchSize = 5;
+	private MimeMailMarshaler marshaler = new MimeMailMarshaler();
+
+	protected void init() throws JBIException {
+		super.init();
+		if (session == null)  {
+			log.debug("No Session informed. Using default instance");
+			this.session = Session.getDefaultInstance(System.getProperties());
+		}
+		if (mailBox == null) {
+			log.debug("No mailbox informed. Using INBOX");
+			mailBox = "INBOX";
+		}
+		if (hostName == null) {
+			throw new JBIException("HostName not informed");
+		}
+		if (userName == null) {
+			throw new JBIException("UserName not informed");
+		}
+		if (password == null) {
+			throw new JBIException("Password not informed");
+		}
+		if (maxFetchSize < 1) {
+			throw new JBIException("Fetch Size must be at least 1");
+		}
+
+	}
+	
+	/**
+	 * @return Returns the hostName.
+	 */
+	public String getHostName() {
+		return hostName;
+	}
+
+	/**
+	 * @param hostName The hostName to set.
+	 */
+	public void setHostName(String hostName) {
+		this.hostName = hostName;
+	}
+
+	/**
+	 * @return Returns the marshaler.
+	 */
+	public MimeMailMarshaler getMarshaler() {
+		return marshaler;
+	}
+
+	/**
+	 * @param marshaler The marshaler to set.
+	 */
+	public void setMarshaler(MimeMailMarshaler marshaler) {
+		this.marshaler = marshaler;
+	}
+
+	public void poll() throws Exception {
+		Store store = null;
+		Folder folder = null;
+		try {
+			session.setDebug(isDebug());
+			store = session.getStore((mailBox.equals("INBOX")) ? "pop3"
+					: "imap");
+			store.connect(hostName, userName, password);
+			folder = store.getFolder(mailBox);
+			if (folder == null || !folder.exists()) {
+				throw new Exception("Folder not found or invalid: " + mailBox);
+			}
+			folder.open(Folder.READ_WRITE);
+			int msgCount = Math.min(folder.getMessageCount(),maxFetchSize);
+			DeliveryChannel channel = getDeliveryChannel();
+			MessageExchangeFactory mef = getExchangeFactory();
+		    for(int i=1; i <= msgCount;i++) {
+		    	MimeMessage mailMsg = (MimeMessage) folder.getMessage(i);
+		    	InOnly io = mef.createInOnlyExchange();
+		    	NormalizedMessage normalizedMessage = io.createMessage();
+		    	this.marshaler.prepareExchange(io,normalizedMessage,mailMsg);
+		    	io.setInMessage(normalizedMessage);
+		    	channel.send(io);
+		        mailMsg.setFlag(Flags.Flag.DELETED,true);
+		    }
+		} finally {
+			try {
+				if (folder != null) {
+					folder.close(true);
+				}
+				if (store != null) {
+					store.close();
+				}
+			} catch (Exception ignored) {}
+		}
+	}
+
+	/**
+	 * @return Returns the debug.
+	 */
+	public boolean isDebug() {
+		return debug;
+	}
+
+	/**
+	 * @param debug
+	 *            The debug to set.
+	 */
+	public void setDebug(boolean debug) {
+		this.debug = debug;
+	}
+
+	/**
+	 * @return Returns the mailBox.
+	 */
+	public String getMailBox() {
+		return mailBox;
+	}
+
+	/**
+	 * @param mailBox
+	 *            The mailBox to set.
+	 */
+	public void setMailBox(String mailBox) {
+		this.mailBox = mailBox;
+	}
+
+	/**
+	 * @return Returns the password.
+	 */
+	public String getPassword() {
+		return password;
+	}
+
+	/**
+	 * @param password
+	 *            The password to set.
+	 */
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	/**
+	 * @return Returns the userName.
+	 */
+	public String getUserName() {
+		return userName;
+	}
+
+	/**
+	 * @param userName
+	 *            The userName to set.
+	 */
+	public void setUserName(String userName) {
+		this.userName = userName;
+	}
+
+	/**
+	 * @return Returns the session.
+	 */
+	public Session getSession() {
+		return session;
+	}
+
+	/**
+	 * @param session
+	 *            The session to set.
+	 */
+	public void setSession(Session session) {
+		this.session = session;
+	}
+
+	/**
+	 * @return Returns the maxFetchSize.
+	 */
+	public int getMaxFetchSize() {
+		return maxFetchSize;
+	}
+
+	/**
+	 * @param maxFetchSize The maxFetchSize to set.
+	 */
+	public void setMaxFetchSize(int maxFetchSize) {
+		this.maxFetchSize = maxFetchSize;
+	}
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/email/MimeMailSender.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/email/MimeMailSender.java
new file mode 100644
index 0000000..166d585
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/email/MimeMailSender.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.servicemix.components.email;
+
+import org.apache.servicemix.components.util.OutBinding;
+import org.springframework.mail.javamail.JavaMailSender;
+import org.springframework.mail.javamail.MimeMessagePreparator;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeMessage;
+
+/**
+ * An outbound component capable of sending MIME email via
+ * <a href="http://java.sun.com/products/javamail/">JavaMail</a>
+ *
+ * @version $Revision: 426415 $
+ */
+public class MimeMailSender extends OutBinding {
+    private JavaMailSender sender;
+    private MimeMailMarshaler marshaler = new MimeMailMarshaler();
+
+    // Properties
+    //-------------------------------------------------------------------------
+    public JavaMailSender getSender() {
+        return sender;
+    }
+
+    public void setSender(JavaMailSender sender) {
+        this.sender = sender;
+    }
+
+    public MimeMailMarshaler getMarshaler() {
+        return marshaler;
+    }
+
+    public void setMarshaler(MimeMailMarshaler marshaler) {
+        this.marshaler = marshaler;
+    }
+
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+    protected void init() throws JBIException {
+        super.init();
+        if (sender == null) {
+            throw new JBIException("You must configure the sender property");
+        }
+    }
+
+    protected void process(final MessageExchange exchange, final NormalizedMessage message) throws Exception {
+        MimeMessagePreparator preparator = new MimeMessagePreparator() {
+            public void prepare(MimeMessage mimeMessage) throws MessagingException {
+                marshaler.prepareMessage(mimeMessage, exchange, message);
+            }
+        };
+        sender.send(preparator);
+        done(exchange);
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/email/SimpleMailMarshaler.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/email/SimpleMailMarshaler.java
new file mode 100644
index 0000000..3909f99
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/email/SimpleMailMarshaler.java
@@ -0,0 +1,127 @@
+/*
+ * 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.servicemix.components.email;
+
+import java.util.Date;
+
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.mail.internet.AddressException;
+import javax.xml.transform.TransformerException;
+
+import org.springframework.mail.SimpleMailMessage;
+
+/**
+ * The default marshaler from the {@link NormalizedMessage} to a {@link SimpleMailMessage} using
+ * expressions for each field required on the email.
+ *
+ * @version $Revision: 429277 $
+ */
+public class SimpleMailMarshaler extends MailMarshalerSupport{
+
+    /**
+     * Populates the mime email message with values extracted from the message exchange using expressions.
+     *
+     * @param mailMessage       the mime email
+     * @param exchange          the JBI message exchange
+     * @param normalizedMessage the normalized message from JBI
+     * @throws javax.mail.MessagingException if the message could not be constructed or there was an error creating an address
+     */
+    public void prepareMessage(SimpleMailMessage mailMessage, MessageExchange exchange, NormalizedMessage normalizedMessage) throws javax.mail.MessagingException {
+        try {
+            Object to = getTo(exchange, normalizedMessage);
+            if (to != null) {
+                if (to instanceof String) {
+                    mailMessage.setTo((String) to);
+                }
+                else {
+                    mailMessage.setTo((String[]) to);
+                }
+            }
+            Object cc = getCc(exchange, normalizedMessage);
+            if (cc != null) {
+                if (cc instanceof String) {
+                    mailMessage.setCc((String) cc);
+                }
+                else {
+                    mailMessage.setCc((String[]) cc);
+                }
+            }
+            Object bcc = getBcc(exchange, normalizedMessage);
+            if (bcc != null) {
+                if (bcc instanceof String) {
+                    mailMessage.setBcc((String) bcc);
+                }
+                else {
+                    mailMessage.setBcc((String[]) bcc);
+                }
+            }
+            String from = getFrom(exchange, normalizedMessage);
+            if (from != null) {
+                mailMessage.setFrom(from);
+            }
+            String replyTo = getReplyTo(exchange, normalizedMessage);
+            if (replyTo != null) {
+                mailMessage.setReplyTo(replyTo);
+            }
+
+            String text = getText(exchange, normalizedMessage);
+            if (text != null) {
+                mailMessage.setText(text);
+            }
+            String subject = getSubject(exchange, normalizedMessage);
+            if (subject != null) {
+                mailMessage.setSubject(subject);
+            }
+            Date sentDate = getSentDate(exchange, normalizedMessage);
+            if (sentDate != null) {
+                mailMessage.setSentDate(sentDate);
+            }
+        }
+        catch (MessagingException e) {
+            throw new javax.mail.MessagingException(e.getMessage(), e);
+        }
+        catch (TransformerException e) {
+            throw new javax.mail.MessagingException(e.getMessage(), e);
+        }
+    }
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+    protected String getFrom(MessageExchange exchange, NormalizedMessage normalizedMessage) throws MessagingException, AddressException {
+        return asString(getFrom().evaluate(exchange, normalizedMessage));
+    }
+
+    protected String getReplyTo(MessageExchange exchange, NormalizedMessage normalizedMessage) throws MessagingException {
+        return asString(getReplyTo().evaluate(exchange, normalizedMessage));
+    }
+
+    protected Object getTo(MessageExchange exchange, NormalizedMessage normalizedMessage) throws MessagingException, AddressException {
+        return asStringOrStringArray(getTo().evaluate(exchange, normalizedMessage));
+    }
+
+    protected Object getCc(MessageExchange exchange, NormalizedMessage normalizedMessage) throws MessagingException, AddressException {
+        return asStringOrStringArray(getCc().evaluate(exchange, normalizedMessage));
+    }
+
+    protected Object getBcc(MessageExchange exchange, NormalizedMessage normalizedMessage) throws MessagingException, AddressException {
+        return asStringOrStringArray(getBcc().evaluate(exchange, normalizedMessage));
+    }
+
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/email/SimpleMailSender.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/email/SimpleMailSender.java
new file mode 100644
index 0000000..3c4e6ad
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/email/SimpleMailSender.java
@@ -0,0 +1,69 @@
+/*
+ * 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.servicemix.components.email;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.NormalizedMessage;
+
+import org.apache.servicemix.components.util.OutBinding;
+import org.springframework.mail.MailSender;
+import org.springframework.mail.SimpleMailMessage;
+
+/**
+ * An outbound component capable of sending simple email using Spring
+ *
+ * @version $Revision: 426415 $
+ */
+public class SimpleMailSender extends OutBinding {
+    private MailSender sender;
+    private SimpleMailMarshaler marshaler = new SimpleMailMarshaler();
+
+    // Properties
+    //-------------------------------------------------------------------------
+    public MailSender getSender() {
+        return sender;
+    }
+
+    public void setSender(MailSender sender) {
+        this.sender = sender;
+    }
+
+    public SimpleMailMarshaler getMarshaler() {
+        return marshaler;
+    }
+
+    public void setMarshaler(SimpleMailMarshaler marshaler) {
+        this.marshaler = marshaler;
+    }
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+    protected void init() throws JBIException {
+        super.init();
+        if (sender == null) {
+            throw new JBIException("You must configure the sender property");
+        }
+    }
+
+    protected void process(final MessageExchange exchange, final NormalizedMessage message) throws Exception {
+        SimpleMailMessage email = new SimpleMailMessage();
+        marshaler.prepareMessage(email, exchange, message);
+        sender.send(email);
+        done(exchange);
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/email/package.html b/common/servicemix-components/src/main/java/org/apache/servicemix/components/email/package.html
new file mode 100644
index 0000000..f2697cb
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/email/package.html
@@ -0,0 +1,27 @@
+<!--
+
+    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.
+
+-->
+<html>
+<head>
+</head>
+<body>
+
+An outbound component capable of sending email via <a href="http://java.sun.com/products/javamail/">JavaMail</a>
+
+</body>
+</html>
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/file/FilePoller.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/file/FilePoller.java
new file mode 100644
index 0000000..8eda967
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/file/FilePoller.java
@@ -0,0 +1,243 @@
+/*
+ * 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.servicemix.components.file;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.components.util.DefaultFileMarshaler;
+import org.apache.servicemix.components.util.FileMarshaler;
+import org.apache.servicemix.components.util.PollingComponentSupport;
+import org.apache.servicemix.jbi.util.FileUtil;
+
+import java.util.concurrent.CopyOnWriteArraySet;
+
+import javax.jbi.JBIException;
+import javax.jbi.management.DeploymentException;
+import javax.jbi.messaging.InOnly;
+import javax.jbi.messaging.NormalizedMessage;
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Set;
+
+/**
+ * A polling component which looks for a file or files in a directory
+ * and sends the files into the JBI bus as messages, deleting the files
+ * by default when they are processed.
+ *
+ * @version $Revision: 666120 $
+ */
+public class FilePoller extends PollingComponentSupport {
+    private static final Log log = LogFactory.getLog(FilePoller.class);
+
+    private File archive;
+    private File file;
+    private FileFilter filter;
+    private boolean deleteFile = true;
+    private boolean recursive = true;
+    private boolean autoCreateDirectory = true;
+    private FileMarshaler marshaler = new DefaultFileMarshaler();
+    private Set workingSet = new CopyOnWriteArraySet();
+
+    public void poll() throws Exception {
+        pollFileOrDirectory(file);
+    }
+
+    // Properties
+    //-------------------------------------------------------------------------
+    public File getFile() {
+        return file;
+    }
+
+    /**
+     * Sets the file to poll, which can be a directory or a file.
+     *
+     * @param file
+     */
+    public void setFile(File file) {
+        this.file = file;
+    }
+
+    public FileFilter getFilter() {
+        return filter;
+    }
+
+    /**
+     * Sets the optional filter to choose which files to process
+     */
+    public void setFilter(FileFilter filter) {
+        this.filter = filter;
+    }
+
+    /**
+     * Returns whether or not we should delete the file when its processed
+     */
+    public boolean isDeleteFile() {
+        return deleteFile;
+    }
+
+    public void setDeleteFile(boolean deleteFile) {
+        this.deleteFile = deleteFile;
+    }
+
+    public boolean isRecursive() {
+        return recursive;
+    }
+
+    public void setRecursive(boolean recursive) {
+        this.recursive = recursive;
+    }
+
+    public boolean isAutoCreateDirectory() {
+        return autoCreateDirectory;
+    }
+
+    public void setAutoCreateDirectory(boolean autoCreateDirectory) {
+        this.autoCreateDirectory = autoCreateDirectory;
+    }
+
+    public FileMarshaler getMarshaler() {
+        return marshaler;
+    }
+
+    public void setMarshaler(FileMarshaler marshaler) {
+        this.marshaler = marshaler;
+    }
+    
+    public File getArchive() {
+        return archive;
+    }
+    
+    /**
+     * Configure a directory to archive files before deleting them.
+     * 
+     * @param archive the archive directory
+     */
+    public void setArchive(File archive) {
+        this.archive = archive;
+    }
+
+    /**
+     * The set of FTPFiles that this component is currently working on
+     *
+     * @return
+     */
+    public Set getWorkingSet() {
+        return workingSet;
+    }
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+    protected void init() throws JBIException {
+        if (file == null) {
+            throw new IllegalArgumentException("You must specify a file property");
+        }
+        if (isAutoCreateDirectory() && !file.exists()) {
+            file.mkdirs();
+        }
+        if (archive != null) {
+            if (!deleteFile) {
+                throw new DeploymentException("Archive shouldn't be specified unless deleteFile='true'");
+            }
+            if (isAutoCreateDirectory() && !archive.exists()) {
+                archive.mkdirs();
+            }
+            if (!archive.isDirectory()) {
+                throw new DeploymentException("Archive should refer to a directory");
+            }
+        }
+        super.init();
+    }
+
+    protected void pollFileOrDirectory(File fileOrDirectory) {
+    	pollFileOrDirectory(fileOrDirectory, true);
+    }
+    
+    protected void pollFileOrDirectory(File fileOrDirectory, boolean processDir) {
+        if (!fileOrDirectory.isDirectory()) {
+            pollFile(fileOrDirectory); // process the file
+        } else if (processDir) {
+            log.debug("Polling directory " + fileOrDirectory);
+            File[] files = fileOrDirectory.listFiles(getFilter());
+            for (int i = 0; i < files.length; i++) {
+                pollFileOrDirectory(files[i], isRecursive()); // self-recursion
+            }
+        } else {
+            log.debug("Skipping directory " + fileOrDirectory);
+        } 
+    }
+
+    protected void pollFile(final File aFile) {
+        if (workingSet.add(aFile)) {
+            if (log.isDebugEnabled()) {
+                log.debug("Scheduling file " + aFile + " for processing");
+            }
+            getExecutor().execute(new Runnable() {
+                public void run() {
+                    try {
+                        processFileAndDelete(aFile);
+                    } finally {
+                        workingSet.remove(aFile);
+                    }
+                }
+            });
+        }
+    }
+
+    protected void processFileAndDelete(File aFile) {
+        try {
+            if (log.isDebugEnabled()) {
+                log.debug("Processing file " + aFile);
+            }
+            if (aFile.exists()) {
+                processFile(aFile);
+                if (isDeleteFile()) {
+                    if (archive != null) {
+                        FileUtil.moveFile(aFile, archive);
+                    } else {
+                        if (!aFile.delete()) {
+                            throw new IOException("Could not delete file " + aFile);
+                        }
+                    }
+                }
+            }
+        }
+        catch (Exception e) {
+            log.error("Failed to process file: " + aFile + ". Reason: " + e, e);
+        }
+    }
+
+    protected void processFile(File aFile) throws Exception {
+        InputStream in = null;
+        try {
+            String name = aFile.getCanonicalPath();
+            in = new BufferedInputStream(new FileInputStream(aFile));
+            InOnly exchange = getExchangeFactory().createInOnlyExchange();
+            NormalizedMessage message = exchange.createMessage();
+            exchange.setInMessage(message);
+            marshaler.readMessage(exchange, message, in, name);
+            getDeliveryChannel().sendSync(exchange);
+        } finally {
+            if (in != null) {
+                in.close();
+            }
+        }
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/file/FileWriter.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/file/FileWriter.java
new file mode 100644
index 0000000..bbeefe9
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/file/FileWriter.java
@@ -0,0 +1,135 @@
+/*
+ * 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.servicemix.components.file;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.components.util.DefaultFileMarshaler;
+import org.apache.servicemix.components.util.FileMarshaler;
+import org.apache.servicemix.components.util.OutBinding;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.NormalizedMessage;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * A component which receives a message and writes the content to a file using the
+ * <a href="http://jakarta.apache.org/commons/vfs.html">Jakarta Commons VFS</a> library
+ * for handling various file systems like files, Samba, WebDAV, FTP, SFTP and temporary files.
+ *
+ * @version $Revision: 426415 $
+ */
+public class FileWriter extends OutBinding {
+    private static final Log log = LogFactory.getLog(FileWriter.class);
+
+    private File directory;
+    private FileMarshaler marshaler = new DefaultFileMarshaler();
+    private String tempFilePrefix = "servicemix-";
+    private String tempFileSuffix = ".xml";
+    private boolean autoCreateDirectory = true;
+
+    // Properties
+    //-------------------------------------------------------------------------
+    public File getDirectory() {
+        return directory;
+    }
+
+    public void setDirectory(File directory) {
+        this.directory = directory;
+    }
+
+    public FileMarshaler getMarshaler() {
+        return marshaler;
+    }
+
+    public void setMarshaler(FileMarshaler marshaler) {
+        this.marshaler = marshaler;
+    }
+
+    public String getTempFilePrefix() {
+        return tempFilePrefix;
+    }
+
+    public void setTempFilePrefix(String tempFilePrefix) {
+        this.tempFilePrefix = tempFilePrefix;
+    }
+
+    public String getTempFileSuffix() {
+        return tempFileSuffix;
+    }
+
+    public void setTempFileSuffix(String tempFileSuffix) {
+        this.tempFileSuffix = tempFileSuffix;
+    }
+
+    public boolean isAutoCreateDirectory() {
+        return autoCreateDirectory;
+    }
+
+    public void setAutoCreateDirectory(boolean autoCreateDirectory) {
+        this.autoCreateDirectory = autoCreateDirectory;
+    }
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+    protected void init() throws JBIException {
+        if (directory == null) {
+            throw new IllegalArgumentException("You must specify the directory property");
+        }
+        if (isAutoCreateDirectory()) {
+            directory.mkdirs();
+        }
+        if (!directory.isDirectory()) {
+            throw new IllegalArgumentException("The directory property must be a directory but was: " + directory);
+        }
+
+        super.init();
+    }
+
+    protected void process(MessageExchange exchange, NormalizedMessage message) throws Exception {
+        OutputStream out = null;
+        try {
+            String name = marshaler.getOutputName(exchange, message);
+            File newFile = null;
+            if (name == null) {
+                newFile = File.createTempFile(tempFilePrefix, tempFileSuffix, directory);
+            }
+            else {
+                newFile = new File(directory, name);
+            }
+            out = new BufferedOutputStream(new FileOutputStream(newFile));
+            marshaler.writeMessage(exchange, message, out, name);
+            done(exchange);
+        }
+        finally {
+            if (out != null) {
+                try {
+                    out.close();
+                }
+                catch (IOException e) {
+                    log.error("Caught exception while closing stream on error: " + e, e);
+                }
+            }
+        }
+    }
+}
+
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/file/package.html b/common/servicemix-components/src/main/java/org/apache/servicemix/components/file/package.html
new file mode 100644
index 0000000..350f261
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/file/package.html
@@ -0,0 +1,27 @@
+<!--
+
+    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.
+
+-->
+<html>
+<head>
+</head>
+<body>
+
+A collection of file system components capable of polling for files in a directory or writing messages to files.
+
+</body>
+</html>
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/groovy/GroovyComponent.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/groovy/GroovyComponent.java
new file mode 100644
index 0000000..e4c0116
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/groovy/GroovyComponent.java
@@ -0,0 +1,87 @@
+/*
+ * 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.servicemix.components.groovy;
+
+import groovy.xml.DOMBuilder;
+
+import org.apache.servicemix.components.script.ScriptComponent;
+
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.script.Bindings;
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+/**
+ * A component which is capable of invoking a <a href="http://groovy.codehaus.org/">Groovy</a> script to process
+ * or transform a message.
+ *
+ * @version $Revision: 495362 $
+ */
+public class GroovyComponent extends ScriptComponent {
+
+    private DocumentBuilderFactory documentBuilderFactory;
+    private DocumentBuilder documentBuilder;
+
+    public GroovyComponent() {
+        setScriptEngineName("groovy");
+    }
+
+    public GroovyComponent(QName service, String endpoint) {
+        super(service, endpoint);
+        setScriptEngineName("groovy");
+    }
+
+    public DocumentBuilder getDocumentBuilder() throws ParserConfigurationException {
+        if (documentBuilder == null) {
+            documentBuilder = getDocumentBuilderFactory().newDocumentBuilder();
+        }
+        return documentBuilder;
+    }
+
+    public void setDocumentBuilder(DocumentBuilder documentBuilder) {
+        this.documentBuilder = documentBuilder;
+    }
+
+    public DocumentBuilderFactory getDocumentBuilderFactory() {
+        if (documentBuilderFactory == null) {
+            documentBuilderFactory = DocumentBuilderFactory.newInstance();
+        }
+        return documentBuilderFactory;
+    }
+
+    public void setDocumentBuilderFactory(DocumentBuilderFactory documentBuilderFactory) {
+        this.documentBuilderFactory = documentBuilderFactory;
+    }
+
+    protected void populateBindings(Bindings bindings, MessageExchange exchange, NormalizedMessage in, NormalizedMessage out) throws MessagingException {
+        try {
+            super.populateBindings(bindings, exchange, in, out);
+
+            // lets output a builder
+            DocumentBuilder documentBuilder = getDocumentBuilder();
+            bindings.put("builder", new DOMBuilder(documentBuilder));
+        }
+        catch (ParserConfigurationException e) {
+            throw new MessagingException("Failed to create DOM DocumentBuilder: " + e, e);
+        }
+    }
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/groovy/GroovyMarshaler.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/groovy/GroovyMarshaler.java
new file mode 100644
index 0000000..e72374d
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/groovy/GroovyMarshaler.java
@@ -0,0 +1,44 @@
+/*
+ * 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.servicemix.components.groovy;
+
+import org.apache.servicemix.jbi.messaging.DefaultMarshaler;
+import org.apache.servicemix.jbi.messaging.PojoMarshaler;
+
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.jbi.messaging.MessagingException;
+
+import groovy.lang.GString;
+
+/**
+ * A {@link PojoMarshaler} capable of handling <a href="http://groovy.codehaus.org/">Groovy</a>
+ * specific types.
+ *
+ * @version $Revision: 426415 $
+ */
+public class GroovyMarshaler extends DefaultMarshaler {
+
+    public void marshal(MessageExchange exchange, NormalizedMessage message, Object body) throws MessagingException {
+        if (body instanceof GString) {
+            body = body.toString();
+        }
+
+        // TODO handle Node
+        super.marshal(exchange, message, body);
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/groovy/JBIModule.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/groovy/JBIModule.java
new file mode 100644
index 0000000..d3f3d2e
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/groovy/JBIModule.java
@@ -0,0 +1,25 @@
+/*
+ * 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.servicemix.components.groovy;
+
+/**
+ * A Groovy module of helper methods to make JBI more groovy.
+ *
+ * @version $Revision: 426415 $
+ */
+public class JBIModule {
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/groovy/package.html b/common/servicemix-components/src/main/java/org/apache/servicemix/components/groovy/package.html
new file mode 100644
index 0000000..c578c78
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/groovy/package.html
@@ -0,0 +1,27 @@
+<!--
+
+    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.
+
+-->
+<html>
+<head>
+</head>
+<body>
+
+A component and support classes for the <a href="http://groovy.codehaus.org/">Groovy</a> scripting language.
+
+</body>
+</html>
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/BindingServlet.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/BindingServlet.java
new file mode 100644
index 0000000..bcf9ab8
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/BindingServlet.java
@@ -0,0 +1,88 @@
+/*
+ * 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.servicemix.components.http;
+
+import javax.jbi.JBIException;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import java.io.IOException;
+
+/**
+ * A Servlet which dispatches requests into the JBI container and returns the result.
+ *
+ * @version $Revision: 426415 $
+ */
+public class BindingServlet extends HttpServlet {
+
+    private HttpBinding binding;
+
+    /**
+     * get da binding
+     *
+     * @return the binding
+     */
+    public HttpBinding getBinding() {
+        return binding;
+    }
+
+    public void setBinding(HttpBinding binding) {
+        this.binding = binding;
+    }
+
+
+    public void init(ServletConfig config) throws ServletException {
+        super.init(config);
+        if (binding == null) {
+            binding = (HttpBinding) getServletContext().getAttribute("binding");
+            if (binding == null) {
+                binding = createHttpBinding(config);
+            }
+                if (binding == null) {
+                throw new ServletException("No binding property available on the servlet context");
+            }
+        }
+    }
+
+    
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+        try {
+            getBinding().process(request, response);
+        }
+        catch (JBIException e) {
+            throw new ServletException("Failed to process JBI request: " + e, e);
+        }
+    }
+
+    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+        try {
+            getBinding().process(request, response);
+        }
+        catch (JBIException e) {
+            throw new ServletException("Failed to process JBI request: " + e, e);
+        }
+    }
+
+    protected HttpBinding createHttpBinding(ServletConfig config) throws ServletException {
+        // lets default to in/out
+        return new HttpInOutBinding();
+    }
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpBinding.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpBinding.java
new file mode 100644
index 0000000..8debfe5
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpBinding.java
@@ -0,0 +1,41 @@
+/*
+ * 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.servicemix.components.http;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.jbi.JBIException;
+import java.io.IOException;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public interface HttpBinding {
+
+    /**
+     * Invokes the HTTP request from a servlet
+     * 
+     * @param request
+     * @param response
+     * @throws ServletException
+     * @throws IOException
+     * @throws JBIException
+     */
+    void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException,
+            JBIException;
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpBindingSupport.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpBindingSupport.java
new file mode 100644
index 0000000..9ae25a3
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpBindingSupport.java
@@ -0,0 +1,73 @@
+/*
+ * 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.servicemix.components.http;
+
+import org.apache.servicemix.components.util.ComponentSupport;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.ServletException;
+import javax.jbi.JBIException;
+import javax.jbi.messaging.NormalizedMessage;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+
+/**
+ * @version $Revision: 449651 $
+ */
+public abstract class HttpBindingSupport extends ComponentSupport implements HttpBinding {
+    protected static final int BAD_REQUEST_STATUS_CODE = HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
+    private HttpMarshaler marshaler;
+
+    public HttpMarshaler getMarshaler() {
+        if (marshaler == null) {
+            marshaler = createMarshaler();
+        }
+        return marshaler;
+    }
+
+    public void setMarshaler(HttpMarshaler marshaler) {
+        this.marshaler = marshaler;
+    }
+
+    public abstract void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException,
+            JBIException;
+
+    /**
+     * A factory method used to create the default {@link HttpMarshaler} to be used to turn the request into a
+     * {@link NormalizedMessage} and to turn a normalized message into a response.
+     *
+     * @return the newly created marshaler
+     */
+    protected HttpMarshaler createMarshaler() {
+      return new HttpMarshaler();
+    }
+
+    protected void outputException(HttpServletResponse response, Exception e) throws IOException {
+        response.setStatus(BAD_REQUEST_STATUS_CODE);
+        PrintWriter writer = null;
+        try {
+            writer = response.getWriter();
+        } catch (IllegalStateException ise) {
+            OutputStream os = response.getOutputStream();
+            writer = new PrintWriter (os);
+        }
+        writer.println("Request failed with error: " + e);
+        e.printStackTrace(writer);
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpClientMarshaler.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpClientMarshaler.java
new file mode 100644
index 0000000..9ed72a4
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpClientMarshaler.java
@@ -0,0 +1,144 @@
+/*
+ * 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.servicemix.components.http;
+
+import org.apache.commons.httpclient.Header;
+import org.apache.commons.httpclient.HttpMethod;
+import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.methods.StringRequestEntity;
+import org.apache.servicemix.jbi.jaxp.SourceTransformer;
+import org.apache.servicemix.jbi.jaxp.StringSource;
+
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.transform.Source;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.stream.StreamSource;
+
+import java.util.Iterator;
+
+/**
+ * A class which marshalls a client HTTP request to a NMS message
+ *
+ * @version $Revision: 426415 $
+ */
+public class HttpClientMarshaler {
+
+    protected SourceTransformer sourceTransformer;
+    private boolean streaming;
+    private String contentType = "text/xml";
+
+    public HttpClientMarshaler() {
+        this(false);
+    }
+    
+    public HttpClientMarshaler(boolean streaming) {
+        this.sourceTransformer = new SourceTransformer();
+        this.streaming = streaming;
+    }
+
+    /**
+     * @return the streaming
+     */
+    public boolean isStreaming() {
+        return streaming;
+    }
+
+    /**
+     * @param streaming the streaming to set
+     */
+    public void setStreaming(boolean streaming) {
+        this.streaming = streaming;
+    }
+
+    /**
+     * @return the contentType
+     */
+    public String getContentType() {
+        return contentType;
+    }
+
+    /**
+     * @param contentType the contentType to set
+     */
+    public void setContentType(String contentType) {
+        this.contentType = contentType;
+    }
+
+    public void toNMS(NormalizedMessage normalizedMessage, HttpMethod method) throws Exception {
+        addNmsProperties(normalizedMessage, method);
+        if (streaming) {
+            normalizedMessage.setContent(new StreamSource(method.getResponseBodyAsStream()));
+        } else {
+            normalizedMessage.setContent(new StringSource(method.getResponseBodyAsString()));
+        }
+    }
+
+    public void fromNMS(PostMethod method, MessageExchange exchange, NormalizedMessage normalizedMessage) throws Exception, TransformerException {
+        addHttpHeaders(method, normalizedMessage);
+        if (streaming) {
+            method.setContentChunked(true);
+            Source src = normalizedMessage.getContent();
+            if (src instanceof StreamSource && ((StreamSource) src).getInputStream() != null) {
+                method.setRequestEntity(new InputStreamRequestEntity(
+                        ((StreamSource) src).getInputStream(), -1));
+            } else {
+                String text = sourceTransformer.toString(normalizedMessage.getContent());
+                method.setRequestEntity(new StringRequestEntity(text));
+                
+            }
+        } else {
+            String text = sourceTransformer.toString(normalizedMessage.getContent());
+            method.setRequestEntity(new StringRequestEntity(text));
+        }
+    }
+
+    protected void addHttpHeaders(HttpMethod method, NormalizedMessage message) {
+        for (Iterator iter = message.getPropertyNames().iterator(); iter.hasNext();) {
+            String name = (String) iter.next();
+            Object value = message.getProperty(name);
+            if (shouldIncludeHeader(message, name, value)) {
+                method.addRequestHeader(name, value.toString());
+            }
+        }
+        if (method.getRequestHeader("Content-Type") == null) {
+            method.setRequestHeader("Content-Type", contentType);
+        }
+    }
+
+    protected void addNmsProperties(NormalizedMessage message, HttpMethod method) {
+        Header[] headers = method.getResponseHeaders();
+        for (int i = 0; i < headers.length; i++) {
+            Header header = headers[i];
+            String name = header.getName();
+            String value = header.getValue();
+            message.setProperty(name, value);
+        }
+    }
+
+    /**
+     * Decides whether or not the given header should be included in the JMS message.
+     * By default this includes all suitable typed values
+     */
+    protected boolean shouldIncludeHeader(NormalizedMessage normalizedMessage, String name, Object value) {
+        return value instanceof String && 
+                !"Content-Length".equalsIgnoreCase(name) &&
+                !"Content-Type".equalsIgnoreCase(name);
+    }
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpConnector.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpConnector.java
new file mode 100644
index 0000000..14d96c9
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpConnector.java
@@ -0,0 +1,177 @@
+/*
+ * 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.servicemix.components.http;
+
+import javax.jbi.JBIException;
+import javax.jbi.component.ComponentContext;
+
+import org.mortbay.jetty.Connector;
+import org.mortbay.jetty.Server;
+import org.mortbay.jetty.bio.SocketConnector;
+import org.mortbay.jetty.handler.ContextHandler;
+import org.mortbay.jetty.servlet.ServletHandler;
+import org.mortbay.jetty.servlet.ServletHolder;
+import org.mortbay.jetty.servlet.ServletMapping;
+import org.mortbay.thread.BoundedThreadPool;
+
+/**
+ * An embedded Servlet engine to implement a HTTP connector
+ *
+ * @version $Revision: 426415 $
+ */
+public class HttpConnector extends HttpInOutBinding {
+    private Connector listener = new SocketConnector();
+    
+	/**
+	 * The maximum number of threads for the Jetty SocketListener. It's set 
+	 * to 256 by default to match the default value in Jetty. 
+	 */
+	private int maxThreads = 256;
+
+    private Server server;
+    private String host;
+    private int port;
+
+    /**
+     * Constructor
+     *
+     * @param host
+     * @param port
+     */
+    public HttpConnector(String host, int port) {
+        this.host = host;
+        this.port = port;
+    }
+
+    public HttpConnector() {
+    }
+
+    /**
+     * Constructor
+     *
+     * @param listener
+     */
+    public HttpConnector(Connector listener) {
+        this.listener = listener;
+    }
+
+    /**
+     * Called when the Component is initialized
+     *
+     * @param cc
+     * @throws JBIException
+     */
+    public void init(ComponentContext cc) throws JBIException {
+        super.init(cc);
+        //should set all ports etc here - from the naming context I guess ?
+        if (listener == null) {
+            listener = new SocketConnector();
+        }
+        listener.setHost(host);
+        listener.setPort(port);
+        server = new Server();
+        BoundedThreadPool btp = new BoundedThreadPool();
+        btp.setMaxThreads(getMaxThreads());
+        server.setThreadPool(btp);
+    }
+    
+    /**
+     * start the Component
+     *
+     * @throws JBIException
+     */
+    public void start() throws JBIException {
+        server.setConnectors(new Connector[] { listener });
+        ContextHandler context = new ContextHandler();
+        context.setContextPath("/");
+        ServletHolder holder = new ServletHolder();
+        holder.setName("jbiServlet");
+        holder.setClassName(BindingServlet.class.getName());
+        ServletHandler handler = new ServletHandler();
+        handler.setServlets(new ServletHolder[] { holder });
+        ServletMapping mapping = new ServletMapping();
+        mapping.setServletName("jbiServlet");
+        mapping.setPathSpec("/*");
+        handler.setServletMappings(new ServletMapping[] { mapping });
+        context.setHandler(handler);
+        server.setHandler(context);
+        context.setAttribute("binding", this);
+        try {
+            server.start();
+        }
+        catch (Exception e) {
+            throw new JBIException("Start failed: " + e, e);
+        }
+    }
+
+    /**
+     * stop
+     */
+    public void stop() throws JBIException {
+        try {
+            if (server != null) {
+                server.stop();
+            }
+        }
+        catch (Exception e) {
+            throw new JBIException("Stop failed: " + e, e);
+        }
+    }
+
+    /**
+     * shutdown
+     */
+    public void shutDown() throws JBIException {
+        super.shutDown();
+        server = null;
+    }
+
+
+    // Properties
+    //-------------------------------------------------------------------------
+    public int getPort() {
+        return port;
+    }
+
+    public void setPort(int port) {
+        this.port = port;
+    }
+
+    public Server getServer() {
+        return server;
+    }
+
+    public void setServer(Server server) {
+        this.server = server;
+    }
+
+    public String getHost() {
+        return host;
+    }
+
+    public void setHost(String host) {
+        this.host = host;
+    }
+
+	public int getMaxThreads() {
+		return maxThreads;
+	}
+
+	public void setMaxThreads(int maxThreads) {
+		this.maxThreads = maxThreads;
+	}
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpInOnlyBinding.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpInOnlyBinding.java
new file mode 100644
index 0000000..dc4b29b
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpInOnlyBinding.java
@@ -0,0 +1,33 @@
+/*
+ * 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.servicemix.components.http;
+
+import javax.jbi.messaging.InOnly;
+
+/**
+ * A HTTP Binding Component which performs an {@link InOnly} exchange with JBI and returns the response.
+ *
+ * @version $Revision: 426415 $
+ */
+public class HttpInOnlyBinding extends HttpInOutBinding {
+
+    // Properties
+    //-------------------------------------------------------------------------
+    public boolean isDefaultInOut() {
+        return false;
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpInOutBinding.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpInOutBinding.java
new file mode 100644
index 0000000..ebc7cd9
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpInOutBinding.java
@@ -0,0 +1,127 @@
+/*
+ * 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.servicemix.components.http;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.ExchangeStatus;
+import javax.jbi.messaging.InOnly;
+import javax.jbi.messaging.InOut;
+import javax.jbi.messaging.MessageExchangeFactory;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.xml.transform.TransformerException;
+import java.io.IOException;
+
+/**
+ * A HTTP Binding Component which performs an {@link InOut} exchange with JBI and returns the response
+ * by default but is configurable to be an {@link InOnly} exchange.
+ *
+ * @version $Revision: 426415 $
+ */
+public class HttpInOutBinding extends HttpBindingSupport {
+
+    private boolean defaultInOut = true;
+
+    public void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException,
+            JBIException {
+        //response.setContentType("application/soap+xml");
+        if (isInOutRequest(request, response)) {
+            processInOut(request, response);
+        }
+        else {
+            processInOnly(request, response);
+        }
+    }
+
+    public void processInOut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException,
+            JBIException {
+        MessageExchangeFactory factory = getExchangeFactory();
+        InOut exchange = factory.createInOutExchange();
+        NormalizedMessage inMessage = exchange.createMessage();
+        try {
+            getMarshaler().toNMS(exchange, inMessage, request);
+            exchange.setInMessage(inMessage);
+            boolean result = getDeliveryChannel().sendSync(exchange);
+            if (result) {
+            	if (exchange.getStatus() == ExchangeStatus.ERROR) {
+            		if (exchange.getError() != null) {
+            			throw new ServletException(exchange.getError());
+            		} else {
+            			throw new ServletException("Exchange status is ERROR");
+            		}
+            	}
+                getMarshaler().toResponse(exchange, exchange.getOutMessage(), response);
+            }
+            done(exchange);
+            response.setStatus(HttpServletResponse.SC_OK);
+        }
+        catch (IOException e) {
+            fail(exchange, e);
+            outputException(response, e);
+        }
+        catch (TransformerException e) {
+            fail(exchange, e);
+            outputException(response, e);
+        }
+    }
+
+    public void processInOnly(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException,
+            JBIException {
+        MessageExchangeFactory factory = getExchangeFactory();
+        InOnly exchange = factory.createInOnlyExchange();
+        NormalizedMessage inMessage = exchange.createMessage();
+        try {
+            HttpMarshaler marshaler = getMarshaler();
+            marshaler.toNMS(exchange, inMessage, request);
+            exchange.setInMessage(inMessage);
+            // Do a sendSync so that the stream is not closed
+            getDeliveryChannel().sendSync(exchange);
+            response.setStatus(HttpServletResponse.SC_OK);
+        }
+        catch (IOException e) {
+            fail(exchange, e);
+            outputException(response, e);
+        }
+    }
+
+    // Properties
+    //-------------------------------------------------------------------------
+    public boolean isDefaultInOut() {
+        return defaultInOut;
+    }
+
+    /**
+     * Sets whether an InOut (the default) or an InOnly message exchange will be used by default.
+     */
+    public void setDefaultInOut(boolean defaultInOut) {
+        this.defaultInOut = defaultInOut;
+    }
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+
+    /**
+     * Return true if this request is an {@link InOut} request otherwise it will be assumed to be an {@link InOnly}
+     */
+    protected boolean isInOutRequest(HttpServletRequest request, HttpServletResponse response) {
+        return isDefaultInOut();
+    }
+
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpInvoker.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpInvoker.java
new file mode 100644
index 0000000..eeb6db8
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpInvoker.java
@@ -0,0 +1,116 @@
+/*
+ * 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.servicemix.components.http;
+
+import org.apache.commons.httpclient.HostConfiguration;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
+import org.apache.commons.httpclient.URI;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.servicemix.MessageExchangeListener;
+import org.apache.servicemix.components.util.TransformComponentSupport;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+
+/**
+ * Performs HTTP client invocations on a remote HTTP site.
+ *
+ * @version $Revision: 426415 $
+ */
+public class HttpInvoker extends TransformComponentSupport implements MessageExchangeListener {
+
+    protected HttpClientMarshaler marshaler = new HttpClientMarshaler();
+    protected MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
+    protected HttpClient httpClient = new HttpClient(connectionManager);
+    protected HostConfiguration hostConfiguration = new HostConfiguration();
+    protected String url;
+    protected boolean defaultInOut = true;
+
+    public void stop() throws JBIException {
+        super.stop();
+        connectionManager.shutdown();
+    }
+    
+    public HttpInvoker() {
+        // By default, do not forward anything
+        setCopyAttachments(false);
+        setCopyProperties(false);
+    }
+
+    protected boolean transform(MessageExchange exchange, NormalizedMessage in, NormalizedMessage out) throws MessagingException {
+        PostMethod method = new PostMethod(url);
+        try {
+            marshaler.fromNMS(method, exchange, in);
+            if (url != null) {
+                hostConfiguration.setHost(new URI(url, false));
+            }
+            int response = httpClient.executeMethod(hostConfiguration, method);
+
+            if (response != HttpStatus.SC_OK && response != HttpStatus.SC_ACCEPTED) {
+                throw new InvalidStatusResponseException(response);
+            }
+
+            // now lets grab the output and set it on the out message
+            if (defaultInOut) {
+                marshaler.toNMS(out, method);
+            }
+            return defaultInOut;
+        }
+        catch (Exception e) {
+            throw new MessagingException("Error executing http request", e);
+        }
+        finally {
+            method.releaseConnection();
+        }
+    }
+
+    public HttpClient getHttpClient() {
+        return httpClient;
+    }
+
+    public void setHttpClient(HttpClient httpClient) {
+        this.httpClient = httpClient;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public boolean isDefaultInOut() {
+        return defaultInOut;
+    }
+
+    public void setDefaultInOut(boolean defaultInOut) {
+        this.defaultInOut = defaultInOut;
+    }
+
+    public HttpClientMarshaler getMarshaler() {
+        return marshaler;
+    }
+
+    public void setMarshaler(HttpClientMarshaler marshaler) {
+        this.marshaler = marshaler;
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpMarshaler.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpMarshaler.java
new file mode 100644
index 0000000..cc17279
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpMarshaler.java
@@ -0,0 +1,178 @@
+/*
+ * 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.servicemix.components.http;
+
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.jbi.messaging.InOut;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.xml.transform.Source;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.apache.servicemix.components.util.MarshalerSupport;
+import org.apache.servicemix.jbi.jaxp.StringSource;
+
+/**
+ * A class which marshalls a HTTP request to a NMS message
+ * 
+ * @version $Revision: 426415 $
+ */
+public class HttpMarshaler extends MarshalerSupport {
+
+    public static final String CGI_HEADERS = "cgi.headers";
+    
+    public static final String AUTH_TYPE = "AUTH_TYPE";
+    public static final String CONTENT_LENGTH = "CONTENT_LENGTH";
+    public static final String CONTENT_TYPE = "CONTENT_TYPE";
+    public static final String DOCUMENT_ROOT = "DOCUMENT_ROOT";
+    public static final String PATH_INFO = "PATH_INFO";
+    public static final String PATH_TRANSLATED = "PATH_TRANSLATED";
+    public static final String QUERY_STRING = "QUERY_STRING";
+    public static final String REMOTE_ADDRESS = "REMOTE_ADDR";
+    public static final String REMOTE_HOST = "REMOTE_HOST";
+    public static final String REMOTE_USER = "REMOTE_USER";
+    public static final String REQUEST_METHOD = "REQUEST_METHOD";
+    public static final String REQUEST_URI = "REQUEST_URI";
+    public static final String SCRIPT_NAME = "SCRIPT_NAME";
+    public static final String SERVER_NAME = "SERVER_NAME";
+    public static final String SERVER_PORT = "SERVER_PORT";
+    public static final String SERVER_PROTOCOL = "SERVER_PROTOCOL";
+    
+    protected static final Source EMPTY_CONTENT = new StringSource("<payload/>");
+
+    private String contentType = "text/xml";
+
+    public void toNMS(MessageExchange exchange, NormalizedMessage inMessage, HttpServletRequest request) throws IOException, MessagingException {
+        addNmsProperties(inMessage, request);
+        String method = request.getMethod();
+        if (method != null && method.equalsIgnoreCase("POST")) {
+            /*
+            Source src = null;
+            try {
+                if (request.getContentType() != null) {
+                    String charset = new MimeType(request.getContentType()).getParameter("charset");
+                    if (charset != null) {
+                        XMLStreamReader xr = XMLInputFactory.newInstance().createXMLStreamReader(request.getInputStream(), charset);
+                        src = new StaxSource(xr);
+                    }
+                }
+                if (src == null) {
+                    XMLStreamReader xr = XMLInputFactory.newInstance().createXMLStreamReader(request.getInputStream());
+                    src = new StaxSource(xr);
+                }
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+            try {
+                src = getTransformer().toDOMSource(src);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+            inMessage.setContent(src);
+            */
+            inMessage.setContent(new StreamSource(request.getInputStream()));
+        }
+        else {
+            Enumeration enumeration = request.getParameterNames();
+            while (enumeration.hasMoreElements()) {
+                String name = (String) enumeration.nextElement();
+                String value = request.getParameter(name);
+                inMessage.setProperty(name, value);
+            }
+            inMessage.setContent(EMPTY_CONTENT);
+        }
+    }
+
+    public void toResponse(InOut exchange, NormalizedMessage message, HttpServletResponse response) throws IOException, TransformerException {
+        if (message != null) {
+            addHttpHeaders(response, message);
+        }
+
+        response.setContentType(contentType);
+        getTransformer().toResult(message.getContent(), new StreamResult(response.getOutputStream()));
+    }
+
+    // Properties
+    // -------------------------------------------------------------------------
+    public String getContentType() {
+        return contentType;
+    }
+
+    public void setContentType(String contentType) {
+        this.contentType = contentType;
+    }
+
+    // Implementation methods
+    // -------------------------------------------------------------------------
+    protected void addNmsProperties(NormalizedMessage message, HttpServletRequest request) {
+        Enumeration enumeration = request.getHeaderNames();
+        while (enumeration.hasMoreElements()) {
+            String name = (String) enumeration.nextElement();
+            String value = request.getHeader(name);
+            message.setProperty(name, value);  
+        }
+        Map cgi = new HashMap();
+        cgi.put(AUTH_TYPE, request.getAuthType());
+        cgi.put(CONTENT_LENGTH, String.valueOf(request.getContentLength()));
+        cgi.put(CONTENT_TYPE, request.getContentType());
+        cgi.put(DOCUMENT_ROOT, request.getRealPath("/"));
+        cgi.put(PATH_INFO, request.getPathInfo());
+        cgi.put(PATH_TRANSLATED, request.getPathTranslated());
+        cgi.put(QUERY_STRING, request.getQueryString());
+        cgi.put(REMOTE_ADDRESS, request.getRemoteAddr());
+        cgi.put(REMOTE_HOST, request.getRemoteHost());
+        cgi.put(REMOTE_USER, request.getRemoteUser());
+        cgi.put(REQUEST_METHOD, request.getMethod());
+        cgi.put(REQUEST_URI, request.getRequestURL());
+        cgi.put(SCRIPT_NAME, request.getServletPath());
+        cgi.put(SERVER_NAME, request.getServerName());
+        cgi.put(SERVER_PORT, String.valueOf(request.getServerPort()));
+        cgi.put(SERVER_PROTOCOL, request.getProtocol());
+        message.setProperty(CGI_HEADERS, cgi);
+    }
+    
+    protected void addHttpHeaders(HttpServletResponse response, NormalizedMessage normalizedMessage) {
+        for (Iterator iter = normalizedMessage.getPropertyNames().iterator(); iter.hasNext();) {
+            String name = (String) iter.next();
+            Object value = normalizedMessage.getProperty(name);
+            if (shouldIncludeHeader(normalizedMessage, name, value)) {
+                response.setHeader(name, value.toString());
+            }
+        }
+    }
+
+    /**
+     * Decides whether or not the given header should be included in the JMS
+     * message. By default this includes all suitable typed values
+     */
+    protected boolean shouldIncludeHeader(NormalizedMessage normalizedMessage, String name, Object value) {
+        return value instanceof String && 
+                !"Content-Length".equalsIgnoreCase(name) &&
+                !"Content-Type".equalsIgnoreCase(name);
+    }
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpSoapClientMarshaler.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpSoapClientMarshaler.java
new file mode 100644
index 0000000..53467b5
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpSoapClientMarshaler.java
@@ -0,0 +1,97 @@
+/*
+ * 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.servicemix.components.http;
+
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.transform.dom.DOMSource;
+
+import org.apache.commons.httpclient.HttpMethod;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.methods.StringRequestEntity;
+import org.apache.servicemix.jbi.jaxp.StringSource;
+import org.apache.xpath.CachedXPathAPI;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.traversal.NodeIterator;
+
+/**
+ * A class which marshalls a client HTTP request to a NMS message
+ * 
+ * @version $Revision: 431309 $
+ */
+public class HttpSoapClientMarshaler extends HttpClientMarshaler {
+
+    public HttpSoapClientMarshaler() {
+        super();
+    }
+    
+    public HttpSoapClientMarshaler(boolean streaming) {
+        super(streaming);
+    }
+    
+    public void toNMS(NormalizedMessage normalizedMessage, HttpMethod method)
+            throws Exception {
+        addNmsProperties(normalizedMessage, method);
+        String response = method.getResponseBodyAsString();
+        Node node = sourceTransformer.toDOMNode(new StringSource(response));
+        CachedXPathAPI cachedXPathAPI = new CachedXPathAPI();
+        NodeIterator iterator = cachedXPathAPI.selectNodeIterator(node, "/*/*[local-name()='Body']/*");
+        Node root = iterator.nextNode();
+        if (root instanceof Element == false) {
+        	throw new IllegalStateException("Could not find body content");
+        }
+        Element element = (Element) root;
+        
+        // Copy embedded namespaces from the envelope into the body root
+        for (Node parent = element.getParentNode(); parent != null; parent = parent.getParentNode()) {
+            NamedNodeMap attributes = parent.getAttributes();
+            if (attributes != null) {
+                for (int i = 0; i < attributes.getLength(); i++) {
+                    Attr att = (Attr) attributes.item(i);
+                    if (att.getName().startsWith("xmlns:")
+                            && element.getAttributes().getNamedItemNS(att.getNamespaceURI(),
+                                    att.getLocalName()) == null) {
+                    	element.setAttributeNS(att.getNamespaceURI(),
+                                    att.getName(),
+                                    att.getValue());
+                    }
+                }
+            }
+        }
+        
+        normalizedMessage.setContent(new DOMSource(element));
+    }
+
+    public void fromNMS(PostMethod method, MessageExchange exchange, NormalizedMessage normalizedMessage) throws Exception {
+        addHttpHeaders(method, normalizedMessage);
+        Element elem = sourceTransformer.toDOMElement(normalizedMessage.getContent());
+        Document document = sourceTransformer.createDocument();
+        Element env = document.createElementNS("http://schemas.xmlsoap.org/soap/envelope/", "env:Envelope");
+        document.appendChild(env);
+        env.setAttribute("xmlns:env", "http://schemas.xmlsoap.org/soap/envelope/");
+        Element body = document.createElementNS("http://schemas.xmlsoap.org/soap/envelope/", "env:Body");
+        env.appendChild(body);
+        body.appendChild(document.importNode(elem, true));
+        String text = sourceTransformer.toString(document);
+        method.setRequestEntity(new StringRequestEntity(text));
+    }
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpSoapConnector.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpSoapConnector.java
new file mode 100644
index 0000000..c1d128d
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpSoapConnector.java
@@ -0,0 +1,172 @@
+/*
+ * 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.servicemix.components.http;
+
+import javax.jbi.JBIException;
+import javax.jbi.component.ComponentContext;
+
+import org.mortbay.jetty.Connector;
+import org.mortbay.jetty.Server;
+import org.mortbay.jetty.bio.SocketConnector;
+import org.mortbay.jetty.handler.ContextHandler;
+import org.mortbay.jetty.servlet.ServletHandler;
+import org.mortbay.jetty.servlet.ServletHolder;
+import org.mortbay.jetty.servlet.ServletMapping;
+import org.mortbay.thread.BoundedThreadPool;
+
+public class HttpSoapConnector extends HttpSoapInOutBinding {
+    private Connector listener = new SocketConnector();
+	
+	/**
+	 * The maximum number of threads for the Jetty SocketListener. It's set 
+	 * to 256 by default to match the default value in Jetty. 
+	 */
+	private int maxThreads = 256;
+
+	private Server server;
+
+	private String host;
+
+	private int port;
+
+    /**
+     * Constructor
+     *
+     * @param host
+     * @param port
+     */
+    public HttpSoapConnector(String host, int port, boolean defaultInOut) {
+        this.host = host;
+        this.port = port;
+        this.defaultInOut = defaultInOut;
+    }
+
+	public HttpSoapConnector() {
+	}
+
+	/**
+	 * Constructor
+	 *
+	 * @param listener
+	 */
+	public HttpSoapConnector(Connector listener) {
+		this.listener = listener;
+	}
+
+	/**
+	 * Called when the Component is initialized
+	 *
+	 * @param cc
+	 * @throws JBIException
+	 */
+	public void init(ComponentContext cc) throws JBIException {
+		super.init(cc);
+		//should set all ports etc here - from the naming context I guess ?
+		if (listener == null) {
+			listener = new SocketConnector();
+		}
+		listener.setHost(host);
+		listener.setPort(port);
+		server = new Server();
+        BoundedThreadPool btp = new BoundedThreadPool();
+        btp.setMaxThreads(getMaxThreads());
+        server.setThreadPool(btp);
+	}
+
+	/**
+	 * start the Component
+	 *
+	 * @throws JBIException
+	 */
+	public void start() throws JBIException {
+        server.setConnectors(new Connector[] { listener });
+        ContextHandler context = new ContextHandler();
+        context.setContextPath("/");
+        ServletHolder holder = new ServletHolder();
+        holder.setName("jbiServlet");
+        holder.setClassName(BindingServlet.class.getName());
+        ServletHandler handler = new ServletHandler();
+        handler.setServlets(new ServletHolder[] { holder });
+        ServletMapping mapping = new ServletMapping();
+        mapping.setServletName("jbiServlet");
+        mapping.setPathSpec("/*");
+        handler.setServletMappings(new ServletMapping[] { mapping });
+        context.setHandler(handler);
+        server.setHandler(context);
+        context.setAttribute("binding", this);
+        try {
+            server.start();
+        }
+        catch (Exception e) {
+            throw new JBIException("Start failed: " + e, e);
+        }
+	}
+
+	/**
+	 * stop
+	 */
+	public void stop() throws JBIException {
+        try {
+            if (server != null) {
+                server.stop();
+            }
+        } catch (Exception e) {
+            throw new JBIException("Stop failed: " + e, e);
+        }
+    }
+
+	/**
+	 * shutdown
+	 */
+	public void shutDown() throws JBIException {
+		server = null;
+	}
+
+	// Properties
+	//-------------------------------------------------------------------------
+	public int getPort() {
+		return port;
+	}
+
+	public void setPort(int port) {
+		this.port = port;
+	}
+
+	public Server getServer() {
+		return server;
+	}
+
+	public void setServer(Server server) {
+		this.server = server;
+	}
+
+	public String getHost() {
+		return host;
+	}
+
+	public void setHost(String host) {
+		this.host = host;
+	}
+
+	public int getMaxThreads() {
+		return maxThreads;
+	}
+
+	public void setMaxThreads(int maxThreads) {
+		this.maxThreads = maxThreads;
+	}
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpSoapInOnlyBinding.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpSoapInOnlyBinding.java
new file mode 100644
index 0000000..ea68314
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpSoapInOnlyBinding.java
@@ -0,0 +1,24 @@
+/*
+ * 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.servicemix.components.http;
+
+public class HttpSoapInOnlyBinding extends HttpSoapInOutBinding {
+
+    public HttpSoapInOnlyBinding() {
+        defaultInOut = false;
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpSoapInOutBinding.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpSoapInOutBinding.java
new file mode 100644
index 0000000..bc0f5e9
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpSoapInOutBinding.java
@@ -0,0 +1,253 @@
+/*
+ * 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.servicemix.components.http;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.jbi.JBIException;
+import javax.jbi.component.ComponentContext;
+import javax.jbi.messaging.DeliveryChannel;
+import javax.jbi.messaging.ExchangeStatus;
+import javax.jbi.messaging.InOnly;
+import javax.jbi.messaging.InOut;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessageExchangeFactory;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.xml.XMLConstants;
+import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMSource;
+
+import org.apache.servicemix.components.util.ComponentSupport;
+import org.apache.servicemix.jbi.jaxp.SourceTransformer;
+import org.codehaus.xfire.DefaultXFire;
+import org.codehaus.xfire.MessageContext;
+import org.codehaus.xfire.XFire;
+import org.codehaus.xfire.aegis.AegisBindingProvider;
+import org.codehaus.xfire.attachments.Attachment;
+import org.codehaus.xfire.attachments.Attachments;
+import org.codehaus.xfire.fault.XFireFault;
+import org.codehaus.xfire.service.Service;
+import org.codehaus.xfire.service.invoker.BeanInvoker;
+import org.codehaus.xfire.service.binding.ObjectServiceFactory;
+import org.codehaus.xfire.soap.SoapConstants;
+import org.codehaus.xfire.soap.handler.ReadHeadersHandler;
+import org.codehaus.xfire.transport.http.XFireServletController;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+public class HttpSoapInOutBinding extends ComponentSupport implements
+        HttpBinding {
+
+    protected XFire xfire;
+    protected XFireServletController controller;
+    protected Service service;
+    protected boolean defaultInOut = true;
+    protected String soapAction = "\"\"";
+    protected SourceTransformer transformer;
+
+    public HttpSoapInOutBinding() {
+    }
+    
+    public void init(ComponentContext context) throws JBIException {
+        super.init(context);
+        xfire = new DefaultXFire();
+        ObjectServiceFactory factory = new ObjectServiceFactory(xfire.getTransportManager(),
+                                                                new AegisBindingProvider());
+        factory.setVoidOneWay(true);
+        factory.setStyle(SoapConstants.STYLE_DOCUMENT);
+        if (isDefaultInOut()) {
+            service = factory.create(InOutService.class);
+            service.setInvoker(new BeanInvoker(new InOutService(this)));
+        } else {
+            service = factory.create(InOnlyService.class);
+            service.setInvoker(new BeanInvoker(new InOnlyService(this)));
+        }
+        xfire.getServiceRegistry().register(service);
+        controller = new Controller(xfire);
+        transformer = new SourceTransformer();
+    }
+    
+    public void process(HttpServletRequest request, HttpServletResponse response)
+            throws ServletException, IOException {
+        controller.doService(request, response);
+    }
+
+    public void invokeInOnly(Source source, MessageContext context) throws XFireFault {
+        if (source == null) { 
+            throw new XFireFault("Invalid source.", XFireFault.SENDER);
+        }
+        try {
+        	if (soapAction != null) {
+        		XFireServletController.getResponse().setHeader("SOAPAction", soapAction);
+        	}
+            DeliveryChannel channel = getDeliveryChannel();
+            MessageExchangeFactory factory = channel.createExchangeFactory();
+            InOnly exchange = factory.createInOnlyExchange();
+            populateExchange(exchange, source, context);
+            boolean result = channel.sendSync(exchange);
+            if (!result) {
+                throw new XFireFault("Error sending exchange", XFireFault.SENDER);
+            }
+        } catch (XFireFault e) {
+            throw e;
+        } catch (Exception e) {
+            throw new XFireFault(e);
+        }
+    }
+    
+    public Source invokeInOut(Source source, MessageContext context) throws XFireFault {
+        if (source == null) { 
+            throw new XFireFault("Invalid source.", XFireFault.SENDER);
+        }
+        try {
+        	if (soapAction != null) {
+        		XFireServletController.getResponse().setHeader("SOAPAction", soapAction);
+        	}
+            DeliveryChannel channel = getDeliveryChannel();
+            MessageExchangeFactory factory = channel.createExchangeFactory();
+            InOut exchange = factory.createInOutExchange();
+            populateExchange(exchange, source, context);
+            boolean result = channel.sendSync(exchange);
+            if (!result) {
+                throw new XFireFault("Error sending exchange", XFireFault.SENDER);
+            }
+            if (exchange.getStatus() == ExchangeStatus.ERROR) {
+                Exception e = exchange.getError();
+                if (e == null) {
+                    throw new XFireFault("Received error", XFireFault.SENDER);
+                } else {
+                    throw new XFireFault(e, XFireFault.SENDER);
+                }
+            }
+            NormalizedMessage outMessage = exchange.getOutMessage();
+            if (outMessage == null) {
+                exchange.setError(new Exception("Expected an out message"));
+                channel.sendSync(exchange);
+                throw new XFireFault("No response", XFireFault.SENDER);
+            }                    
+            Source src = exchange.getOutMessage().getContent();
+            exchange.setStatus(ExchangeStatus.DONE);
+            channel.send(exchange);
+            src = transformer.toDOMSource(src);
+            return src;
+        } catch (XFireFault e) {
+            throw e;
+        } catch (Exception e) {
+            throw new XFireFault(e);
+		}
+    }
+    
+    protected void populateExchange(MessageExchange exchange, Source src, MessageContext ctx) throws Exception {
+        // TODO: Retrieve properties
+        NormalizedMessage inMessage = exchange.createMessage();
+        // Add removed namespace declarations from the parents
+        Map namespaces = (Map) ctx.getProperty(ReadHeadersHandler.DECLARED_NAMESPACES);
+        Node node = transformer.toDOMNode(src);
+        Element element;
+        if (node instanceof Element) {
+        	element = (Element) node;
+        } else if (node instanceof Document) {
+        	element = ((Document) node).getDocumentElement();
+        } else {
+        	throw new UnsupportedOperationException("Unable to handle nodes of type " + node.getNodeType());
+        }
+        // Copy embedded namespaces from the envelope into the body root
+        for (Iterator it = namespaces.entrySet().iterator(); it.hasNext();) {
+        	Entry entry = (Entry) it.next();
+            if (element.getAttributes().getNamedItemNS(
+            		XMLConstants.XMLNS_ATTRIBUTE_NS_URI, 
+            		(String) entry.getKey()) == null) {
+            	element.setAttributeNS(
+            			XMLConstants.XMLNS_ATTRIBUTE_NS_URI,
+            			XMLConstants.XMLNS_ATTRIBUTE + ":" + (String) entry.getKey(),
+            			(String) entry.getValue());
+            }
+        }
+        // Set the source
+        inMessage.setContent(new DOMSource(element));
+        // Retrieve attachments
+        Attachments attachments = (Attachments) ctx.getInMessage().getAttachments();
+        if (attachments != null) {
+            for (Iterator it = attachments.getParts(); it.hasNext();) {
+                Attachment part = (Attachment) it.next();
+                inMessage.addAttachment(part.getId(), part.getDataHandler());
+            }
+        }
+        exchange.setMessage(inMessage, "in");
+    }
+    
+    public static class InOnlyService {
+        private HttpSoapInOutBinding component;
+        public InOnlyService() {}
+        public InOnlyService(HttpSoapInOutBinding component) {
+            this.component = component;
+        }
+        public void invokeInOnly(Source source, MessageContext context) throws XFireFault {
+            this.component.invokeInOnly(source, context);
+        }
+    }
+    
+    public static class InOutService {
+        private HttpSoapInOutBinding component;
+        public InOutService() {}
+        public InOutService(HttpSoapInOutBinding component) {
+            this.component = component;
+        }
+        public Source invokeInOut(Source source, MessageContext context) throws XFireFault {
+            return this.component.invokeInOut(source, context);
+        }
+    }
+
+    
+    public class Controller extends XFireServletController {
+        public Controller(XFire xfire) {
+            super(xfire);
+        }
+        protected String getService(HttpServletRequest request) {
+            return service.getSimpleName();
+        }        
+    }
+
+    // Properties
+    //-------------------------------------------------------------------------
+    public boolean isDefaultInOut() {
+        return defaultInOut;
+    }
+
+    /**
+     * Sets whether an InOut (the default) or an InOnly message exchange will be used by default.
+     */
+    public void setDefaultInOut(boolean defaultInOut) {
+        this.defaultInOut = defaultInOut;
+    }
+
+	public String getSoapAction() {
+		return soapAction;
+	}
+
+	public void setSoapAction(String soapAction) {
+		this.soapAction = soapAction;
+	}
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpSoapInvoker.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpSoapInvoker.java
new file mode 100644
index 0000000..d39f707
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpSoapInvoker.java
@@ -0,0 +1,25 @@
+/*
+ * 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.servicemix.components.http;
+
+public class HttpSoapInvoker extends HttpInvoker {
+
+    public HttpSoapInvoker() {
+        marshaler = new HttpSoapClientMarshaler();
+    }
+    
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpsConnector.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpsConnector.java
new file mode 100644
index 0000000..336ef1f
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpsConnector.java
@@ -0,0 +1,362 @@
+/*
+ * 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.servicemix.components.http;
+
+import java.io.IOException;
+import java.net.URL;
+import java.security.Security;
+
+import javax.jbi.JBIException;
+import javax.jbi.component.ComponentContext;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.mortbay.jetty.Server;
+import org.mortbay.jetty.Connector;
+import org.mortbay.jetty.security.SslSocketConnector;
+import org.mortbay.jetty.handler.ContextHandler;
+import org.mortbay.jetty.servlet.ServletHandler;
+import org.mortbay.jetty.servlet.ServletHolder;
+import org.mortbay.jetty.servlet.ServletMapping;
+import org.mortbay.thread.BoundedThreadPool;
+import org.springframework.core.io.ClassPathResource;
+
+/**
+ * An embedded Servlet engine to implement a HTTP connector
+ *
+ * @version $Revision: 373823 $
+ */
+public class HttpsConnector extends HttpInOutBinding {
+    private SslSocketConnector listener = new SslSocketConnector();
+    
+	/**
+	 * The maximum number of threads for the Jetty SocketListener. It's set 
+	 * to 256 by default to match the default value in Jetty. 
+	 */
+	private int maxThreads = 256;
+	private static final Log log = LogFactory.getLog(HttpsConnector.class);
+    private Server server;
+    private String host;
+    private int port;
+    private String keyPassword;
+    private String keyStore;
+    private String keyStorePassword;
+    private String keyStoreType = "JKS"; // type of the key store
+    private String protocol = "TLS";
+    // cert algorithm
+    private String keyManagerFactoryAlgorithm = Security.getProperty(
+        "ssl.KeyManagerFactory.algorithm") == null
+        ? "SunX509" : Security.getProperty("ssl.KeyManagerFactory.algorithm");
+    // cert algorithm
+    private String trustManagerFactoryAlgorithm = Security.getProperty(
+        "ssl.TrustManagerFactory.algorithm") == null
+        ? "SunX509" : Security.getProperty("ssl.TrustManagerFactory.algorithm");
+    private boolean wantClientAuth = false;
+    private boolean needClientAuth = false;
+
+    /**
+     * Constructor
+     *
+     * @param host
+     * @param port
+     */
+    public HttpsConnector(String host, int port, String keyPassword, String keyStorePassword, String keyStore, boolean needClientAuth, boolean wantClientAuth) {
+        this.host = host;
+        this.port = port;
+        this.keyPassword = keyPassword;
+        this.keyStorePassword = keyStorePassword;
+        this.keyStore = keyStore;
+        this.wantClientAuth = wantClientAuth;
+        this.needClientAuth = needClientAuth;
+    }
+
+    public HttpsConnector() {
+    }
+
+    /**
+     * Constructor
+     *
+     * @param listener
+     */
+    public HttpsConnector(SslSocketConnector listener) {
+        this.listener = listener;
+    }
+
+    /**
+     * Called when the Component is initialized
+     *
+     * @param cc
+     * @throws JBIException
+     */
+    public void init(ComponentContext cc) throws JBIException {
+        super.init(cc);
+        //should set all ports etc here - from the naming context I guess ?
+        if (keyStore == null) {
+            keyStore = System.getProperty("javax.net.ssl.keyStore", "");
+            if (keyStore == null) {
+                throw new IllegalArgumentException("keyStore or system property javax.net.ssl.keyStore must be set");
+            }
+        }
+        if (keyStore.startsWith("classpath:")) {
+            try {
+                String res = keyStore.substring(10);
+                URL url = new ClassPathResource(res).getURL();
+                keyStore = url.toString();
+            } catch (IOException e) {
+                throw new JBIException("Unable to find keystore " + keyStore, e);
+            }
+        }
+        if (keyStorePassword == null) {
+            keyStorePassword = System.getProperty("javax.net.ssl.keyStorePassword");
+            if (keyStorePassword == null) {
+                throw new IllegalArgumentException("keyStorePassword or system property javax.net.ssl.keyStorePassword must be set");
+            }
+        }
+        if (listener == null) {
+            listener = new SslSocketConnector();
+        }
+        listener.setHost(host);
+        listener.setPort(port);
+        listener.setConfidentialPort(port);
+        listener.setPassword(keyStorePassword);
+        listener.setKeyPassword(keyPassword != null ? keyPassword : keyStorePassword);
+        listener.setKeystore(keyStore);
+        listener.setWantClientAuth(wantClientAuth);
+        listener.setNeedClientAuth(needClientAuth);
+        listener.setProtocol(protocol);
+        listener.setSslKeyManagerFactoryAlgorithm(keyManagerFactoryAlgorithm);
+        listener.setSslTrustManagerFactoryAlgorithm(trustManagerFactoryAlgorithm);
+        listener.setKeystoreType(keyStoreType);
+        server = new Server();
+        BoundedThreadPool btp = new BoundedThreadPool();
+        btp.setMaxThreads(getMaxThreads());
+        server.setThreadPool(btp);
+    }
+    
+    /**
+     * start the Component
+     *
+     * @throws JBIException
+     */
+    public void start() throws JBIException {
+        server.setConnectors(new Connector[] { listener });
+        ContextHandler context = new ContextHandler();
+        context.setContextPath("/");
+        ServletHolder holder = new ServletHolder();
+        holder.setName("jbiServlet");
+        holder.setClassName(BindingServlet.class.getName());
+        ServletHandler handler = new ServletHandler();
+        handler.setServlets(new ServletHolder[] { holder });
+        ServletMapping mapping = new ServletMapping();
+        mapping.setServletName("jbiServlet");
+        mapping.setPathSpec("/*");
+        handler.setServletMappings(new ServletMapping[] { mapping });
+        context.setHandler(handler);
+        server.setHandler(context);
+        context.setAttribute("binding", this);
+        try {
+            server.start();
+        }
+        catch (Exception e) {
+        	log.warn(e.toString());
+            throw new JBIException("Start failed: " + e, e);
+        }
+    }
+
+    /**
+     * stop
+     */
+    public void stop() throws JBIException {
+        try {
+            if (server != null) {
+                server.stop();
+            }
+        }
+        catch (Exception e) {
+        	log.warn(e.toString());
+            throw new JBIException("Stop failed: " + e, e);
+        }
+    }
+
+    /**
+     * shutdown
+     */
+    public void shutDown() throws JBIException {
+        server = null;
+    }
+
+
+    // Properties
+    //-------------------------------------------------------------------------
+    public int getPort() {
+        return port;
+    }
+
+    public void setPort(int port) {
+        this.port = port;
+    }
+
+    public Server getServer() {
+        return server;
+    }
+
+    public void setServer(Server server) {
+        this.server = server;
+    }
+
+    public String getHost() {
+        return host;
+    }
+
+    public void setHost(String host) {
+        this.host = host;
+    }
+
+	public int getMaxThreads() {
+		return maxThreads;
+	}
+
+	public void setMaxThreads(int maxThreads) {
+		this.maxThreads = maxThreads;
+	}
+
+    /**
+     * @return Returns the algorithm.
+     */
+    public String getKeyManagerFactoryAlgorithm() {
+        return keyManagerFactoryAlgorithm;
+    }
+
+    /**
+     * @param algorithm The algorithm to set.
+     */
+    public void setKeyManagerFactoryAlgorithm(String algorithm) {
+        this.keyManagerFactoryAlgorithm = algorithm;
+    }
+
+    /**
+     * @return Returns the algorithm.
+     */
+    public String getTrustManagerFactoryAlgorithm() {
+        return trustManagerFactoryAlgorithm;
+    }
+
+    /**
+     * @param algorithm The algorithm to set.
+     */
+    public void setTrustManagerFactoryAlgorithm(String algorithm) {
+        this.trustManagerFactoryAlgorithm = algorithm;
+    }
+
+    /**
+     * @return Returns the keyPassword.
+     */
+    public String getKeyPassword() {
+        return keyPassword;
+    }
+
+    /**
+     * @param keyPassword The keyPassword to set.
+     */
+    public void setKeyPassword(String keyPassword) {
+        this.keyPassword = keyPassword;
+    }
+
+    /**
+     * @return Returns the keyStore.
+     */
+    public String getKeyStore() {
+        return keyStore;
+    }
+
+    /**
+     * @param keyStore The keyStore to set.
+     */
+    public void setKeyStore(String keyStore) {
+        this.keyStore = keyStore;
+    }
+
+    /**
+     * @return Returns the keyStorePassword.
+     */
+    public String getKeyStorePassword() {
+        return keyStorePassword;
+    }
+
+    /**
+     * @param keyStorePassword The keyStorePassword to set.
+     */
+    public void setKeyStorePassword(String keyStorePassword) {
+        this.keyStorePassword = keyStorePassword;
+    }
+
+    /**
+     * @return Returns the keyStoreType.
+     */
+    public String getKeyStoreType() {
+        return keyStoreType;
+    }
+
+    /**
+     * @param keyStoreType The keyStoreType to set.
+     */
+    public void setKeyStoreType(String keyStoreType) {
+        this.keyStoreType = keyStoreType;
+    }
+
+    /**
+     * @return Returns the needClientAuth.
+     */
+    public boolean isNeedClientAuth() {
+        return needClientAuth;
+    }
+
+    /**
+     * @param needClientAuth The needClientAuth to set.
+     */
+    public void setNeedClientAuth(boolean needClientAuth) {
+        this.needClientAuth = needClientAuth;
+    }
+
+    /**
+     * @return Returns the protocol.
+     */
+    public String getProtocol() {
+        return protocol;
+    }
+
+    /**
+     * @param protocol The protocol to set.
+     */
+    public void setProtocol(String protocol) {
+        this.protocol = protocol;
+    }
+
+    /**
+     * @return Returns the wantClientAuth.
+     */
+    public boolean isWantClientAuth() {
+        return wantClientAuth;
+    }
+
+    /**
+     * @param wantClientAuth The wantClientAuth to set.
+     */
+    public void setWantClientAuth(boolean wantClientAuth) {
+        this.wantClientAuth = wantClientAuth;
+    }
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpsInvoker.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpsInvoker.java
new file mode 100644
index 0000000..b26f879
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpsInvoker.java
@@ -0,0 +1,383 @@
+/*
+ * 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.servicemix.components.http;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.Socket;
+import java.net.SocketAddress;
+import java.net.URI;
+import java.net.URL;
+import java.net.UnknownHostException;
+import java.security.KeyStore;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManagerFactory;
+
+import org.apache.commons.httpclient.ConnectTimeoutException;
+import org.apache.commons.httpclient.HostConfiguration;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpHost;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.params.HttpConnectionParams;
+import org.apache.commons.httpclient.protocol.Protocol;
+import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
+import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory;
+import org.apache.servicemix.MessageExchangeListener;
+import org.apache.servicemix.components.util.TransformComponentSupport;
+import org.mortbay.resource.Resource;
+import org.springframework.core.io.ClassPathResource;
+
+/**
+ * Performs HTTP client invocations on a remote HTTP site.
+ *
+ * @version $Revision: 373823 $
+ */
+public class HttpsInvoker extends TransformComponentSupport implements MessageExchangeListener {
+
+    protected HttpClientMarshaler marshaler = new HttpClientMarshaler();
+    protected MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
+    protected HttpClient httpClient = new HttpClient(connectionManager);
+    protected HostConfiguration hostConfiguration = new HostConfiguration();
+    protected String url;
+    protected boolean defaultInOut = true;
+
+    private String keyPassword;
+    private String keyStore;
+    private String keyStorePassword;
+    private String keyStoreType = "JKS"; // type of the key store
+    private String trustStore;
+    private String trustStorePassword;
+    private String trustStoreType = "JKS";
+    private String protocol = "TLS";
+    private String algorithm = "SunX509"; // cert algorithm
+    
+    private class CommonsHttpSSLSocketFactory implements SecureProtocolSocketFactory {
+
+        private SSLSocketFactory factory;
+        
+        public CommonsHttpSSLSocketFactory() throws Exception {
+            SSLContext context = SSLContext.getInstance(protocol);
+            KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(algorithm);
+            if (keyStore == null) {
+                keyStore = System.getProperty("javax.net.ssl.keyStore");
+                if (keyStore == null) {
+                    throw new IllegalArgumentException("keyStore or system property javax.net.ssl.keyStore must be set");
+                }
+            }
+            if (keyStore.startsWith("classpath:")) {
+                try {
+                    String res = keyStore.substring(10);
+                    URL url = new ClassPathResource(res).getURL();
+                    keyStore = url.toString();
+                } catch (IOException e) {
+                    throw new JBIException("Unable to find keyStore " + keyStore, e);
+                }
+            }
+            if (keyStorePassword == null) {
+                keyStorePassword = System.getProperty("javax.net.ssl.keyStorePassword");
+                if (keyStorePassword == null) {
+                    throw new IllegalArgumentException("keyStorePassword or system property javax.net.ssl.keyStorePassword must be set");
+                }
+            }
+            if (trustStore == null) {
+                trustStore = System.getProperty("javax.net.ssl.trustStore");
+            }
+            if (trustStore != null && trustStore.startsWith("classpath:")) {
+                try {
+                    String res = trustStore.substring(10);
+                    URL url = new ClassPathResource(res).getURL();
+                    trustStore = url.toString();
+                } catch (IOException e) {
+                    throw new JBIException("Unable to find trustStore " + trustStore, e);
+                }
+            }
+            if (trustStorePassword == null) {
+                trustStorePassword = System.getProperty("javax.net.ssl.trustStorePassword");
+                if (keyStorePassword == null) {
+                    throw new IllegalArgumentException("trustStorePassword or system property javax.net.ssl.trustStorePassword must be set");
+                }
+            }
+            KeyStore ks = KeyStore.getInstance(keyStoreType);
+            ks.load(Resource.newResource(keyStore).getInputStream(), keyStorePassword.toCharArray());
+            keyManagerFactory.init(ks, keyPassword != null ? keyPassword.toCharArray() : keyStorePassword.toCharArray());
+            if (trustStore != null) {
+                KeyStore ts = KeyStore.getInstance(trustStoreType);
+                ts.load(Resource.newResource(trustStore).getInputStream(), trustStorePassword.toCharArray());
+                TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(algorithm);
+                trustManagerFactory.init(ts);
+                context.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new java.security.SecureRandom());
+            } else {
+                context.init(keyManagerFactory.getKeyManagers(), null, new java.security.SecureRandom());
+            }
+            factory = context.getSocketFactory();
+        }
+        
+        public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
+            return factory.createSocket(socket, host, port, autoClose);
+        }
+
+        public Socket createSocket(String host, int port, InetAddress localAddress, int localPort) throws IOException, UnknownHostException {
+            return factory.createSocket(host, port, localAddress, localPort);
+        }
+
+        public Socket createSocket(String host, int port, InetAddress localAddress, int localPort, HttpConnectionParams params) throws IOException, UnknownHostException, ConnectTimeoutException {
+            if (params == null) {
+                throw new IllegalArgumentException("Parameters may not be null");
+            }
+            int timeout = params.getConnectionTimeout();
+            if (timeout == 0) {
+                return createSocket(host, port, localAddress, localPort);
+            } else {
+                Socket socket = factory.createSocket();
+                SocketAddress localaddr = new InetSocketAddress(localAddress, localPort);
+                SocketAddress remoteaddr = new InetSocketAddress(host, port);
+                socket.bind(localaddr);
+                socket.connect(remoteaddr, timeout);
+                return socket;
+            }
+        }
+
+        public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
+            return factory.createSocket(host, port);
+        }
+        
+    }
+    
+    protected void init() throws JBIException {
+        super.init();
+        try {
+            URI uri = new URI(url);
+            ProtocolSocketFactory sf = new CommonsHttpSSLSocketFactory();
+            Protocol protocol = new Protocol("https", sf, 443);
+            HttpHost host = new HttpHost(uri.getHost(), uri.getPort(), protocol);
+            hostConfiguration.setHost(host);
+        } catch (Exception e) {
+            throw new JBIException("Unable to initialize HttpsInvoker", e);
+        }
+    }
+    
+    public void stop() throws JBIException {
+        super.stop();
+        connectionManager.shutdown();
+    }
+
+    protected boolean transform(MessageExchange exchange, NormalizedMessage in, NormalizedMessage out) throws MessagingException {
+        String url;
+        // We need to relativize the method url to the host config
+        // so that the hostConfiguration is not overriden by the executeMethod call
+        try {
+            java.net.URI uri = new URI(this.url);
+            uri = uri.relativize(new URI(hostConfiguration.getHostURL()));
+            url = uri.toString();
+        } catch (Exception e1) {
+            url = this.url;
+        }
+        PostMethod method = new PostMethod(url);
+        try {
+            marshaler.fromNMS(method, exchange, in);
+            if (method.getRequestHeader("Content-Type") == null) {
+                method.setRequestHeader("Content-Type", "text/html; charset=UTF-8");
+            }
+            int response = httpClient.executeMethod(hostConfiguration, method);
+
+            if (response != HttpStatus.SC_OK && response != HttpStatus.SC_ACCEPTED) {
+                throw new InvalidStatusResponseException(response);
+            }
+
+            // now lets grab the output and set it on the out message
+            if (defaultInOut) {
+                marshaler.toNMS(out, method);
+            }
+            return defaultInOut;
+        }
+        catch (Exception e) {
+            throw new MessagingException("Error executing http request", e);
+        }
+        finally {
+            method.releaseConnection();
+        }
+    }
+
+    public HttpClient getHttpClient() {
+        return httpClient;
+    }
+
+    public void setHttpClient(HttpClient httpClient) {
+        this.httpClient = httpClient;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public boolean isDefaultInOut() {
+        return defaultInOut;
+    }
+
+    public void setDefaultInOut(boolean defaultInOut) {
+        this.defaultInOut = defaultInOut;
+    }
+
+    public HttpClientMarshaler getMarshaler() {
+        return marshaler;
+    }
+
+    public void setMarshaler(HttpClientMarshaler marshaler) {
+        this.marshaler = marshaler;
+    }
+
+    /**
+     * @return Returns the algorithm.
+     */
+    public String getAlgorithm() {
+        return algorithm;
+    }
+
+    /**
+     * @param algorithm The algorithm to set.
+     */
+    public void setAlgorithm(String algorithm) {
+        this.algorithm = algorithm;
+    }
+
+    /**
+     * @return Returns the keyPassword.
+     */
+    public String getKeyPassword() {
+        return keyPassword;
+    }
+
+    /**
+     * @param keyPassword The keyPassword to set.
+     */
+    public void setKeyPassword(String keyPassword) {
+        this.keyPassword = keyPassword;
+    }
+
+    /**
+     * @return Returns the keyStore.
+     */
+    public String getKeyStore() {
+        return keyStore;
+    }
+
+    /**
+     * @param keyStore The keyStore to set.
+     */
+    public void setKeyStore(String keyStore) {
+        this.keyStore = keyStore;
+    }
+
+    /**
+     * @return Returns the keyStorePassword.
+     */
+    public String getKeyStorePassword() {
+        return keyStorePassword;
+    }
+
+    /**
+     * @param keyStorePassword The keyStorePassword to set.
+     */
+    public void setKeyStorePassword(String keyStorePassword) {
+        this.keyStorePassword = keyStorePassword;
+    }
+
+    /**
+     * @return Returns the keyStoreType.
+     */
+    public String getKeyStoreType() {
+        return keyStoreType;
+    }
+
+    /**
+     * @param keyStoreType The keyStoreType to set.
+     */
+    public void setKeyStoreType(String keyStoreType) {
+        this.keyStoreType = keyStoreType;
+    }
+
+    /**
+     * @return Returns the protocol.
+     */
+    public String getProtocol() {
+        return protocol;
+    }
+
+    /**
+     * @param protocol The protocol to set.
+     */
+    public void setProtocol(String protocol) {
+        this.protocol = protocol;
+    }
+
+    /**
+     * @return Returns the trustStore.
+     */
+    public String getTrustStore() {
+        return trustStore;
+    }
+
+    /**
+     * @param trustStore The trustStore to set.
+     */
+    public void setTrustStore(String trustStore) {
+        this.trustStore = trustStore;
+    }
+
+    /**
+     * @return Returns the trustStorePassword.
+     */
+    public String getTrustStorePassword() {
+        return trustStorePassword;
+    }
+
+    /**
+     * @param trustStorePassword The trustStorePassword to set.
+     */
+    public void setTrustStorePassword(String trustStorePassword) {
+        this.trustStorePassword = trustStorePassword;
+    }
+
+    /**
+     * @return Returns the trustStoreType.
+     */
+    public String getTrustStoreType() {
+        return trustStoreType;
+    }
+
+    /**
+     * @param trustStoreType The trustStoreType to set.
+     */
+    public void setTrustStoreType(String trustStoreType) {
+        this.trustStoreType = trustStoreType;
+    }
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpsSoapConnector.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpsSoapConnector.java
new file mode 100644
index 0000000..a98124e
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/HttpsSoapConnector.java
@@ -0,0 +1,353 @@
+/*
+ * 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.servicemix.components.http;
+
+import java.io.IOException;
+import java.net.URL;
+import java.security.Security;
+
+import javax.jbi.JBIException;
+import javax.jbi.component.ComponentContext;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.mortbay.jetty.Connector;
+import org.mortbay.jetty.Server;
+import org.mortbay.jetty.security.SslSocketConnector;
+import org.mortbay.jetty.handler.ContextHandler;
+import org.mortbay.jetty.servlet.ServletHandler;
+import org.mortbay.jetty.servlet.ServletHolder;
+import org.mortbay.jetty.servlet.ServletMapping;
+import org.mortbay.thread.BoundedThreadPool;
+import org.springframework.core.io.ClassPathResource;
+
+public class HttpsSoapConnector extends HttpSoapInOutBinding {
+    private SslSocketConnector listener = new SslSocketConnector();
+	
+	/**
+	 * The maximum number of threads for the Jetty SocketListener. It's set 
+	 * to 256 by default to match the default value in Jetty. 
+	 */
+	private int maxThreads = 256;
+	private Server server;
+	private static final Log log = LogFactory.getLog(HttpsConnector.class);
+	private String host;
+	private int port;
+    private String keyPassword;
+    private String keyStore;
+    private String keyStorePassword;
+    private String keyStoreType = "JKS"; // type of the key store
+    private String protocol = "TLS";
+    // cert algorithm
+    private String keyManagerFactoryAlgorithm = Security.getProperty(
+        "ssl.KeyManagerFactory.algorithm") == null
+        ? "SunX509" : Security.getProperty("ssl.KeyManagerFactory.algorithm");
+    // cert algorithm
+    private String trustManagerFactoryAlgorithm = Security.getProperty(
+        "ssl.TrustManagerFactory.algorithm") == null
+        ? "SunX509" : Security.getProperty("ssl.TrustManagerFactory.algorithm");
+    private boolean wantClientAuth = false;
+    private boolean needClientAuth = false;
+
+    /**
+     * Constructor
+     *
+     * @param host
+     * @param port
+     */
+    public HttpsSoapConnector(String host, int port, String keyPassword, String keyStorePassword, String keyStore, boolean needClientAuth, boolean wantClientAuth) {
+        this.host = host;
+        this.port = port;
+        this.keyPassword = keyPassword;
+        this.keyStorePassword = keyStorePassword;
+        this.keyStore = keyStore;
+        this.wantClientAuth = wantClientAuth;
+        this.needClientAuth = needClientAuth;
+    }
+
+	public HttpsSoapConnector() {
+	}
+
+	/**
+	 * Constructor
+	 *
+	 * @param listener
+	 */
+	public HttpsSoapConnector(SslSocketConnector listener) {
+		this.listener = listener;
+	}
+
+	/**
+	 * Called when the Component is initialized
+	 *
+	 * @param cc
+	 * @throws JBIException
+	 */
+	public void init(ComponentContext cc) throws JBIException {
+		super.init(cc);
+		//should set all ports etc here - from the naming context I guess ?
+        if (keyStore == null) {
+            keyStore = System.getProperty("javax.net.ssl.keyStore", "");
+            if (keyStore == null) {
+                throw new IllegalArgumentException("keyStore or system property javax.net.ssl.keyStore must be set");
+            }
+        }
+        if (keyStore.startsWith("classpath:")) {
+            try {
+                String res = keyStore.substring(10);
+                URL url = new ClassPathResource(res).getURL();
+                keyStore = url.toString();
+            } catch (IOException e) {
+                throw new JBIException("Unable to find keystore " + keyStore, e);
+            }
+        }
+        if (keyStorePassword == null) {
+            keyStorePassword = System.getProperty("javax.net.ssl.keyStorePassword");
+            if (keyStorePassword == null) {
+                throw new IllegalArgumentException("keyStorePassword or system property javax.net.ssl.keyStorePassword must be set");
+            }
+        }
+        if (listener == null) {
+            listener = new SslSocketConnector();
+        }
+        listener.setHost(host);
+        listener.setPort(port);
+        listener.setConfidentialPort(port);
+        listener.setPassword(keyStorePassword);
+        listener.setKeyPassword(keyPassword != null ? keyPassword : keyStorePassword);
+        listener.setKeystore(keyStore);
+        listener.setWantClientAuth(wantClientAuth);
+        listener.setNeedClientAuth(needClientAuth);
+        listener.setProtocol(protocol);
+        listener.setSslKeyManagerFactoryAlgorithm(keyManagerFactoryAlgorithm);
+        listener.setSslTrustManagerFactoryAlgorithm(trustManagerFactoryAlgorithm);
+        listener.setKeystoreType(keyStoreType);
+		server = new Server();
+        BoundedThreadPool btp = new BoundedThreadPool();
+        btp.setMaxThreads(getMaxThreads());
+        server.setThreadPool(btp);
+	}
+
+	/**
+	 * start the Component
+	 *
+	 * @throws JBIException
+	 */
+	public void start() throws JBIException {
+        server.setConnectors(new Connector[] { listener });
+        ContextHandler context = new ContextHandler();
+        context.setContextPath("/");
+        ServletHolder holder = new ServletHolder();
+        holder.setName("jbiServlet");
+        holder.setClassName(BindingServlet.class.getName());
+        ServletHandler handler = new ServletHandler();
+        handler.setServlets(new ServletHolder[] { holder });
+        ServletMapping mapping = new ServletMapping();
+        mapping.setServletName("jbiServlet");
+        mapping.setPathSpec("/*");
+        handler.setServletMappings(new ServletMapping[] { mapping });
+        context.setHandler(handler);
+        server.setHandler(context);
+        context.setAttribute("binding", this);
+        try {
+            server.start();
+        }
+        catch (Exception e) {
+        	log.warn(e.toString());
+            throw new JBIException("Start failed: " + e, e);
+        }
+	}
+
+	/**
+	 * stop
+	 */
+	public void stop() throws JBIException {
+        try {
+            if (server != null) {
+                server.stop();
+            }
+        } catch (Exception e) {
+            throw new JBIException("Stop failed: " + e, e);
+        }
+    }
+
+	/**
+	 * shutdown
+	 */
+	public void shutDown() throws JBIException {
+		server = null;
+	}
+
+	// Properties
+	//-------------------------------------------------------------------------
+	public int getPort() {
+		return port;
+	}
+
+	public void setPort(int port) {
+		this.port = port;
+	}
+
+	public Server getServer() {
+		return server;
+	}
+
+	public void setServer(Server server) {
+		this.server = server;
+	}
+
+	public String getHost() {
+		return host;
+	}
+
+	public void setHost(String host) {
+		this.host = host;
+	}
+
+	public int getMaxThreads() {
+		return maxThreads;
+	}
+
+	public void setMaxThreads(int maxThreads) {
+		this.maxThreads = maxThreads;
+	}
+
+    /**
+     * @return Returns the algorithm.
+     */
+    public String getKeyManagerFactoryAlgorithm() {
+        return keyManagerFactoryAlgorithm;
+    }
+
+    /**
+     * @param algorithm The algorithm to set.
+     */
+    public void setKeyManagerFactoryAlgorithm(String algorithm) {
+        this.keyManagerFactoryAlgorithm = algorithm;
+    }
+
+    /**
+     * @return Returns the algorithm.
+     */
+    public String getTrustManagerFactoryAlgorithm() {
+        return trustManagerFactoryAlgorithm;
+    }
+
+    /**
+     * @param algorithm The algorithm to set.
+     */
+    public void setTrustManagerFactoryAlgorithm(String algorithm) {
+        this.trustManagerFactoryAlgorithm = algorithm;
+    }
+
+    /**
+     * @return Returns the keyPassword.
+     */
+    public String getKeyPassword() {
+        return keyPassword;
+    }
+
+    /**
+     * @param keyPassword The keyPassword to set.
+     */
+    public void setKeyPassword(String keyPassword) {
+        this.keyPassword = keyPassword;
+    }
+
+    /**
+     * @return Returns the keyStore.
+     */
+    public String getKeyStore() {
+        return keyStore;
+    }
+
+    /**
+     * @param keyStore The keyStore to set.
+     */
+    public void setKeyStore(String keyStore) {
+        this.keyStore = keyStore;
+    }
+
+    /**
+     * @return Returns the keyStorePassword.
+     */
+    public String getKeyStorePassword() {
+        return keyStorePassword;
+    }
+
+    /**
+     * @param keyStorePassword The keyStorePassword to set.
+     */
+    public void setKeyStorePassword(String keyStorePassword) {
+        this.keyStorePassword = keyStorePassword;
+    }
+
+    /**
+     * @return Returns the keyStoreType.
+     */
+    public String getKeyStoreType() {
+        return keyStoreType;
+    }
+
+    /**
+     * @param keyStoreType The keyStoreType to set.
+     */
+    public void setKeyStoreType(String keyStoreType) {
+        this.keyStoreType = keyStoreType;
+    }
+
+    /**
+     * @return Returns the needClientAuth.
+     */
+    public boolean isNeedClientAuth() {
+        return needClientAuth;
+    }
+
+    /**
+     * @param needClientAuth The needClientAuth to set.
+     */
+    public void setNeedClientAuth(boolean needClientAuth) {
+        this.needClientAuth = needClientAuth;
+    }
+
+    /**
+     * @return Returns the protocol.
+     */
+    public String getProtocol() {
+        return protocol;
+    }
+
+    /**
+     * @param protocol The protocol to set.
+     */
+    public void setProtocol(String protocol) {
+        this.protocol = protocol;
+    }
+
+    /**
+     * @return Returns the wantClientAuth.
+     */
+    public boolean isWantClientAuth() {
+        return wantClientAuth;
+    }
+
+    /**
+     * @param wantClientAuth The wantClientAuth to set.
+     */
+    public void setWantClientAuth(boolean wantClientAuth) {
+        this.wantClientAuth = wantClientAuth;
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/InvalidStatusResponseException.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/InvalidStatusResponseException.java
new file mode 100644
index 0000000..56a9791
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/InvalidStatusResponseException.java
@@ -0,0 +1,35 @@
+/*
+ * 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.servicemix.components.http;
+
+import javax.jbi.messaging.MessagingException;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class InvalidStatusResponseException extends MessagingException {
+    private int statusCode;
+
+    public InvalidStatusResponseException(int statusCode) {
+        super("Invalid status response code: " + statusCode);
+        this.statusCode = statusCode;
+    }
+
+    public int getStatusCode() {
+        return statusCode;
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/SpringBindingServlet.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/SpringBindingServlet.java
new file mode 100644
index 0000000..02ff0f6
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/SpringBindingServlet.java
@@ -0,0 +1,65 @@
+/*
+ * 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.servicemix.components.http;
+
+import org.apache.servicemix.jbi.container.SpringJBIContainer;
+import org.springframework.context.ApplicationContext;
+import org.springframework.web.context.support.WebApplicationContextUtils;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+
+/**
+ * A Spring based HTTP Binding Servlet for ServiceMix which will
+ * lookup the JBI container and the HttpBinding to use from the Spring
+ * {@link ApplicationContext}
+ * 
+ * @version $Revision: 426415 $
+ */
+public class SpringBindingServlet extends BindingServlet {
+
+    protected HttpBinding createHttpBinding(ServletConfig config) throws ServletException {
+        ApplicationContext applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
+        
+        String jbiName = config.getInitParameter("jbi");
+        if (jbiName == null) {
+            jbiName = "jbi";
+        }
+        String endpointName = config.getInitParameter("endpoint");
+        if (endpointName == null) {
+            throw new ServletException("You must configure a servlet config parameter of endpointRef");
+        }
+        
+        SpringJBIContainer jbi = (SpringJBIContainer) applicationContext.getBean(jbiName);
+        if (jbi == null) {
+            throw new ServletException("Could not find the JBIContainer in the Spring application context for name: " + jbiName);
+        }
+        
+        Object value = jbi.getBean(endpointName);
+        if (value == null) {
+            throw new ServletException("Could not find bean in the SpringJBIContainer for id: " + endpointName);
+        }
+        if (value instanceof HttpBinding) {
+            return (HttpBinding) value;
+        }
+        else {
+            throw new ServletException("The endpoint is not a HttpBinding: " + value);
+        }
+    }
+    
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/package.html b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/package.html
new file mode 100644
index 0000000..f8e66e3
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/http/package.html
@@ -0,0 +1,27 @@
+<!--
+
+    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.
+
+-->
+<html>
+<head>
+</head>
+<body>
+
+Bindings for HTTP and <a href="http://java.sun.com/products/servlet/">Servlets</a>
+
+</body>
+</html>
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/jabber/JabberChatSender.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jabber/JabberChatSender.java
new file mode 100644
index 0000000..745e2e1
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jabber/JabberChatSender.java
@@ -0,0 +1,83 @@
+/*
+ * 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.servicemix.components.jabber;
+
+import org.jivesoftware.smack.Chat;
+import org.jivesoftware.smack.packet.Message;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.NormalizedMessage;
+
+/**
+ * Sends one way messages to a private Jabber {@link Chat}
+ *
+ * @version $Revision: 426415 $
+ */
+public class JabberChatSender extends JabberComponentSupport {
+
+    private Chat chat;
+    private String participant;
+
+    public void afterPropertiesSet() throws Exception {
+        super.afterPropertiesSet();
+        if (chat == null) {
+            if (participant == null) {
+                throw new IllegalArgumentException("You must specify the participant property");
+            }
+        }
+    }
+
+    public void start() throws JBIException {
+        super.start();
+        if (chat == null) {
+            chat = getConnection().createChat(participant);
+        }
+    }
+
+    public void stop() throws JBIException {
+        chat = null;
+        super.stop();
+    }
+
+    // Properties
+    //-------------------------------------------------------------------------
+    public Chat getChat() {
+        return chat;
+    }
+
+    public void setChat(Chat chat) {
+        this.chat = chat;
+    }
+
+    public String getParticipant() {
+        return participant;
+    }
+
+    public void setParticipant(String participant) {
+        this.participant = participant;
+    }
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+    protected void process(MessageExchange messageExchange, NormalizedMessage normalizedMessage) throws Exception {
+        Message message = chat.createMessage();
+        getMarshaler().fromNMS(message, normalizedMessage);
+        chat.sendMessage(message);
+        done(messageExchange);
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/jabber/JabberComponentSupport.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jabber/JabberComponentSupport.java
new file mode 100644
index 0000000..782968c
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jabber/JabberComponentSupport.java
@@ -0,0 +1,185 @@
+/*
+ * 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.servicemix.components.jabber;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.components.util.OutBinding;
+import org.jivesoftware.smack.AccountManager;
+import org.jivesoftware.smack.PacketListener;
+import org.jivesoftware.smack.XMPPConnection;
+import org.jivesoftware.smack.XMPPException;
+import org.jivesoftware.smack.packet.Packet;
+import org.jivesoftware.smack.packet.XMPPError;
+import org.springframework.beans.factory.InitializingBean;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.InOnly;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+
+/**
+ * @version $Revision: 517251 $
+ */
+public abstract class JabberComponentSupport extends OutBinding implements InitializingBean, PacketListener {
+    private static final transient Log log = LogFactory.getLog(JabberComponentSupport.class);
+
+    private JabberMarshaler marshaler = new JabberMarshaler();
+    private XMPPConnection connection;
+    private String host;
+    private int port;
+    private String user;
+    private String password;
+    private String resource = "ServiceMix";
+    private boolean login = true;
+
+    public void afterPropertiesSet() throws Exception {
+        if (connection == null) {
+            if (host == null) {
+                throw new IllegalArgumentException("You must specify the connection or the host property");
+            }
+        }
+    }
+
+    public void start() throws JBIException {
+        try {
+            if (connection == null) {
+                if (port > 0) {
+                    connection = new XMPPConnection(host, port);
+                }
+                else {
+                    connection = new XMPPConnection(host);
+                }
+            }
+            if (login && !connection.isAuthenticated()) {
+                if (user != null) {
+                    AccountManager accountManager = new AccountManager(connection);
+                    try {
+                        log.info("Logging in to Jabber as user: " + user + " on connection: " + connection);
+                        connection.login(user, password, resource);
+                    } catch (XMPPException e) {
+                        final XMPPError error = e.getXMPPError();
+                        // 401 == Not Authorized
+                        if (error != null && error.getCode() == 401) {
+                            // is ist possible to create Accounts?
+                            if (accountManager.supportsAccountCreation()) {
+                                //try to create the Account (maybe it wasn't there)
+                                accountManager.createAccount(user, password);
+                                log.info("Logging in to Jabber as user: " + user + " on connection: " + connection);
+                                // try to login again (if this fails we are screwed and fail ultimatively)
+                                connection.login(user, password, resource);
+                            }
+                        }
+                    }
+                }
+                else {
+                    log.info("Logging in anonymously to Jabber on connection: " + connection);
+                    connection.loginAnonymously();
+                }
+            }
+        }
+        catch (XMPPException e) {
+            throw new JBIException("Failed to login to Jabber. Reason: " + e, e);
+        }
+    }
+
+    public void stop() throws JBIException {
+        if (connection != null) {
+            connection.close();
+            connection = null;
+        }
+    }
+
+    public void processPacket(Packet packet) {
+        try {
+            InOnly exchange = getExchangeFactory().createInOnlyExchange();
+            NormalizedMessage in = exchange.createMessage();
+            exchange.setInMessage(in);
+            marshaler.toNMS(in, packet);
+            done(exchange);
+        }
+        catch (MessagingException e) {
+            throw new JabberListenerException(e, packet);
+        }
+    }
+
+    // Properties
+    //-------------------------------------------------------------------------
+    public XMPPConnection getConnection() {
+        return connection;
+    }
+
+    public void setConnection(XMPPConnection connection) {
+        this.connection = connection;
+    }
+
+    public String getHost() {
+        return host;
+    }
+
+    public void setHost(String host) {
+        this.host = host;
+    }
+
+    public int getPort() {
+        return port;
+    }
+
+    public void setPort(int port) {
+        this.port = port;
+    }
+
+    public JabberMarshaler getMarshaler() {
+        return marshaler;
+    }
+
+    public void setMarshaler(JabberMarshaler marshaler) {
+        this.marshaler = marshaler;
+    }
+
+    public String getUser() {
+        return user;
+    }
+
+    public void setUser(String user) {
+        this.user = user;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getResource() {
+        return resource;
+    }
+
+    public void setResource(String resource) {
+        this.resource = resource;
+    }
+
+    public boolean isLogin() {
+        return login;
+    }
+
+    public void setLogin(boolean login) {
+        this.login = login;
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/jabber/JabberGroupChatSender.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jabber/JabberGroupChatSender.java
new file mode 100644
index 0000000..745b548
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jabber/JabberGroupChatSender.java
@@ -0,0 +1,89 @@
+/*
+ * 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.servicemix.components.jabber;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.NormalizedMessage;
+
+import org.jivesoftware.smack.GroupChat;
+import org.jivesoftware.smack.packet.Message;
+
+/**
+ * Sends one way messages to a Jabber {@link GroupChat} and receives inbound messages
+ * from the chat
+ *
+ * @version $Revision: 426415 $
+ */
+public class JabberGroupChatSender extends JabberComponentSupport {
+
+    private GroupChat chat;
+    private String room;
+
+    public void afterPropertiesSet() throws Exception {
+        super.afterPropertiesSet();
+        if (chat == null) {
+            if (room == null) {
+                throw new IllegalArgumentException("You must specify the room property");
+            }
+        }
+    }
+
+    public void start() throws JBIException {
+        super.start();
+        if (chat == null) {
+            chat = getConnection().createGroupChat(room);
+        }
+    }
+
+    public void stop() throws JBIException {
+        if (chat != null) {
+            chat.leave();
+            chat = null;
+        }
+        super.stop();
+    }
+
+    // Properties
+    //-------------------------------------------------------------------------
+    public GroupChat getChat() {
+        return chat;
+    }
+
+    public void setChat(GroupChat chat) {
+        this.chat = chat;
+    }
+
+    public String getRoom() {
+        return room;
+    }
+
+    public void setRoom(String room) {
+        this.room = room;
+    }
+
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+    protected void process(MessageExchange messageExchange, NormalizedMessage normalizedMessage) throws Exception {
+        Message message = chat.createMessage();
+        getMarshaler().fromNMS(message, normalizedMessage);
+        chat.sendMessage(message);
+        done(messageExchange);
+    }
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/jabber/JabberListenerException.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jabber/JabberListenerException.java
new file mode 100644
index 0000000..bc73e19
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jabber/JabberListenerException.java
@@ -0,0 +1,37 @@
+/*
+ * 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.servicemix.components.jabber;
+
+import org.jivesoftware.smack.packet.Packet;
+
+/**
+ * A runtime exception thrown when processing inbound Jabber packets.
+ *
+ * @version $Revision: 426415 $
+ */
+public class JabberListenerException extends RuntimeException {
+    private Packet packet;
+
+    public JabberListenerException(Exception cause, Packet packet) {
+        super(cause.getMessage() + ". Was processing packet: " + packet, cause);
+        this.packet = packet;
+    }
+
+    public Packet getPacket() {
+        return packet;
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/jabber/JabberMarshaler.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jabber/JabberMarshaler.java
new file mode 100644
index 0000000..1a10016
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jabber/JabberMarshaler.java
@@ -0,0 +1,147 @@
+/*
+ * 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.servicemix.components.jabber;
+
+import org.apache.servicemix.jbi.jaxp.SourceMarshaler;
+import org.jivesoftware.smack.packet.Message;
+import org.jivesoftware.smack.packet.Packet;
+
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.transform.Source;
+import javax.xml.transform.TransformerException;
+import java.util.Date;
+import java.util.Iterator;
+
+/**
+ * Marshals Jabber messages into and out of NMS messages
+ *
+ * @version $Revision: 429277 $
+ */
+public class JabberMarshaler {
+    private SourceMarshaler sourceMarshaler;
+
+    public JabberMarshaler() {
+        this(new SourceMarshaler());
+    }
+
+    public JabberMarshaler(SourceMarshaler sourceMarshaler) {
+        this.sourceMarshaler = sourceMarshaler;
+    }
+
+    /**
+     * Marshals the Jabber message into an NMS message
+     *
+     * @throws MessagingException
+     */
+    public void toNMS(NormalizedMessage normalizedMessage, Packet packet) throws MessagingException {
+        addNmsProperties(normalizedMessage, packet);
+        if (packet instanceof Message) {
+            Message message = (Message) packet;
+            Source source = sourceMarshaler.asSource(message.getBody());
+            normalizedMessage.setContent(source);
+        }
+
+        // lets add the packet to the NMS
+        normalizedMessage.setProperty("org.apache.servicemix.jabber.packet", packet);
+    }
+
+    /**
+     * Marshals from the Jabber message to the normalized message
+     *
+     * @param message
+     * @param normalizedMessage
+     * @throws TransformerException
+     */
+    public void fromNMS(Message message, NormalizedMessage normalizedMessage) throws TransformerException {
+        // lets create a text message
+        String xml = messageAsString(normalizedMessage);
+        message.setBody(xml);
+        addJabberProperties(message, normalizedMessage);
+    }
+
+    // Properties
+    //-------------------------------------------------------------------------
+    /**
+     * @deprecated use getSourceMarshaler instead
+     */
+    public SourceMarshaler getSourceMarshaller() {
+        return sourceMarshaler;
+    }
+
+    /**
+     * @deprecated use setSourceMashaler instead
+     */
+    public void setSourceMarshaller(SourceMarshaler sourceMarshaler) {
+        this.sourceMarshaler = sourceMarshaler;
+    }
+
+    /**
+     * @return the sourceMarshaler
+     */
+    public SourceMarshaler getSourceMarshaler() {
+        return sourceMarshaler;
+    }
+
+    /**
+     * @param sourceMarshaler the sourceMarshaler to set
+     */
+    public void setSourceMarshaler(SourceMarshaler sourceMarshaler) {
+        this.sourceMarshaler = sourceMarshaler;
+    }
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+
+    /**
+     * Converts the inbound message to a String that can be sent
+     */
+    protected String messageAsString(NormalizedMessage normalizedMessage) throws TransformerException {
+        return sourceMarshaler.asString(normalizedMessage.getContent());
+    }
+
+    /**
+     * Appends properties on the NMS to the JMS Message
+     */
+    protected void addJabberProperties(Message message, NormalizedMessage normalizedMessage) {
+        for (Iterator iter = normalizedMessage.getPropertyNames().iterator(); iter.hasNext();) {
+            String name = (String) iter.next();
+            Object value = normalizedMessage.getProperty(name);
+            if (shouldIncludeHeader(normalizedMessage, name, value)) {
+                message.setProperty(name, value);
+            }
+        }
+    }
+
+    protected void addNmsProperties(NormalizedMessage normalizedMessage, Packet message) {
+        Iterator iter = message.getPropertyNames();
+        while (iter.hasNext()) {
+            String name = (String) iter.next();
+            Object value = message.getProperty(name);
+            normalizedMessage.setProperty(name, value);
+        }
+    }
+
+    /**
+     * Decides whether or not the given header should be included in the JMS message.
+     * By default this includes all suitable typed values
+     */
+    protected boolean shouldIncludeHeader(NormalizedMessage normalizedMessage, String name, Object value) {
+        return value instanceof String || value instanceof Number || value instanceof Date;
+    }
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/jabber/JabberReceiver.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jabber/JabberReceiver.java
new file mode 100644
index 0000000..bf5b8cb
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jabber/JabberReceiver.java
@@ -0,0 +1,65 @@
+/*
+ * 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.servicemix.components.jabber;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+
+import org.jivesoftware.smack.filter.PacketFilter;
+import org.jivesoftware.smack.filter.PacketTypeFilter;
+import org.jivesoftware.smack.packet.Message;
+
+/**
+ * Receives inbound messages or packets and dispatches them into the NMR
+ *
+ * @version $Revision: 426415 $
+ */
+public class JabberReceiver extends JabberComponentSupport {
+
+    private PacketFilter filter;
+
+    public void afterPropertiesSet() throws Exception {
+        super.afterPropertiesSet();
+
+        if (filter == null) {
+            filter = new PacketTypeFilter(Message.class);
+        }
+    }
+
+    public void start() throws JBIException {
+        super.start();  
+        getConnection().addPacketListener(this, filter);
+    }
+
+    // Properties
+    //-------------------------------------------------------------------------
+    public PacketFilter getFilter() {
+        return filter;
+    }
+
+    public void setFilter(PacketFilter filter) {
+        this.filter = filter;
+    }
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+    protected void process(MessageExchange exchange, NormalizedMessage message) throws Exception {
+        throw new MessagingException("This component is not meant to receive inbound messages but received: " + message);
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/jabber/package.html b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jabber/package.html
new file mode 100644
index 0000000..4093382
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jabber/package.html
@@ -0,0 +1,28 @@
+<!--
+
+    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.
+
+-->
+<html>
+<head>
+</head>
+<body>
+
+Bindings for <a href="http://jabber.org/">Jabber</a> using the <a href="http://xmlpp.org/">XMPP</a> protocol via the
+<a href="http://www.jivesoftware.org/smack/">Smack</a> Java client
+
+</body>
+</html>
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/jaxrpc/JaxRpcInBinding.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jaxrpc/JaxRpcInBinding.java
new file mode 100644
index 0000000..0fe8c99
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jaxrpc/JaxRpcInBinding.java
@@ -0,0 +1,39 @@
+/*
+ * 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.servicemix.components.jaxrpc;
+
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.rpc.Call;
+
+import org.apache.servicemix.components.util.OutBinding;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class JaxRpcInBinding extends OutBinding {
+    private JaxRpcMarshaler marshaler = new JaxRpcMarshaler();
+
+
+    protected void process(MessageExchange messageExchange, NormalizedMessage inMessage) throws Exception {
+        Call call = marshaler.createCall(inMessage);
+        Object[] params = marshaler.getCallParams(inMessage);
+
+        call.invokeOneWay(params);
+        done(messageExchange);
+    }
+}
\ No newline at end of file
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/jaxrpc/JaxRpcMarshaler.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jaxrpc/JaxRpcMarshaler.java
new file mode 100644
index 0000000..8a68d11
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jaxrpc/JaxRpcMarshaler.java
@@ -0,0 +1,34 @@
+/*
+ * 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.servicemix.components.jaxrpc;
+
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.rpc.Call;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class JaxRpcMarshaler {
+
+    public Call createCall(NormalizedMessage normalizedMessage) {
+        return null; /** TODO */
+    }
+
+    public Object[] getCallParams(NormalizedMessage normalizedMessage) {
+        return new Object[0]; /** TODO */
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/jaxrpc/package.html b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jaxrpc/package.html
new file mode 100644
index 0000000..60afc79
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jaxrpc/package.html
@@ -0,0 +1,27 @@
+<!--
+
+    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.
+
+-->
+<html>
+<head>
+</head>
+<body>
+
+Bindings for <a href="http://java.sun.com/xml/jaxrpc/">JAX-RPC</a>
+
+</body>
+</html>
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/jdbc/JdbcComponent.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jdbc/JdbcComponent.java
new file mode 100644
index 0000000..38b747c
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jdbc/JdbcComponent.java
@@ -0,0 +1,265 @@
+/*
+ * 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.servicemix.components.jdbc;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.sql.DataSource;
+import javax.xml.transform.Source;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.MessageExchangeListener;
+import org.apache.servicemix.components.util.TransformComponentSupport;
+import org.apache.servicemix.jbi.jaxp.SourceTransformer;
+import org.apache.servicemix.jbi.jaxp.StringSource;
+import org.apache.xpath.CachedXPathAPI;
+import org.w3c.dom.Node;
+
+public class JdbcComponent extends TransformComponentSupport implements MessageExchangeListener {
+    private static final Log log = LogFactory.getLog(JdbcComponent.class);
+
+    private DataSource dataSource;
+    private boolean responseRequired = false;
+
+    public boolean transform(MessageExchange exchange, NormalizedMessage in, NormalizedMessage out) throws MessagingException {
+        log.debug("Received a JDBC request. Datasource=" + dataSource + ", ResponseRequired=" + responseRequired);
+        Connection conn   = null;
+        Statement stmt    = null;
+        ResultSet rs      = null;
+
+        try {
+
+            SourceTransformer domTransform = new SourceTransformer();
+            Node domNode = domTransform.toDOMNode(in);
+
+            // Return the exception message
+//            if (isExceptionXml(domNode)) {
+//                log.debug("Found an exception message: " + domNode);
+//                out.setContent(in.getContent());
+//                return true;
+//            }
+
+            String query = getQuery(domNode);
+            log.debug("Retrieved query: " + query);
+
+            conn = dataSource.getConnection();
+
+            stmt  = conn.createStatement();
+
+            Source outMsg = null;
+            if (query != null && query.length() > 0) {
+                if (stmt.execute(query)) {
+                    // Result is a ResultSet object
+                    rs = stmt.getResultSet();
+
+                    log.debug("Formatting ResultSet: " + rs);
+                    outMsg = toXmlSource(rs);
+                } else {
+                    int updateCount = stmt.getUpdateCount();
+                    if (updateCount > -1) {
+                        log.debug("Formatting UpdateCount: " + updateCount);
+                        // Result is an update count
+                        outMsg = toXmlSource(updateCount);
+                    } else {
+                        log.debug("Formatting NoResult.");
+                        // Result is neither a result set nor an update count
+                        outMsg = null;
+                    }
+                }
+            }
+
+            if (outMsg != null) {
+                // There is a valid response
+                log.debug("Response: " + domTransform.toString(outMsg));
+                out.setContent(outMsg);
+                return true;
+
+            } else if (responseRequired) {
+                // Create an empty <sqlResult> element
+                log.debug("Response: Empty Response");
+                out.setContent(toXmlSource());
+                return true;
+
+            } else {
+                log.debug("Response: No Response");
+                // There is no valid response
+                return false;
+            }
+        } catch (Exception e) {
+            log.error("JDBC Component Exception: ", e);
+//            out.setContent(createExceptionXml(e));
+//            return true;
+            throw new MessagingException(e);
+        } finally {
+            if (rs != null) {
+                try {
+                    rs.close();
+                } catch (SQLException e) {
+                    // Ignore
+                }
+            }
+
+            if (stmt != null) {
+                try {
+                    stmt.close();
+                } catch (SQLException e) {
+                    // Ignore
+                }
+            }
+
+            if (conn != null) {
+                try {
+                    conn.close();
+                } catch (SQLException e) {
+                    // Ignore
+                }
+            }
+        }
+    }
+
+    public String getQuery(Node node) throws Exception {
+        CachedXPathAPI xpath = new CachedXPathAPI();
+
+        node = xpath.selectSingleNode(node, "sql/child::text()");
+
+        // First child should be <sql></sql> element
+        if (node == null) {
+            throw new IllegalStateException("Expecting <sql></sql> node. Found: " + node);
+        }
+
+        return node.getNodeValue();
+    }
+
+    public void setDataSource(DataSource ds) {
+        dataSource = ds;
+    }
+
+    public DataSource getDataSource() {
+        return dataSource;
+    }
+
+    /**
+     * If true, an empty <sqlResult> element is created and send as a response if there is no result
+     * @param val
+     */
+    public void setResponseRequired(boolean val) {
+        responseRequired = val;
+    }
+
+    public boolean getResponseRequired() {
+        return responseRequired;
+    }
+
+    protected Source toXmlSource(ResultSet rs) throws Exception {
+
+        ResultSetMetaData meta = rs.getMetaData();
+        int colCount = meta.getColumnCount();
+
+        String[] colNames = getUniqueColumnNames(meta);
+        
+        StringBuffer buff = new StringBuffer("");
+
+        while (rs.next()) {
+            buff.append("<row ");
+            for (int i = 0; i < colCount; i++) {
+                buff.append(colNames[i].toLowerCase() + "='" + rs.getString(i + 1) + "' ");
+            }
+            buff.append("/>");
+        }
+
+        if (buff.length() > 0) {
+            // If non-empty result, insert parent tags
+            buff.insert(0, "<sqlResult><resultSet>");
+            buff.append("</resultSet></sqlResult>");
+        } else {
+            // If empty result, return null source
+            return null;
+        }
+
+        return new StringSource(buff.toString());
+    }
+
+    /**
+     * Returns a String[] containing unique ColNames. 
+     */
+    protected String[] getUniqueColumnNames(ResultSetMetaData metaData) throws SQLException {
+
+        List colNames = new LinkedList();
+        Map chanedNames = new HashMap();
+
+        for (int i = 1; i <= metaData.getColumnCount(); i++) {
+            String name = metaData.getColumnName(i);
+
+            if (name.equals("")) {
+                name = "__unknown_column__";
+            }
+
+            if (colNames.contains(name)) {
+
+                int count;
+                if (chanedNames.containsKey(name)) {
+                    Integer integer = (Integer) chanedNames.get(name);
+                    Integer newInteger = new Integer(integer.intValue() + 1);
+                    chanedNames.put(name, newInteger);
+                    count = newInteger.intValue();
+                } else {
+                    chanedNames.put(name, new Integer(1));
+                    count = 1;
+                }
+
+                name = name + "_" + count;
+
+            }
+
+            colNames.add(name);
+
+        }
+
+        return (String[]) colNames.toArray(new String[colNames.size()]);
+    }
+
+    protected Source toXmlSource(int updateCount) throws Exception {
+        return new StringSource("<sqlResult><updateCount value='" + updateCount + "'/></sqlResult>");
+    }
+
+    protected Source toXmlSource() throws Exception {
+        return new StringSource("<sqlResult></sqlResult>");
+    }
+
+
+    // Custom method to create and handle exception
+    /*
+    public boolean isExceptionXml(Node document) {
+        return document.getFirstChild().getNodeName().equalsIgnoreCase("exception");
+    }
+
+    public Source createExceptionXml(Throwable e) {
+        return new StringSource("<exception class='" + e.getClass() + "'>'" + e.getMessage() + "'</exception>");
+    } */
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/DestinationChooser.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/DestinationChooser.java
new file mode 100644
index 0000000..969cccc
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/DestinationChooser.java
@@ -0,0 +1,33 @@
+/*
+ * 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.servicemix.components.jms;
+
+import javax.jbi.messaging.MessageExchange;
+import javax.jms.Destination;
+
+/**
+ * A pluggable strategy used to decide which JMS Destination to use for an outbound JMS message
+ *
+ * @version $Revision: 426415 $
+ */
+public interface DestinationChooser {
+
+    /**
+     * Chooses which JMS destintation to use for the outbound message
+     */
+    Destination chooseDestination(MessageExchange messageExchange);
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/JBIJMSException.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/JBIJMSException.java
new file mode 100644
index 0000000..7812da4
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/JBIJMSException.java
@@ -0,0 +1,32 @@
+/*
+ * 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.servicemix.components.jms;
+
+import javax.jbi.JBIException;
+import javax.jms.JMSException;
+
+/**
+ * Thrown when a JMS message is thrown from inside a JMS binding
+ * component for the JBI container
+ *
+ * @version $Revision: 426415 $
+ */
+public class JBIJMSException extends JBIException {
+    public JBIJMSException(JMSException cause) {
+        super(cause);
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/JmsInBinding.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/JmsInBinding.java
new file mode 100644
index 0000000..d300c61
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/JmsInBinding.java
@@ -0,0 +1,102 @@
+/*
+ * 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.servicemix.components.jms;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.ExchangeStatus;
+import javax.jbi.messaging.InOnly;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageListener;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.MessageExchangeListener;
+import org.apache.servicemix.components.util.ComponentSupport;
+import org.apache.servicemix.jbi.RuntimeJBIException;
+
+/**
+ * A JMS {@link MessageListener} which sends the inbound JMS message into the JBI container
+ * for processing
+ *
+ * @version $Revision: 487499 $
+ */
+public class JmsInBinding extends ComponentSupport implements MessageListener, MessageExchangeListener {
+    private static final Log log = LogFactory.getLog(JmsInBinding.class);
+
+    private JmsMarshaler marshaler = new JmsMarshaler();
+    private boolean synchronous = false;
+
+    /**
+     * @return the synchronous
+     */
+    public boolean isSynchronous() {
+        return synchronous;
+    }
+
+    /**
+     * @param synchronous the synchronous to set
+     */
+    public void setSynchronous(boolean synchronous) {
+        this.synchronous = synchronous;
+    }
+
+    public JmsMarshaler getMarshaler() {
+        return marshaler;
+    }
+
+    public void setMarshaler(JmsMarshaler marshaler) {
+        this.marshaler = marshaler;
+    }
+
+    public void onMessage(Message jmsMessage) {
+        if (log.isTraceEnabled()) {
+            log.trace("Received: " + jmsMessage);
+        }
+
+        try {
+            InOnly messageExchange = getDeliveryChannel().createExchangeFactory().createInOnlyExchange();
+            NormalizedMessage inMessage = messageExchange.createMessage();
+
+            try {
+                marshaler.toNMS(inMessage, jmsMessage);
+
+                messageExchange.setInMessage(inMessage);
+                if (synchronous) {
+                    getDeliveryChannel().sendSync(messageExchange);
+                } else {
+                    getDeliveryChannel().send(messageExchange);
+                }
+            }
+            catch (JMSException e) {
+                messageExchange.setError(e);
+                messageExchange.setStatus(ExchangeStatus.ERROR);
+            }
+        }
+        catch (JBIException e) {
+            throw new RuntimeJBIException(e);
+        }
+    }
+
+    public void onMessageExchange(MessageExchange exchange) throws MessagingException {
+        // Do nothing as we only send in-only
+        // but this ensure that messages are not queued in the DeliveryChannel
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/JmsInUsingJCABinding.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/JmsInUsingJCABinding.java
new file mode 100644
index 0000000..51040b7
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/JmsInUsingJCABinding.java
@@ -0,0 +1,116 @@
+/*
+ * 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.servicemix.components.jms;
+
+import javax.jbi.JBIException;
+import javax.resource.spi.ActivationSpec;
+import javax.transaction.TransactionManager;
+
+import org.jencks.JCAConnector;
+import org.jencks.JCAContainer;
+import org.jencks.SingletonEndpointFactory;
+import org.springframework.beans.factory.BeanNameAware;
+
+/**
+ * Uses the JCA Container for better inbound subscription.
+ *
+ * @version $Revision: 487499 $
+ */
+public class JmsInUsingJCABinding extends JmsInBinding implements BeanNameAware {
+
+    private JCAContainer jcaContainer;
+    private ActivationSpec activationSpec;
+    private TransactionManager transactionManager;
+    private JCAConnector jcaConnector;
+    private String name;
+
+    protected void init() throws JBIException {
+        if (jcaContainer == null) {
+            throw new IllegalArgumentException("Must specify a jcaContainer property");
+        }
+        if (activationSpec == null) {
+            throw new IllegalArgumentException("Must specify an activationSpec property");
+        }
+        jcaConnector = jcaContainer.addConnector();
+        jcaConnector.setActivationSpec(activationSpec);
+        if (transactionManager == null) {
+        	transactionManager = (TransactionManager) getContext().getTransactionManager();
+        }
+        if (transactionManager != null) {
+            jcaConnector.setTransactionManager(transactionManager);
+        }
+        SingletonEndpointFactory ef = new SingletonEndpointFactory(this, transactionManager);
+        ef.setName(name);
+        jcaConnector.setEndpointFactory(ef);
+        try {
+        	jcaConnector.afterPropertiesSet();
+        } catch (Exception e) {
+        	throw new JBIException("Unable to initialize jca connector", e);
+        }
+        super.init();
+    }
+    
+    public void start() throws JBIException {
+        try {
+            jcaConnector.start();
+        } catch (Exception e) {
+            throw new JBIException("Unable to start jca connector", e);
+        }
+        super.start();
+    }
+    
+    public void stop() throws JBIException {
+        super.stop();
+        try {
+            jcaConnector.destroy();
+        } catch (Exception e) {
+            throw new JBIException("Unable to stop jca connector", e);
+        }
+    }
+
+    public JCAContainer getJcaContainer() {
+        return jcaContainer;
+    }
+
+    public void setJcaContainer(JCAContainer jcaContainer) {
+        this.jcaContainer = jcaContainer;
+    }
+
+    public ActivationSpec getActivationSpec() {
+        return activationSpec;
+    }
+
+    public void setActivationSpec(ActivationSpec activationSpec) {
+        this.activationSpec = activationSpec;
+    }
+
+    public TransactionManager getTransactionManager() {
+        return transactionManager;
+    }
+
+    public void setTransactionManager(TransactionManager transactionManager) {
+        this.transactionManager = transactionManager;
+    }
+
+    public JCAConnector getJcaConnector() {
+        return jcaConnector;
+    }
+
+    public void setBeanName(String name) {
+        this.name = name;
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/JmsMarshaler.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/JmsMarshaler.java
new file mode 100644
index 0000000..be56c2c
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/JmsMarshaler.java
@@ -0,0 +1,152 @@
+/*
+ * 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.servicemix.components.jms;
+
+import org.apache.servicemix.jbi.jaxp.SourceMarshaler;
+
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+import javax.xml.transform.Source;
+import javax.xml.transform.TransformerException;
+import java.util.Date;
+import java.util.Enumeration;
+import java.util.Iterator;
+
+/**
+ * Marshalls JMS messages into and out of NMS messages
+ *
+ * @version $Revision: 426415 $
+ */
+public class JmsMarshaler {
+    private SourceMarshaler sourceMarshaler;
+    
+    private boolean needJavaIdentifiers;
+
+    public JmsMarshaler() {
+        this(new SourceMarshaler());
+    }
+
+    public JmsMarshaler(SourceMarshaler sourceMarshaler) {
+        this.sourceMarshaler = sourceMarshaler;
+    }
+
+    /**
+     * Marshalls the JMS message into an NMS message
+     *
+     * @throws MessagingException
+     */
+    public void toNMS(NormalizedMessage normalizedMessage, Message message) throws JMSException, MessagingException {
+        addNmsProperties(normalizedMessage, message);
+        if (message instanceof TextMessage) {
+            TextMessage textMessage = (TextMessage) message;
+            Source source = sourceMarshaler.asSource(textMessage.getText());
+            normalizedMessage.setContent(source);
+        }
+
+        // lets add the message to the NMS
+        // Fix SM-178 : the message exchange is not serializable
+        //normalizedMessage.setProperty("org.apache.servicemix.jms.message", message);
+    }
+
+    public Message createMessage(NormalizedMessage normalizedMessage, Session session) throws JMSException, TransformerException {
+        // lets create a text message
+        String xml = messageAsString(normalizedMessage);
+        TextMessage message = session.createTextMessage(xml);
+        addJmsProperties(message, normalizedMessage);
+        return message;
+    }
+
+    // Properties
+    //-------------------------------------------------------------------------
+    public SourceMarshaler getSourceMarshaller() {
+        return sourceMarshaler;
+    }
+
+    public void setSourceMarshaller(SourceMarshaler sourceMarshaler) {
+        this.sourceMarshaler = sourceMarshaler;
+    }
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+
+    /**
+     * Converts the inbound message to a String that can be sent
+     */
+    protected String messageAsString(NormalizedMessage normalizedMessage) throws TransformerException {
+        return sourceMarshaler.asString(normalizedMessage.getContent());
+    }
+
+    /**
+     * Appends properties on the NMS to the JMS Message
+     */
+    protected void addJmsProperties(Message message, NormalizedMessage normalizedMessage) throws JMSException {
+        for (Iterator iter = normalizedMessage.getPropertyNames().iterator(); iter.hasNext();) {
+            String name = (String) iter.next();
+            Object value = normalizedMessage.getProperty(name);
+            if (shouldIncludeHeader(normalizedMessage, name, value)) {
+                message.setObjectProperty(name, value);
+            }
+        }
+    }
+
+    protected void addNmsProperties(NormalizedMessage message, Message jmsMessage) throws JMSException {
+        Enumeration enumeration = jmsMessage.getPropertyNames();
+        while (enumeration.hasMoreElements()) {
+            String name = (String) enumeration.nextElement();
+            Object value = jmsMessage.getObjectProperty(name);
+            message.setProperty(name, value);
+        }
+    }
+
+    /**
+     * Decides whether or not the given header should be included in the JMS message.
+     * By default this includes all suitable typed values
+     */
+    protected boolean shouldIncludeHeader(NormalizedMessage normalizedMessage, String name, Object value) {
+        return (value instanceof String || value instanceof Number || value instanceof Date) &&
+               (!isNeedJavaIdentifiers() || isJavaIdentifier(name));
+    }
+    
+    private static boolean isJavaIdentifier(String s) {
+        int n = s.length();
+        if (n==0) return false;
+        if (!Character.isJavaIdentifierStart(s.charAt(0)))
+            return false;
+        for (int i = 1; i < n; i++)
+            if (!Character.isJavaIdentifierPart(s.charAt(i)))
+                return false;
+        return true;
+      }
+
+    /**
+     * @return Returns the needJavaIdentifiers.
+     */
+    public boolean isNeedJavaIdentifiers() {
+        return needJavaIdentifiers;
+    }
+
+    /**
+     * @param needJavaIdentifiers The needJavaIdentifiers to set.
+     */
+    public void setNeedJavaIdentifiers(boolean needJavaIdentifiers) {
+        this.needJavaIdentifiers = needJavaIdentifiers;
+    }    
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/JmsReceiverComponent.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/JmsReceiverComponent.java
new file mode 100644
index 0000000..64ca77c
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/JmsReceiverComponent.java
@@ -0,0 +1,142 @@
+/*
+ * 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.servicemix.components.jms;
+
+import javax.jbi.JBIException;
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.MessageConsumer;
+import javax.jms.Session;
+
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.jms.core.JmsTemplate;
+
+/**
+ * A component which uses a {@link JmsTemplate} to consume messages from a
+ * destination.
+ *
+ * @version $Revision: 466982 $
+ */
+public class JmsReceiverComponent extends JmsInBinding implements InitializingBean {
+    private JmsTemplate template;
+    private String selector;
+    private MessageConsumer consumer;
+    private ConnectionFactory connectionFactory;
+    private Connection connection;
+    private Session session;
+
+    public void afterPropertiesSet() throws Exception {
+        if (template == null) {
+            throw new IllegalArgumentException("Must have a template set");
+        }
+    }
+    
+    public void start() throws JBIException {
+        // Start receiving messages only when the component has actually been started.
+        super.start();
+        try {
+            connectionFactory = template.getConnectionFactory();
+            /*
+             * Component code did not work for JMS 1.02 compliant provider because uses APIs
+             * that did not exist in JMS 1.02 : ConnectionFactory.createConnection,
+             * Connection.createSession
+             */
+            if (template instanceof org.springframework.jms.core.JmsTemplate102) {
+                //Note1 - would've preferred to call JmsTemplate102 methods but they are protected.
+                if (template.isPubSubDomain()) {
+                    javax.jms.TopicConnection tc;
+                    connection = tc = ((javax.jms.TopicConnectionFactory)connectionFactory).createTopicConnection();
+                    session = tc.createTopicSession(template.isSessionTransacted(), template.getSessionAcknowledgeMode());
+                }
+                else {
+                    javax.jms.QueueConnection qc;
+                    connection = qc = ((javax.jms.QueueConnectionFactory)connectionFactory).createQueueConnection();
+                    session = qc.createQueueSession(template.isSessionTransacted(), template.getSessionAcknowledgeMode());
+                }
+            } else { // JMS 1.1 style
+                connection = connectionFactory.createConnection();
+                session = connection.createSession(template.isSessionTransacted(), template.getSessionAcknowledgeMode());
+            }
+
+            Destination defaultDestination = template.getDefaultDestination();
+            if (defaultDestination == null) {
+                defaultDestination = template.getDestinationResolver().resolveDestinationName(session, template.getDefaultDestinationName(),
+                        template.isPubSubDomain());
+            }
+
+            /*
+             * Component code did not work for JMS 1.02 compliant provider because uses APIs
+             * that did not exist in JMS 1.02: Session.createConsumer
+             */
+            if (template instanceof org.springframework.jms.core.JmsTemplate102) {
+                //Note1 - would've preferred to call JmsTemplate102.createConsumer but it is protected. Code below is same.
+                //Note2 - assert that defaultDestination is correct type according to isPubSubDomain()
+                if (template.isPubSubDomain()) {
+                    consumer = ((javax.jms.TopicSession)session).createSubscriber((javax.jms.Topic)defaultDestination, selector, template.isPubSubNoLocal());
+                } else {
+                    consumer = ((javax.jms.QueueSession)session).createReceiver((javax.jms.Queue)defaultDestination, selector);
+                }
+            } else { // JMS 1.1 style
+                consumer = session.createConsumer(defaultDestination, selector);
+            }
+            connection.start();
+            consumer.setMessageListener(this);
+        } catch (JMSException e) {
+            throw new JBIException("Unable to start jms component", e);
+        }
+    }
+
+    public void stop() throws JBIException {
+        try {
+            if (consumer != null) {
+                consumer.close();
+            }
+            if (session != null) {
+                session.close();
+            }
+            if (connection != null) {
+                connection.close();
+            }
+        } catch (JMSException e) {
+            throw new JBIException("Unable to stop jms component", e);
+        } finally {
+            connection = null;
+            session = null;
+            consumer = null;
+        }
+    }
+
+    public JmsTemplate getTemplate() {
+        return template;
+    }
+
+    public void setTemplate(JmsTemplate template) {
+        this.template = template;
+    }
+
+    public String getSelector() {
+        return selector;
+    }
+
+    public void setSelector(String selector) {
+        this.selector = selector;
+    }
+
+}
+
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/JmsSenderComponent.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/JmsSenderComponent.java
new file mode 100644
index 0000000..af6ccc7
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/JmsSenderComponent.java
@@ -0,0 +1,99 @@
+/*
+ * 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.servicemix.components.jms;
+
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.Session;
+import javax.xml.transform.TransformerException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.components.util.OutBinding;
+import org.springframework.jms.core.JmsTemplate;
+import org.springframework.jms.core.MessageCreator;
+
+/**
+ * Consumers JBI messages and sends them to a JMS destination using the Spring
+ * {@link JmsTemplate}
+ *
+ * @version $Revision: 426415 $
+ */
+public class JmsSenderComponent extends OutBinding {
+
+    private static final Log log = LogFactory.getLog(JmsSenderComponent.class);
+
+    private JmsTemplate template;
+    private JmsMarshaler marshaler = new JmsMarshaler();
+
+
+    // Properties
+    //-------------------------------------------------------------------------
+    public JmsTemplate getTemplate() {
+        return template;
+    }
+
+    public void setTemplate(JmsTemplate template) {
+        this.template = template;
+    }
+
+    public JmsMarshaler getMarshaler() {
+        return marshaler;
+    }
+
+    public void setMarshaler(JmsMarshaler marshaler) {
+        this.marshaler = marshaler;
+    }
+
+    /**
+     * @return Returns the needJavaIdentifiers.
+     */
+    public boolean isNeedJavaIdentifiers() {
+        return this.marshaler.isNeedJavaIdentifiers();
+    }
+
+    /**
+     * @param needJavaIdentifiers The needJavaIdentifiers to set.
+     */
+    public void setNeedJavaIdentifiers(boolean needJavaIdentifiers) {
+        this.marshaler.setNeedJavaIdentifiers(needJavaIdentifiers);
+    }    
+    
+    // Implementation methods
+    //-------------------------------------------------------------------------
+    protected void process(MessageExchange exchange, final NormalizedMessage inMessage) throws Exception {
+        template.send(new MessageCreator() {
+            public Message createMessage(Session session) throws JMSException {
+                try {
+                    Message message = marshaler.createMessage(inMessage, session);
+                    if (log.isTraceEnabled()) {
+                        log.trace("Sending message to: " + template.getDefaultDestinationName() + " message: " + message);
+                    }
+                    return message;
+                }
+                catch (TransformerException e) {
+                    JMSException jmsEx =  new JMSException("Failed to create JMS Message: " + e);
+                    jmsEx.setLinkedException(e);
+                    throw jmsEx;
+                }
+            }
+        });
+        done(exchange);
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/JmsServiceComponent.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/JmsServiceComponent.java
new file mode 100644
index 0000000..eb792aa
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/JmsServiceComponent.java
@@ -0,0 +1,312 @@
+/*
+ * 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.servicemix.components.jms;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.ExchangeStatus;
+import javax.jbi.messaging.InOut;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageListener;
+import javax.jms.Session;
+import javax.xml.transform.TransformerException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.components.util.ComponentSupport;
+import org.apache.servicemix.executors.Executor;
+import org.apache.servicemix.executors.ExecutorFactory;
+import org.apache.servicemix.jbi.framework.ComponentContextImpl;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.jms.JmsException;
+import org.springframework.jms.core.JmsTemplate;
+import org.springframework.jms.core.MessageCreator;
+
+/**
+ * A component which uses a {@link JmsTemplate} to consume messages from a destination, forward then intot the JBI
+ * container for processing, and send back the result to the JMS requestor - used for the TopipcRequestor and
+ * QueueRequestor pattern
+ * 
+ * @version $Revision: 466982 $
+ */
+public class JmsServiceComponent extends ComponentSupport implements MessageListener, InitializingBean {
+    private static final Log log = LogFactory.getLog(JmsServiceComponent.class);
+    private DestinationChooser destinationChooser;
+    private JmsMarshaler marshaler = new JmsMarshaler();
+    private JmsTemplate template;
+    private String selector;
+    private MessageConsumer consumer;
+    private ConnectionFactory connectionFactory;
+    private Connection connection;
+    private Session session;
+    private Executor executor;
+
+    /**
+     * called by Spring framework after initialization
+     * @throws Exception 
+     */
+    public void afterPropertiesSet() throws Exception {
+        if (template == null) {
+            throw new IllegalArgumentException("Must have a template set");
+        }
+    }
+
+    public void start() throws JBIException {
+        // Start receiving messages only when the component has actually been started.
+        super.start();
+        try {
+            connectionFactory = template.getConnectionFactory();
+            /*
+             * Component code did not work for JMS 1.02 compliant provider because uses APIs
+             * that did not exist in JMS 1.02 : ConnectionFactory.createConnection,
+             * Connection.createSession
+             */
+            if (template instanceof org.springframework.jms.core.JmsTemplate102) {
+                //Note1 - would've preferred to call JmsTemplate102 methods but they are protected.
+                if (template.isPubSubDomain()) {
+                    javax.jms.TopicConnection tc;
+                    connection = tc = ((javax.jms.TopicConnectionFactory)connectionFactory).createTopicConnection();
+                    session = tc.createTopicSession(template.isSessionTransacted(), template.getSessionAcknowledgeMode());
+                }
+                else {
+                    javax.jms.QueueConnection qc;
+                    connection = qc = ((javax.jms.QueueConnectionFactory)connectionFactory).createQueueConnection();
+                    session = qc.createQueueSession(template.isSessionTransacted(), template.getSessionAcknowledgeMode());
+                }
+            } else { // JMS 1.1 style
+                connection = connectionFactory.createConnection();
+                session = connection.createSession(template.isSessionTransacted(), template.getSessionAcknowledgeMode());
+            }
+
+            Destination defaultDestination = template.getDefaultDestination();
+            if (defaultDestination == null) {
+                defaultDestination = template.getDestinationResolver().resolveDestinationName(session, template.getDefaultDestinationName(),
+                        template.isPubSubDomain());
+            }
+            
+            /*
+             * Component code did not work for JMS 1.02 compliant provider because uses APIs
+             * that did not exist in JMS 1.02: Session.createConsumer
+             */
+            if (template instanceof org.springframework.jms.core.JmsTemplate102) {
+                //Note1 - would've preferred to call JmsTemplate102.createConsumer but it is protected. Code below is same.
+                //Note2 - assert that defaultDestination is correct type according to isPubSubDomain()
+                if (template.isPubSubDomain()) {
+                    consumer = ((javax.jms.TopicSession)session).createSubscriber((javax.jms.Topic)defaultDestination, selector, template.isPubSubNoLocal());
+                } else {
+                    consumer = ((javax.jms.QueueSession)session).createReceiver((javax.jms.Queue)defaultDestination, selector);
+                }
+            } else { // JMS 1.1 style
+                consumer = session.createConsumer(defaultDestination, selector);
+            }
+            connection.start();
+            consumer.setMessageListener(this);
+        } catch (JMSException e) {
+            throw new JBIException("Unable to start jms component", e);
+        }
+    }
+
+    public void stop() throws JBIException {
+        try {
+            if (consumer != null) {
+                consumer.close();
+            }
+            if (session != null) {
+                session.close();
+            }
+            if (connection != null) {
+                connection.close();
+            }
+        } catch (JMSException e) {
+            throw new JBIException("Unable to stop jms component", e);
+        } finally {
+            connection = null;
+            session = null;
+            consumer = null;
+        }
+    }
+
+    protected void init() throws JBIException {
+        ComponentContextImpl context = (ComponentContextImpl) getContext();
+        ExecutorFactory factory = context.getContainer().getExecutorFactory();
+        executor = factory.createExecutor("component." + context.getComponentName());
+        super.init();
+    }
+
+    /**
+     * @return Return the DestinationChooser
+     */
+    public DestinationChooser getDestinationChooser() {
+        return destinationChooser;
+    }
+
+    /**
+     * Set the DestinationChooser
+     * 
+     * @param destinationChooser
+     */
+    public void setDestinationChooser(DestinationChooser destinationChooser) {
+        this.destinationChooser = destinationChooser;
+    }
+
+    /**
+     * Get the JMSMarshaler
+     * 
+     * @return the marshaler
+     */
+    public JmsMarshaler getMarshaler() {
+        return marshaler;
+    }
+
+    /**
+     * Set the JMSMarshaler
+     * 
+     * @param marshaler
+     */
+    public void setMarshaler(JmsMarshaler marshaler) {
+        this.marshaler = marshaler;
+    }
+
+    /**
+     * @return the JmsTemplate
+     */
+    public JmsTemplate getTemplate() {
+        return template;
+    }
+
+    /**
+     * Set the JmsTemplate
+     * 
+     * @param template
+     */
+    public void setTemplate(JmsTemplate template) {
+        this.template = template;
+    }
+
+    /**
+     * @return Return the selector
+     */
+    public String getSelector() {
+        return selector;
+    }
+
+    /**
+     * Set the Selector
+     * 
+     * @param selector
+     */
+    public void setSelector(String selector) {
+        this.selector = selector;
+    }
+
+    /**
+     * MessageListener implementation
+     * @param jmsMessage 
+     */
+    public void onMessage(final Message jmsMessage) {
+        executor.execute(new Runnable() {
+            public void run() {
+                handleMessage(jmsMessage);
+            }
+        });
+    }
+    
+    protected void handleMessage(final Message jmsMessage) {
+        try {
+            final InOut messageExchange = getDeliveryChannel().createExchangeFactory().createInOutExchange();
+            NormalizedMessage inMessage = messageExchange.createMessage();
+            try {
+                marshaler.toNMS(inMessage, jmsMessage);
+                messageExchange.setInMessage(inMessage);
+                if (getDeliveryChannel().sendSync(messageExchange)) {
+                    Destination destination = getReplyToDestination(jmsMessage, messageExchange);
+                    try {
+                        template.send(destination, new MessageCreator() {
+                            public Message createMessage(Session session) throws JMSException {
+                                try {
+                                    Message message = marshaler.createMessage(messageExchange.getOutMessage(), session);
+                                    message.setJMSCorrelationID(jmsMessage.getJMSCorrelationID());
+                                    if (log.isTraceEnabled()) {
+                                        log.trace("Sending message to: " + template.getDefaultDestinationName()
+                                                + " message: " + message);
+                                    }
+                                    return message;
+                                }
+                                catch (TransformerException e) {
+                                    JMSException jmsEx = new JMSException("Failed to create a JMS Message: " + e);
+                                    jmsEx.setLinkedException(e);
+                                    throw jmsEx;
+                                }
+                            }
+                        });
+                        done(messageExchange);
+                    }
+                    catch (JmsException e) {
+                        fail(messageExchange, e);
+                    }
+                }
+            }
+            catch (JMSException e) {
+                log.error("Couldn't process " + jmsMessage, e);
+                messageExchange.setError(e);
+                messageExchange.setStatus(ExchangeStatus.ERROR);
+            }
+        }
+        catch (MessagingException e) {
+            log.error("Failed to process inbound JMS Message: " + jmsMessage, e);
+        }
+    }
+
+    protected Destination getReplyToDestination(Message jmsMessage, final InOut messageExchange) throws JMSException {
+        if (destinationChooser == null) {
+            return jmsMessage.getJMSReplyTo();
+        }
+        return destinationChooser.chooseDestination(messageExchange);
+    }
+
+    /**
+     * Choose the out bound destination to send the repsonse from JBI too If a DestinatonChooser is set, this is used,
+     * else the replyTo destination on the inbound message is used
+     * 
+     * @param exchange
+     * @param inboundMessage
+     * @return the choosen outbound destination or null
+     * @throws JMSException if no destination can be found
+     */
+    protected Destination chooseOutBoundDestination(MessageExchange exchange, Message inboundMessage)
+            throws JMSException {
+        Destination result = null;
+        if (destinationChooser != null) {
+            result = destinationChooser.chooseDestination(exchange);
+        }
+        else if (inboundMessage != null && inboundMessage.getJMSReplyTo() != null) {
+            result = inboundMessage.getJMSReplyTo();
+        }
+        if (result == null) {
+            log.error("Could not find an outbound destination for " + inboundMessage);
+            throw new JMSException("No outbound JMS Destination can be found");
+        }
+        return result;
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/RuntimeJMSException.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/RuntimeJMSException.java
new file mode 100644
index 0000000..815b0c7
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/RuntimeJMSException.java
@@ -0,0 +1,33 @@
+/*
+ * 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.servicemix.components.jms;
+
+import javax.jms.JMSException;
+
+/**
+ * A runtime exception caused when a JMS exception is thrown
+ * in a method which cannot throw a checked exception such
+ * as inside a JMS {@link javax.jms.MessageListener#onMessage(javax.jms.Message)} method.
+ *
+ * @version $Revision: 426415 $
+ */
+public class RuntimeJMSException extends RuntimeException {
+
+    public RuntimeJMSException(JMSException cause) {
+        super(cause);
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/SimpleDestinationChooser.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/SimpleDestinationChooser.java
new file mode 100644
index 0000000..0a4aea8
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/SimpleDestinationChooser.java
@@ -0,0 +1,58 @@
+/*
+ * 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.servicemix.components.jms;
+
+import javax.jbi.messaging.MessageExchange;
+import javax.jms.Destination;
+
+/**
+ * A simple destination chooser which will use the value of the {@link #OUT_DESTINATION_KEY}
+ * property on the message exchange, or fall back to a default destination
+ *
+ * @version $Revision: 426415 $
+ */
+public class SimpleDestinationChooser implements DestinationChooser {
+    public static final String OUT_DESTINATION_KEY = "org.apache.servicemix.binding.jms.out.destination";
+
+    private Destination defaultDestination;
+
+    public SimpleDestinationChooser() {
+    }
+
+    public SimpleDestinationChooser(Destination defaultDestination) {
+        this.defaultDestination = defaultDestination;
+    }
+
+    public Destination chooseDestination(MessageExchange messageExchange) {
+        Object property = messageExchange.getProperty(OUT_DESTINATION_KEY);
+        if (property instanceof Destination) {
+            return (Destination) property;
+        }
+        return getDefaultDestination();
+    }
+
+    // Properties
+    //-------------------------------------------------------------------------
+    public Destination getDefaultDestination() {
+        return defaultDestination;
+    }
+
+    public void setDefaultDestination(Destination defaultDestination) {
+        this.defaultDestination = defaultDestination;
+    }
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/package.html b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/package.html
new file mode 100644
index 0000000..65924de
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jms/package.html
@@ -0,0 +1,27 @@
+<!--
+
+    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.
+
+-->
+<html>
+<head>
+</head>
+<body>
+
+Bindings for <a href="http://java.sun.com/products/jms/">JMS</a>
+
+</body>
+</html>
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/jmx/CounterMonitorComponent.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jmx/CounterMonitorComponent.java
new file mode 100644
index 0000000..0438082
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/jmx/CounterMonitorComponent.java
@@ -0,0 +1,281 @@
+/*
+ * 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.servicemix.components.jmx;
+
+import javax.jbi.JBIException;
+import javax.jbi.component.ComponentContext;
+import javax.jbi.management.DeploymentException;
+import javax.jbi.messaging.InOnly;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.management.MBeanServer;
+import javax.management.Notification;
+import javax.management.NotificationListener;
+import javax.management.ObjectName;
+import javax.management.monitor.CounterMonitor;
+import javax.xml.transform.Source;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.MessageExchangeListener;
+import org.apache.servicemix.components.util.ComponentSupport;
+import org.apache.servicemix.jbi.jaxp.StringSource;
+
+/**
+ * A JMX Counter Monitor as a Component to enable firing notifications
+ * 
+ * @version $Revision: 426415 $
+ */
+public class CounterMonitorComponent extends ComponentSupport implements NotificationListener, MessageExchangeListener {
+    
+    private static final Log log = LogFactory.getLog(ComponentSupport.class);
+    private String name;
+    private ObjectName ourName;
+    private String observedObjectName;
+    private String attributeName;
+    private long granularityPeriod =5000;
+    private Number threshold;
+    private Number offset;
+    private MBeanServer mbeanServer;
+    private CounterMonitor counterMonitor = new CounterMonitor();
+
+    /**
+     * Called when the Component is initialized
+     * 
+     * @param cc
+     * @throws JBIException
+     */
+    public void init(ComponentContext cc) throws JBIException {
+        super.init(cc);
+        validate();
+        if (mbeanServer == null) {
+            mbeanServer = cc.getMBeanServer();
+        }
+        try {
+            ObjectName observedName = new ObjectName(observedObjectName);
+            if (name == null) {
+                String type = observedName.getKeyProperty("type");
+                type = type != null ? type : "UNKNOWN";
+                name = mbeanServer.getDefaultDomain() + ":type=CounterMonitor_" + type;
+            }
+            ourName = new ObjectName(name);
+            counterMonitor.setNotify(true);
+            counterMonitor.addObservedObject(observedName);
+            counterMonitor.setObservedAttribute(attributeName);
+            counterMonitor.setGranularityPeriod(granularityPeriod);
+            counterMonitor.setDifferenceMode(false);
+            counterMonitor.setInitThreshold(threshold);
+            counterMonitor.setOffset(offset);
+            mbeanServer.registerMBean(counterMonitor, ourName);
+            mbeanServer.addNotificationListener(ourName, this, null, new Object());
+        } catch (Exception e) {
+            throw new DeploymentException(e);
+        }
+    }
+
+    /**
+     * Start the item.
+     * 
+     * @exception javax.jbi.JBIException
+     *                if the item fails to start.
+     */
+    public void start() throws javax.jbi.JBIException {
+        super.start();
+        counterMonitor.start();
+    }
+
+    /**
+     * Stop the item. This suspends current messaging activities.
+     * 
+     * @exception javax.jbi.JBIException
+     *                if the item fails to stop.
+     */
+    public void stop() throws javax.jbi.JBIException {
+        counterMonitor.stop();
+        super.stop();
+    }
+
+    /**
+     * Shut down the item. The releases resources, preparatory to uninstallation.
+     * 
+     * @exception javax.jbi.JBIException
+     *                if the item fails to shut down.
+     */
+    public void shutDown() throws javax.jbi.JBIException {
+        stop();
+        if (ourName != null && mbeanServer != null) {
+            try{
+                mbeanServer.removeNotificationListener(ourName,this);
+            } catch(Exception e) {
+                throw new JBIException(e);
+            }
+        }
+        super.shutDown();
+    }
+
+   
+    /**
+     * @see javax.management.NotificationListener#handleNotification(javax.management.Notification, java.lang.Object)
+     */
+    public void handleNotification(Notification notification,Object arg1) {
+        try {
+            Source source = new StringSource(notification.getMessage());
+            InOnly exchange = getExchangeFactory().createInOnlyExchange();
+            NormalizedMessage message = exchange.createMessage();
+            message.setContent(source);
+            exchange.setInMessage(message);
+            send(exchange);
+        }
+        catch (Exception e) {
+            log.error("Failed to send Notification message to the NMR");
+        }
+        
+    }
+
+    protected void validate() throws JBIException {
+        if (observedObjectName == null) {
+            throw new DeploymentException("observedObjectName is null");
+        }
+        if (attributeName == null) {
+            throw new DeploymentException("attributeName is null");
+        }
+        if (threshold == null) {
+            throw new DeploymentException("threshold is null");
+        }
+        if (offset == null) {
+            throw new DeploymentException("offset is null");
+        }
+    }
+
+    /**
+     * @return Returns the attributeName.
+     */
+    public String getAttributeName() {
+        return attributeName;
+    }
+
+    /**
+     * @param attributeName
+     *            The attributeName to set.
+     */
+    public void setAttributeName(String attributeName) {
+        this.attributeName = attributeName;
+    }
+
+    /**
+     * @return Returns the counterMonitor.
+     */
+    public CounterMonitor getCounterMonitor() {
+        return counterMonitor;
+    }
+
+    /**
+     * @param counterMonitor The counterMonitor to set.
+     */
+    public void setCounterMonitor(CounterMonitor counterMonitor) {
+        this.counterMonitor = counterMonitor;
+    }
+
+    /**
+     * @return Returns the granularityPeriod.
+     */
+    public long getGranularityPeriod() {
+        return granularityPeriod;
+    }
+
+    /**
+     * @param granularityPeriod The granularityPeriod to set.
+     */
+    public void setGranularityPeriod(long granularityPeriod) {
+        this.granularityPeriod = granularityPeriod;
+    }
+
+    /**
+     * @return Returns the mbeanServer.
+     */
+    public MBeanServer getMbeanServer() {
+        return mbeanServer;
+    }
+
+    /**
+     * @param mbeanServer The mbeanServer to set.
+     */
+    public void setMbeanServer(MBeanServer mbeanServer) {
+        this.mbeanServer = mbeanServer;
+    }
+
+    /**
+     * @return Returns the name.
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * @param name The name to set.
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * @return Returns the observedObjectName.
+     */
+    public String getObservedObjectName() {
+        return observedObjectName;
+    }
+
+    /**
+     * @param observedObjectName The observedObjectName to set.
+     */
+    public void setObservedObjectName(String observedObjectName) {
+        this.observedObjectName = observedObjectName;
+    }
+
+    /**
+     * @return Returns the offset.
+     */
+    public Number getOffset() {
+        return offset;
+    }
+
+    /**
+     * @param offset The offset to set.
+     */
+    public void setOffset(Number offset) {
+        this.offset = offset;
+    }
+
+    /**
+     * @return Returns the threshold.
+     */
+    public Number getThreshold() {
+        return threshold;
+    }
+
+    /**
+     * @param threshold The threshold to set.
+     */
+    public void setThreshold(Number threshold) {
+        this.threshold = threshold;
+    }
+
+    public void onMessageExchange(MessageExchange exchange) throws MessagingException {
+        // We can only receive acks, so do nothing
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/mps/ConfigNotSupportedException.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/mps/ConfigNotSupportedException.java
new file mode 100644
index 0000000..2d80d7e
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/mps/ConfigNotSupportedException.java
@@ -0,0 +1,28 @@
+/*
+ * 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.servicemix.components.mps;
+
+public class ConfigNotSupportedException extends Exception {
+
+	public ConfigNotSupportedException() {
+		super();
+	}
+	public ConfigNotSupportedException(String message) {
+		super(message);
+	}
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/mps/ExistingPropertyCopier.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/mps/ExistingPropertyCopier.java
new file mode 100644
index 0000000..10c8330
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/mps/ExistingPropertyCopier.java
@@ -0,0 +1,46 @@
+/*
+ * 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.servicemix.components.mps;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.NormalizedMessage;
+
+
+/**
+ * Copy a property value from an existing property (somewhere)
+ * @author rbuckland
+ *
+ */
+public class ExistingPropertyCopier implements PropertyValue {
+
+	public final static String XML_ELEMENT_NAME = "existing-property";
+	
+	private String name;
+
+	public ExistingPropertyCopier(String name) {
+		this.name = name;
+	}
+	public String getPropertyValue(NormalizedMessage msg) throws JBIException {
+		if (msg.getProperty(name) != null) {
+			return msg.getProperty(name).toString();
+		} else {
+			return null;
+		}
+		
+	}
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/mps/MessagePropertySetterXML.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/mps/MessagePropertySetterXML.java
new file mode 100644
index 0000000..ddcaf8e
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/mps/MessagePropertySetterXML.java
@@ -0,0 +1,327 @@
+/*
+ * 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.servicemix.components.mps;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.jbi.JBIException;
+import javax.jbi.component.ComponentContext;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.components.util.TransformComponentSupport;
+import org.apache.servicemix.jbi.jaxp.SourceTransformer;
+import org.apache.xpath.CachedXPathAPI;
+import org.apache.xpath.objects.XObject;
+import org.springframework.core.io.Resource;
+import org.springframework.util.Assert;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.xml.sax.SAXException;
+
+
+
+/**
+ * Sets properties on the message, loaded from an XML MPS file 
+ * where the properties to set are located in a <property-set ..>
+ * inside the XML config file.
+ * 
+ * There can be more than one propertySet to "load".
+ *
+ *  The property values are derived from 3 types of config.
+ *  The first config that can return a value as a String to
+ *  set onto the message, will be the "value" that is set
+ *  as the property.
+ *  
+ *  <static-value>
+ *  		As it's name suggests, the "value" of this element
+ *          will be the value of the JBI property.
+ *          
+ *          This is helpful as a default value, or as a static value.
+ *          
+ *  <exisiting-property> and <existint-property name="..."/>
+ *    		This will obtain the value of an existing property (itself)
+ *          or another property on the same message.
+ *          
+ *           This can be helpful when you want the to "ONLY" change the
+ *           the value of the property if there is some "xpath" expression
+ *           that could not be derived. 
+ *           
+ *           name=".." form will copy the string value of the other JBI property
+ *           onto this one, (duping it). This may be handy when you have a component 
+ *           which expects a new property, but you have it as a different name at the moment.
+ *           
+ *  <xpath-expression>
+ *           As it's name suggests, will locate a value in the inMessage source
+ *           and set the resulting XPath String as the value of the JBI property.
+ *           
+ *  So given the three types, they can be arranged in any order. and the first
+ *  PropertyValue Type that returns a value, will become the "value" of the JBI property.
+ *  
+ *
+ * <!-- 
+ * <mps>
+ *	 <property-set name="someSetNameForASetOfProperties">
+ *	     <property name="some.property.name1">
+ *	         <static-value><![CDATA[value for the property]]></static-value>
+ *	     </property>
+ *	     <property name="some.property.name2">
+ *	         <xpath-expression>
+ *		 	      <![CDATA[/someexpath/statement/to/be/applied/to/message/source]]>
+ *		 	 </xpath-expression>
+ *	         <existing-property name="someproperty"/>
+ *		 	 <static-value><![CDATA[a value in the raw]]></static-value>
+ *	     </property>
+ *	     <property name="prop.xpath.with.static.default">
+ *	        <xpath-expression>
+ *		 	    <![CDATA[/someexpath/statement]]>
+ *		 	</xpath-expression>
+ *		 	<static-value><![CDATA[some default if xpath does not resolve]]></static-value>
+ *	     </property>
+ *	     <property name="prop.xpath.or.keep.existing">
+ *	        <xpath-expression>
+ *		 	    <![CDATA[/someexpath/statement]]>
+ *		 	</xpath-expression>
+ *		 	<existing-property/>
+ *	     </property>
+ *	     <property name="new.prop.name">
+ *		 	<existing-property name="other.property"/>
+ *	     </property>
+ *       <property name="..."> 
+ *              ...
+ *       </property>
+ *	 </property-set>
+ *   <property-set name="...">
+ *        ...
+ *   </property-set>
+ * </mps>
+ * -->
+ *
+ * 
+ * @author rbuckland
+ * 
+ */
+public class MessagePropertySetterXML extends TransformComponentSupport  {
+	
+	/**
+	 * Apache commons logger
+	 */
+	private final transient Log logger = LogFactory.getLog(getClass());
+
+	/**
+	 * The name of our JBI property we may have to interrogate to 
+	 * use as the "xpath" for the set of config.
+	 */
+	public static final String MPS_PROP_NAME_PROPERTYSET = "org.apache.servicemix.components.mps.propertyset";
+	
+	/**
+	 * The XML Element name "property-set"
+	 */
+	public static final String XML_ELEMENT_NAME = "property-set";
+	
+	/**
+	 * This is our XML file
+	 */
+	private Resource xmlConfiguration = null;
+	
+	/**
+	 * Our XML config MPS.
+	 */
+	private Document xmlMPSdom = null;
+	
+	/**
+	 * Holds the propertyValueResolver objects.
+	 * if propertySet is not null, this holds one.
+	 * if propertySet is null, this will hold
+	 * one for each propertyvalue entry used during the time
+	 * we are "active".
+	 */
+	private Map propertSets = new HashMap();
+
+	/**
+	 * If this is set, it is hardcoded as the fixed value.
+	 * 
+	 * If this is null 
+	 * we will look for a propery MPS_PROP_NAME_PROPERTYSET
+	 * as the "name" of the property set we will work with.
+	 * So the message incoming, seeds the set of properties to load, just by
+	 * the JBI property itself.
+	 */
+	private String propertySet = null;
+	
+	
+	/**
+	 * If the XPath for a propertySet is not null
+	 * we will try and locate the propertySet to use by 
+	 * pulling a String from the inMessage content using this
+	 * XPath.
+	 */
+	private String xpathForPropertySet = null;
+	
+	/**
+	 * Here is the transform of the message
+	 * We will locate the propertySetName to use 
+	 * and the load up our propertySet magic wand and apply all the properties
+	 * we can to the outgoing NormalizedMessage
+	 */
+	protected boolean transform(MessageExchange arg0, NormalizedMessage in, NormalizedMessage out) throws MessagingException {
+		try {
+			copyPropertiesAndAttachments(arg0,in,out);
+			out.setContent(in.getContent());
+			
+			String propertySetName = "";
+			if (xpathForPropertySet != null) {
+				try {
+					CachedXPathAPI xpathApi = new org.apache.xpath.CachedXPathAPI();
+					Document doc = new SourceTransformer().toDOMDocument(in);
+					XObject propSetXO = xpathApi.eval(doc.getDocumentElement(),xpathForPropertySet);
+					propertySetName = propSetXO.str();
+				} catch (Exception e) {
+					throw new MessagingException("Problem getting the propertySet using XPath", e);
+				}
+			} else if (this.propertySet != null) {
+				propertySetName = this.propertySet;
+			} else if (in.getProperty(MPS_PROP_NAME_PROPERTYSET) != null) {
+				propertySetName = in.getProperty(MPS_PROP_NAME_PROPERTYSET).toString();
+			} else {
+				return false;
+			}
+			logger.info("Applying properties from property-set [" + propertySetName + "]");
+			getPropertySetByName(propertySetName).applyProperties(in,out);
+			return true;				
+		} catch (JBIException e) {
+			throw new MessagingException("Problem setting properties",e);
+		} catch (PropertySetNotFoundException e) {
+			logger.warn(e.getLocalizedMessage());
+			return false;
+		}
+	}
+
+	/**
+	 * Initialise by loading the mps.xml file up into an internal DOM.
+	 * 
+	 * @throws JBIException
+	 */
+	private void initConfig() throws JBIException {
+		Assert.notNull(this.xmlConfiguration);
+		DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
+		domFactory.setIgnoringElementContentWhitespace(true);
+		domFactory.setIgnoringComments(true);
+		domFactory.setCoalescing(true); // convert CDATA to test nodes
+        DocumentBuilder domBuilder;
+		try {
+			logger.info("Intialising MessagePropertySetterXML, loading settings from " + this.xmlConfiguration.getFile().getAbsolutePath());
+			domBuilder = domFactory.newDocumentBuilder();
+			xmlMPSdom = domBuilder.parse(this.xmlConfiguration.getInputStream());
+		} catch (ParserConfigurationException e) {
+			throw new JBIException("Problem parsing the XML config file for MPS",e);
+		} catch (SAXException e) {
+			throw new JBIException("Problem loading the XML config file for MPS",e);
+		} catch (IOException e) {
+			throw new JBIException("Problem loading the XML config file for MPS",e);
+		}
+		
+	}
+
+	/**
+	 * We are only interested  in loading the XML onfig, nothing else
+	 */
+	public void init(ComponentContext context) throws JBIException {
+		super.init(context);
+		initConfig();
+	}
+
+	/**
+	 * Create a propertyset (loading up the Object config based on the XML config)
+	 * 
+	 * @param propertySetName
+	 * @return
+	 * @throws JBIException
+	 * @throws PropertySetNotFoundException
+	 */
+	private PropertySet createPropertySet(String propertySetName) throws JBIException , PropertySetNotFoundException{
+		PropertySet ps;	
+		CachedXPathAPI xpath = new CachedXPathAPI();
+		StringBuffer xpathSB = new StringBuffer("//")
+									.append(XML_ELEMENT_NAME)
+									.append("[@name='")
+									.append(propertySetName)
+									.append("']");
+		try {
+			Node propertySetNode = xpath.selectSingleNode(xmlMPSdom,xpathSB.toString());
+			if (propertySetNode == null) {
+				throw new PropertySetNotFoundException("Could not find a property-set for [" + propertySetName + "] in " + xmlConfiguration.getFilename());
+			}
+			ps = new PropertySet(propertySetName,(Element) propertySetNode);
+			this.propertSets.put(propertySetName, ps);
+		} catch (TransformerException e) {
+			throw new JBIException("Could not load the PropertySet for " + propertySet,e);		
+		} catch (ConfigNotSupportedException e) {
+			throw new JBIException("Could not load the PropertySet for. XMLConfig is not good for " + propertySet,e);		
+		}
+		return ps;
+
+	}
+	
+	/**
+	 * Get a property set from ou
+	 * @param name
+	 * @return
+	 * @throws JBIException 
+	 */
+	private PropertySet getPropertySetByName(String name) throws JBIException, PropertySetNotFoundException {
+		// find a pre "created" one
+		if (this.propertSets.containsKey(name)) {
+			return (PropertySet)this.propertSets.get(name);
+		} else {
+			return this.createPropertySet(name);
+		}
+		
+	}
+
+	/**
+	 * @param propertySet The propertySet to set.
+	 */
+	public void setPropertySet(String propertySet) {
+		this.propertySet = propertySet;
+	}
+
+	/**
+	 * @param xmlConfiguration The xmlConfiguration to set.
+	 */
+	public void setXmlConfiguration(Resource xmlConfiguration) {
+		this.xmlConfiguration = xmlConfiguration;
+	}
+
+	/**
+	 * @param xpathForPropertySet xpath to apply to a message to derive the name of the property-set we want to load
+	 */
+	public void setXpathForPropertySet(String xpathForPropertySet) {
+		this.xpathForPropertySet = xpathForPropertySet;
+	}
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/mps/PropertySet.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/mps/PropertySet.java
new file mode 100644
index 0000000..ae7d3cc
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/mps/PropertySet.java
@@ -0,0 +1,77 @@
+/*
+ * 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.servicemix.components.mps;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.NormalizedMessage;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+public class PropertySet {
+
+	
+	public final static String XML_ELEMENT_NAME = "property-set";
+	
+	public final static String XML_ATTR_NAME_NAME = "name";
+	
+	/**
+	 * Our name
+	 */
+	private String propertySetName;
+
+	/**
+	 * Our list of property value resolvers
+	 */
+	private ArrayList pvrs = new ArrayList();
+	
+	/**
+	 * Create a propertySet with a particular name
+	 * Element self is //property-set
+	 * 
+	 * @param name
+	 */
+	public PropertySet(String name, Element self) throws ConfigNotSupportedException{
+		this.propertySetName = name;
+		NodeList properties = self.getElementsByTagName(PropertyValueResolver.XML_ELEMENT_NAME);
+		for (int i=0; i < properties.getLength();i++) {
+			Element property = (Element)properties.item(i);
+			this.pvrs.add((new PropertyValueResolver(property.getAttribute(XML_ATTR_NAME_NAME),property)));
+		}
+	}
+	
+	/**
+	 * Apply all the property values for this in/out pair
+	 * 
+	 * @param in
+	 * @param out
+	 */
+	public void applyProperties(NormalizedMessage in, NormalizedMessage out) throws JBIException {
+		
+		// for every property, set the value on the message
+		for (Iterator iter = pvrs.iterator(); iter.hasNext();) {
+			((PropertyValueResolver)iter.next()).setProperty(in,out);
+		}
+	}
+
+	public String getName() {
+		return propertySetName;
+	}
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/mps/PropertySetNotFoundException.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/mps/PropertySetNotFoundException.java
new file mode 100644
index 0000000..f4ce853
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/mps/PropertySetNotFoundException.java
@@ -0,0 +1,38 @@
+/*
+ * 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.servicemix.components.mps;
+
+public class PropertySetNotFoundException extends Exception {
+
+	public PropertySetNotFoundException() {
+		super();
+	}
+
+	public PropertySetNotFoundException(String message, Throwable cause) {
+		super(message, cause);
+	}
+
+	public PropertySetNotFoundException(String message) {
+		super(message);
+	}
+
+	public PropertySetNotFoundException(Throwable cause) {
+		super(cause);
+	}
+
+	
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/mps/PropertyValue.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/mps/PropertyValue.java
new file mode 100644
index 0000000..f8844fe
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/mps/PropertyValue.java
@@ -0,0 +1,26 @@
+/*
+ * 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.servicemix.components.mps;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.NormalizedMessage;
+
+public interface PropertyValue {
+
+	public String getPropertyValue(NormalizedMessage msg) throws JBIException;
+	
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/mps/PropertyValueResolver.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/mps/PropertyValueResolver.java
new file mode 100644
index 0000000..67abb4c
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/mps/PropertyValueResolver.java
@@ -0,0 +1,184 @@
+/*
+ * 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.servicemix.components.mps;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.NormalizedMessage;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.jbi.util.DOMUtil;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+/**
+ * Class to hold the list of propertyValues
+ * 
+ * @author rbuckland
+ * 
+ */
+public class PropertyValueResolver {
+
+	private final transient Log logger = LogFactory.getLog(getClass());
+
+	public static final String XML_ELEMENT_NAME = "property";
+
+	/**
+	 * The name of the JBI property that this class will set.
+	 */
+	private String name;
+
+	/**
+	 * if the set contains a static-string propertyvalue at the top of the
+	 * config, we don't need to do anything so the value is stored "here". Null
+	 * if the list has to be evald
+	 */
+	private String staticValue = null;
+
+	/**
+	 * Our list of PropertySetTypes
+	 */
+	private List propertySetTypes = new ArrayList();
+
+	/**
+	 * Construct this PVR, the Element is the .. //property-set/property element
+	 * 
+	 * @param propertyName
+	 *            the name of the property that will be set
+	 * @param self
+	 *            Element
+	 * @throws JBIException
+	 */
+	public PropertyValueResolver(String propertyName, Element self)
+			throws ConfigNotSupportedException {
+		this.name = propertyName;
+		addPropertySetTypes(self);
+	}
+
+	/**
+	 * Set the property (this.name) on the out message based on any properties
+	 * on the message
+	 * 
+	 * @param msg
+	 */
+	public void setProperty(NormalizedMessage in, NormalizedMessage out)
+			throws JBIException {
+
+		if (this.staticValue != null) {
+			out.setProperty(name, staticValue);
+		} else {
+			String value = resolveValue(in);
+			if (value != null) {
+				out.setProperty(name, value);
+			} else {
+				logger.warn("Property " + name
+						+ " was not set as the value was unresolved");
+			}
+		}
+	}
+
+	/**
+	 * Get the value out of the in, and put it in the out.
+	 * 
+	 * @param in
+	 * @param out
+	 * @return
+	 */
+	private String resolveValue(NormalizedMessage message) throws JBIException {
+		// go through the list
+		// if a value is found on the one, return it, until the list is
+		// exhausted
+		String propValue = null;
+		logger.debug("propvrsize=" + propertySetTypes.size());
+		for (int i = 0; i < propertySetTypes.size(); i++) {
+			PropertyValue pv = (PropertyValue) propertySetTypes.get(i);
+			propValue = pv.getPropertyValue(message);
+			logger.debug("value from" + pv.getClass() + " = " + propValue);
+			if (propValue != null && !"".equals(propValue)) {
+				break;
+			}
+			if (logger.isDebugEnabled()) {
+				logger.debug(this.name + ": " + pv.getClass() + " was empty");
+			}
+		}
+		return propValue;
+	}
+
+	/**
+	 * Given the XML below, we will locate the different propertyValueTypes and
+	 * set them on us.
+	 * 
+	 * <property name="some.property.name"> <existing-property/>
+	 * <existing-property name="someproperty"/> <xpath-expression>
+	 * <![CDATA[/someexpath/statement]]> </xpath-expression> <static-value><![CDATA[a
+	 * value in the raw]]></static-value> </property>
+	 * 
+	 * @param propertyNode
+	 */
+	private void addPropertySetTypes(Element propertyElement)
+			throws ConfigNotSupportedException {
+
+		NodeList propertyValueNodes = propertyElement.getChildNodes();
+		// iterate of all the propertyValue nodes ..
+		// (same as equiv to select='//property[@name='x']/*'
+		for (int i = 0; i < propertyValueNodes.getLength(); i++) {
+			if (propertyValueNodes.item(i).getNodeType() != Element.ELEMENT_NODE) {
+				continue;
+			}
+			Element pvElem = (Element) propertyValueNodes.item(i);
+			PropertyValue pv;
+			if (pvElem.getNodeName().equals(
+					StaticStringPropertyValue.XML_ELEMENT_NAME)) {
+				if (this.propertySetTypes.size() == 0) {
+					this.staticValue = DOMUtil.getElementText(pvElem);
+				}
+				pv = new StaticStringPropertyValue(DOMUtil
+						.getElementText(pvElem));
+			} else if (pvElem.getNodeName().equals(
+					XPathContentMessagePropertyValue.XML_ELEMENT_NAME)) {
+				String xpath = DOMUtil.getElementText(pvElem);
+				pv = new XPathContentMessagePropertyValue(xpath);
+				if (logger.isDebugEnabled()) {
+					logger.debug("Created an XPath VR :" + xpath);
+				}
+			} else if (pvElem.getNodeName().equals(
+					ExistingPropertyCopier.XML_ELEMENT_NAME)) {
+				// default to this parents name (so it acts like a property
+				// copy)
+
+				String propertyName = this.name;
+				if (pvElem.getAttribute("name") != null
+						&& !"".equals(pvElem.getAttribute("name"))) {
+					// if there was a <existing-property name="somename"/>
+					// then use that name as the source JBI property
+					// in this mode it acts like a cp src dest and not a dupe.
+					propertyName = pvElem.getAttribute("name");
+				}
+				pv = new ExistingPropertyCopier(propertyName);
+			} else {
+				throw new ConfigNotSupportedException("Property value type "
+						+ pvElem.getNodeName()
+						+ " is not supported for the MessagePropertySetter");
+			}
+			this.propertySetTypes.add(pv);
+
+		}
+	}
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/mps/StaticStringPropertyValue.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/mps/StaticStringPropertyValue.java
new file mode 100644
index 0000000..452fae8
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/mps/StaticStringPropertyValue.java
@@ -0,0 +1,50 @@
+/*
+ * 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.servicemix.components.mps;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.NormalizedMessage;
+
+
+public class StaticStringPropertyValue implements PropertyValue {
+
+	/**
+	 * Our element name 
+	 */
+	public final static String XML_ELEMENT_NAME = "static-value";
+
+	/**
+	 * This is the static value we represent
+	 */
+	private String staticValue;
+
+	/** 
+	 * Ctor  
+	 * @param staticValue
+	 */
+	public StaticStringPropertyValue(String staticValue) {
+		this.staticValue = staticValue;	
+	}
+	
+	/**
+	 * 
+	 */
+	public String getPropertyValue(NormalizedMessage msg) throws JBIException {
+		return staticValue;
+	}
+	
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/mps/XPathContentMessagePropertyValue.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/mps/XPathContentMessagePropertyValue.java
new file mode 100644
index 0000000..bbebf8d
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/mps/XPathContentMessagePropertyValue.java
@@ -0,0 +1,67 @@
+/*
+ * 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.servicemix.components.mps;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.NormalizedMessage;
+
+import org.apache.servicemix.jbi.jaxp.SourceTransformer;
+import org.w3c.dom.Document;
+
+import org.apache.xpath.CachedXPathAPI;
+import org.apache.xpath.objects.XObject;
+
+/**
+ * Get the Value of a property from the message given the XPath Statement.
+ * @author rbuckland
+ *
+ */
+public class XPathContentMessagePropertyValue implements PropertyValue {
+	
+	public final static String XML_ELEMENT_NAME = "xpath-expression";
+	
+	private String xpath;
+	
+	public XPathContentMessagePropertyValue(String xpath) {
+		this.xpath = xpath;
+	}
+
+	/**
+	 * Get a value give the XPath statement preset in our Ctor.
+	 * Return null if the value was empty or not there
+	 */
+	public String getPropertyValue(NormalizedMessage msg) throws JBIException {
+		String resultValue = null;
+		if (msg.getContent() != null) {
+			CachedXPathAPI xpathApi = new CachedXPathAPI();
+			try {
+				Document doc = new SourceTransformer().toDOMDocument(msg);
+				XObject result = xpathApi.eval(doc,xpath);
+
+				resultValue = result.toString();
+				if ("".equals(resultValue)) {
+					resultValue = null;
+				}
+			} catch (Exception e) {
+				throw new JBIException("Could not get value from message via xpath " + xpath, e);
+			}
+		} 
+		return resultValue;
+
+	}
+	
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/net/ConnectionRefusedException.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/net/ConnectionRefusedException.java
new file mode 100644
index 0000000..6835cf3
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/net/ConnectionRefusedException.java
@@ -0,0 +1,41 @@
+/*
+ * 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.servicemix.components.net;
+
+import javax.jbi.messaging.MessagingException;
+
+/**
+ * Exception thrown if the connection could not be established.
+ *
+ * @version $Revision: 426415 $
+ */
+public class ConnectionRefusedException extends MessagingException {
+    private int code;
+
+    public ConnectionRefusedException(int code) {
+        super("Connection refused with return code: " + code);
+        this.code = code;
+    }
+
+    /**
+     * @return the status code for why the connection was refused
+     */
+    public int getCode() {
+        return code;
+    }
+}
+
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/net/FTPClientPool.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/net/FTPClientPool.java
new file mode 100644
index 0000000..6647cd2
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/net/FTPClientPool.java
@@ -0,0 +1,147 @@
+/*
+ * 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.servicemix.components.net;
+
+import org.apache.commons.net.SocketClient;
+import org.apache.commons.net.ftp.FTP;
+import org.apache.commons.net.ftp.FTPClient;
+import org.apache.commons.net.ftp.FTPReply;
+import org.apache.commons.net.ftp.FTPClientConfig;
+
+import java.io.IOException;
+
+/**
+ * A pool of FTP clients for
+ * the <a href="http://jakarta.apache.org/commons/net.html">Jakarta Commons Net</a> library
+ *
+ * @version $Revision: 426415 $
+ */
+public class FTPClientPool extends SocketClientPoolSupport {
+
+    private String username;
+    private String password;
+    private boolean binaryMode = true;
+    private boolean passiveMode = false;
+    private FTPClientConfig config;
+
+    public boolean validateObject(Object object) {
+        FTPClient client = (FTPClient) object;
+        try {
+            return client.sendNoOp();
+        }
+        catch (IOException e) {
+            throw new RuntimeException("Failed to validate client: " + e, e);
+        }
+    }
+
+    public void activateObject(Object object) throws Exception {
+        FTPClient client = (FTPClient) object;
+        client.setReaderThread(true);
+    }
+
+    public void passivateObject(Object object) throws Exception {
+        FTPClient client = (FTPClient) object;
+        client.setReaderThread(false);
+    }
+
+    // Properties
+    //-------------------------------------------------------------------------
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public boolean isBinaryMode() {
+        return binaryMode;
+    }
+
+    public void setBinaryMode(boolean binaryMode) {
+        this.binaryMode = binaryMode;
+    }
+
+    /**
+     * @return the passiveMode
+     */
+    public boolean isPassiveMode() {
+        return passiveMode;
+    }
+
+    /**
+     * @param passiveMode the passiveMode to set
+     */
+    public void setPassiveMode(boolean passiveMode) {
+        this.passiveMode = passiveMode;
+    }
+
+    public FTPClientConfig getConfig() {
+        return config;
+    }
+
+    public void setConfig(FTPClientConfig config) {
+        this.config = config;
+    }
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+    protected void connect(SocketClient client) throws Exception {
+        FTPClient ftp = (FTPClient) client;
+
+        if (config != null) {
+            ftp.configure(config);
+        }
+        super.connect(client);
+
+        int code = ftp.getReplyCode();
+        if (!FTPReply.isPositiveCompletion(code)) {
+            ftp.disconnect();
+            throw new ConnectionRefusedException(code);
+        }
+        if (!ftp.login(getUsername(), getPassword())) {
+            ftp.disconnect();
+            throw new ConnectionRefusedException(ftp.getReplyCode());
+        }
+        if (isBinaryMode()) {
+            ftp.setFileType(FTP.BINARY_FILE_TYPE);
+        }
+        if (isPassiveMode()) {
+            ftp.enterLocalPassiveMode();
+        }
+    }
+
+    protected void disconnect(SocketClient client) throws Exception {
+        FTPClient ftp = (FTPClient) client;
+        if (ftp.isConnected()) {
+            ftp.logout();
+        }
+        super.disconnect(client);
+    }
+
+    protected SocketClient createSocketClient() {
+        return new FTPClient();
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/net/FTPPoller.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/net/FTPPoller.java
new file mode 100644
index 0000000..2c6ab01
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/net/FTPPoller.java
@@ -0,0 +1,186 @@
+/*
+ * 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.servicemix.components.net;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Set;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.InOnly;
+import javax.jbi.messaging.NormalizedMessage;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.commons.net.SocketClient;
+import org.apache.commons.net.ftp.FTPClient;
+import org.apache.commons.net.ftp.FTPFile;
+import org.apache.servicemix.components.util.DefaultFileMarshaler;
+import org.apache.servicemix.components.util.FileMarshaler;
+import org.apache.servicemix.components.util.PollingComponentSupport;
+
+import java.util.concurrent.CopyOnWriteArraySet;
+
+/**
+ * A  component which polls for files to arrive on an FTP server
+ * using the <a href="http://jakarta.apache.org/commons/net.html">Jakarta Commons Net</a> library
+ * and then sends them into the normalized message service, using a plugable transformer
+ * and removes them.
+ *
+ * @version $Revision: 666120 $
+ */
+public class FTPPoller extends PollingComponentSupport {
+    private static final Log log = LogFactory.getLog(FTPPoller.class);
+
+    private FTPClientPool clientPool;
+    private String path;
+    private FileMarshaler marshaler = new DefaultFileMarshaler();
+    private Set workingSet = new CopyOnWriteArraySet();
+
+    private String getWorkingPath() {
+      return path == null ? "." : path;
+    }
+
+    public void poll() throws Exception {
+        FTPClient ftp = (FTPClient) borrowClient();
+        try {
+            FTPFile[] files = ftp.listFiles(getWorkingPath());
+            for (int i = 0; i < files.length; i++) {
+                pollFile(files[i]);
+            }
+        }
+        finally {
+            returnClient(ftp);
+        }
+    }
+
+
+    // Properties
+    //-------------------------------------------------------------------------
+    public FTPClientPool getClientPool() {
+        return clientPool;
+    }
+
+    public void setClientPool(FTPClientPool clientPool) {
+        this.clientPool = clientPool;
+    }
+
+    public String getPath() {
+        return path;
+    }
+
+    public void setPath(String path) {
+        this.path = path;
+    }
+
+    public FileMarshaler getMarshaler() {
+        return marshaler;
+    }
+
+    public void setMarshaler(FileMarshaler marshaler) {
+        this.marshaler = marshaler;
+    }
+
+    /**
+     * The set of FTPFiles that this component is currently working on
+     */
+    public Set getWorkingSet() {
+        return workingSet;
+    }
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+
+    protected void init() throws JBIException {
+        if (clientPool == null) {
+            throw new IllegalArgumentException("You must initialise the clientPool property");
+        }
+        super.init();
+    }
+
+    protected void pollFile(final FTPFile aFile) {
+        if (workingSet.add(aFile)) {
+            if (log.isDebugEnabled()) {
+                log.debug("Scheduling file " + aFile + " for processing");
+            }
+            getExecutor().execute(new Runnable() {
+                public void run() {
+                    try {
+                        processFile(aFile);
+                    } finally {
+                        workingSet.remove(aFile);
+                    }
+                }
+            });
+        }
+    }
+
+    protected void processFile(FTPFile file) {
+        if (file.getName().equals(".") || file.getName().equals("..")) { // TODO: what about other directories?
+          return;
+        }
+        FTPClient client = null;
+        try {
+            client = (FTPClient) borrowClient();
+            processFile(client, file);
+            if (!client.deleteFile(getWorkingPath() + file.getName())) {
+                throw new IOException("Could not delete file " + file);
+            }
+        }
+        catch (Exception e) {
+            log.error("Failed to process file: " + file + ". Reason: " + e, e);
+        }
+        finally {
+            if (client != null) {
+                returnClient(client);
+            }
+        }
+    }
+
+    protected void processFile(FTPClient client, FTPFile file) throws Exception {
+        String name = file.getName();
+        InputStream in = client.retrieveFileStream(getWorkingPath() + name);
+        InOnly exchange = getExchangeFactory().createInOnlyExchange();
+        NormalizedMessage message = exchange.createMessage();
+        exchange.setInMessage(message);
+        marshaler.readMessage(exchange, message, in, name);
+        getDeliveryChannel().sendSync(exchange);
+        in.close();
+        client.completePendingCommand();
+    }
+
+
+    protected SocketClient borrowClient() throws JBIException {
+        try {
+            return getClientPool().borrowClient();
+        }
+        catch (Exception e) {
+            throw new JBIException(e);
+        }
+    }
+
+    protected void returnClient(SocketClient client) {
+        if (client != null) {
+            try {
+                getClientPool().returnClient(client);
+            }
+            catch (Exception e) {
+                log.error("Failed to return client to pool: " + e, e);
+            }
+        }
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/net/FTPSender.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/net/FTPSender.java
new file mode 100644
index 0000000..bd81d7d
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/net/FTPSender.java
@@ -0,0 +1,153 @@
+/*
+ * 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.servicemix.components.net;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.NormalizedMessage;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.commons.net.SocketClient;
+import org.apache.commons.net.ftp.FTPClient;
+import org.apache.servicemix.components.util.DefaultFileMarshaler;
+import org.apache.servicemix.components.util.FileMarshaler;
+import org.apache.servicemix.components.util.OutBinding;
+
+/**
+ * A component which sends a message to a file using FTP via the
+ * <a href="http://jakarta.apache.org/commons/net.html">Jakarta Commons Net</a> library
+ * 
+ * @version $Revision: 486715 $
+ */
+public class FTPSender extends OutBinding {
+    private static final Log log = LogFactory.getLog(FTPSender.class);
+
+    private FTPClientPool clientPool;
+    private FileMarshaler marshaler = new DefaultFileMarshaler();
+    private String uniqueFileName = "ServiceMix";
+    private boolean overwrite = false;
+
+
+    // Properties
+    //-------------------------------------------------------------------------
+    public FTPClientPool getClientPool() {
+        return clientPool;
+    }
+
+    public void setClientPool(FTPClientPool clientPool) {
+        this.clientPool = clientPool;
+    }
+
+    public FileMarshaler getMarshaler() {
+        return marshaler;
+    }
+
+    public void setMarshaler(FileMarshaler marshaler) {
+        this.marshaler = marshaler;
+    }
+
+    public String getUniqueFileName() {
+        return uniqueFileName;
+    }
+
+    /**
+     * Sets the name used to make a unique name if no file name is available on the message.
+     *
+     * @param uniqueFileName the new value of the unique name to use for generating unique names
+     */
+    public void setUniqueFileName(String uniqueFileName) {
+        this.uniqueFileName = uniqueFileName;
+    }
+
+    public boolean isOverwrite() {
+        return overwrite;
+    }
+
+    public void setOverwrite(boolean overwrite) {
+        this.overwrite = overwrite;
+    }
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+    protected void init() throws JBIException {
+        if (clientPool == null) {
+            throw new IllegalArgumentException("You must initialise the clientPool property");
+        }
+        super.init();
+    }
+
+    protected void process(MessageExchange exchange, NormalizedMessage message) throws Exception {
+        FTPClient client = null;
+        OutputStream out = null;
+        try {
+            client = (FTPClient) getClientPool().borrowClient();
+
+            String name = marshaler.getOutputName(exchange, message);
+            if (name == null) {
+                if (uniqueFileName != null) {
+                    out = client.storeUniqueFileStream(uniqueFileName);
+                }
+                else {
+                    out = client.storeUniqueFileStream();
+                }
+            }
+            else {
+                out = client.storeFileStream(name);
+                if (out == null) {
+                    // lets try overwrite the previous file?
+                    if (overwrite) {
+                        client.deleteFile(name);
+                    }
+                    out = client.storeFileStream(name);
+                }
+            }
+            if (out == null) {
+                throw new IOException("No output stream available for output name: " + name + ". Maybe the file already exists?");
+            }
+            marshaler.writeMessage(exchange, message, out, name);
+            done(exchange);
+        }
+        finally {
+            if (out != null) {
+                try {
+                    out.close();
+                }
+                catch (IOException e) {
+                    log.error("Caught exception while closing stream on error: " + e, e);
+                }
+            }
+            client.completePendingCommand();
+            returnClient(client);
+        }
+    }
+
+    protected void returnClient(SocketClient client) {
+        if (client != null) {
+            try {
+                getClientPool().returnClient(client);
+            }
+            catch (Exception e) {
+                log.error("Failed to return client to pool: " + e, e);
+            }
+        }
+    }
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/net/SocketClientPoolSupport.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/net/SocketClientPoolSupport.java
new file mode 100644
index 0000000..073d62e
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/net/SocketClientPoolSupport.java
@@ -0,0 +1,184 @@
+/*
+ * 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.servicemix.components.net;
+
+import org.apache.commons.net.SocketClient;
+import org.apache.commons.pool.ObjectPool;
+import org.apache.commons.pool.PoolableObjectFactory;
+import org.apache.commons.pool.impl.GenericObjectPool;
+import org.springframework.beans.factory.DisposableBean;
+import org.springframework.beans.factory.InitializingBean;
+
+import javax.jbi.JBIException;
+import java.io.IOException;
+import java.net.InetAddress;
+
+/**
+ * A pool of {@link SocketClient} instances from the
+ * <a href="http://jakarta.apache.org/commons/net.html">Jakarta Commons Net</a> library to handle
+ * internet networking connections.
+ *
+ * @version $Revision: 469500 $
+ */
+public abstract class SocketClientPoolSupport implements InitializingBean, DisposableBean, PoolableObjectFactory {
+    private ObjectPool pool;
+    private InetAddress address;
+    private String host;
+    private int port = -1;
+    private InetAddress localAddress;
+    private int localPort;
+
+    public void afterPropertiesSet() throws Exception {
+        if (pool == null) {
+            GenericObjectPool goPool = new GenericObjectPool();
+            goPool.setTestOnBorrow(true);
+            pool = goPool;
+        }
+        pool.setFactory(this);
+    }
+
+    public void destroy() throws Exception {
+        if (pool != null) {
+            pool.close();
+        }
+    }
+
+    public SocketClient borrowClient() throws Exception {
+        return (SocketClient) getPool().borrowObject();
+    }
+
+    public void returnClient(SocketClient client) throws Exception {
+        getPool().returnObject(client);
+    }
+
+    // PoolableObjectFactory interface
+    //-------------------------------------------------------------------------
+    public Object makeObject() throws Exception {
+        SocketClient client = createSocketClient();
+        connect(client);
+        return client;
+    }
+
+    public void destroyObject(Object object) throws Exception {
+        SocketClient client = (SocketClient) object;
+        disconnect(client);
+    }
+
+    public boolean validateObject(Object object) {
+        return true;
+    }
+
+    public void activateObject(Object object) throws Exception {
+    }
+
+    public void passivateObject(Object object) throws Exception {
+    }
+
+
+    // Properties
+    //-------------------------------------------------------------------------
+    public InetAddress getAddress() {
+        return address;
+    }
+
+    public void setAddress(InetAddress address) {
+        this.address = address;
+    }
+
+    public String getHost() {
+        return host;
+    }
+
+    public void setHost(String host) {
+        this.host = host;
+    }
+
+    public InetAddress getLocalAddress() {
+        return localAddress;
+    }
+
+    public void setLocalAddress(InetAddress localAddress) {
+        this.localAddress = localAddress;
+    }
+
+    public int getLocalPort() {
+        return localPort;
+    }
+
+    public void setLocalPort(int localPort) {
+        this.localPort = localPort;
+    }
+
+    public int getPort() {
+        return port;
+    }
+
+    public void setPort(int port) {
+        this.port = port;
+    }
+
+    public ObjectPool getPool() {
+        return pool;
+    }
+
+    public void setPool(ObjectPool pool) {
+        if (pool != null) {
+            pool.setFactory(this);
+        }
+        this.pool = pool;
+    }
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+    protected void connect(SocketClient client) throws IOException, JBIException, Exception {
+        if (host != null) {
+            if (localAddress != null) {
+                client.connect(host, port, localAddress, localPort);
+            }
+            else if (port >= 0) {
+                client.connect(host, port);
+            }
+            else {
+                client.connect(host);
+            }
+        }
+        else if (address != null) {
+            if (localAddress != null) {
+                client.connect(address, port, localAddress, localPort);
+            }
+            else if (port >= 0) {
+                client.connect(address, port);
+            }
+            else {
+                client.connect(address);
+            }
+        }
+        else {
+            throw new JBIException("You must configure the address or host property");
+        }
+    }
+
+
+    protected void disconnect(SocketClient client) throws Exception {
+        if (client.isConnected()) {
+            client.disconnect();
+        }
+    }
+
+    protected abstract SocketClient createSocketClient();
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/net/package.html b/common/servicemix-components/src/main/java/org/apache/servicemix/components/net/package.html
new file mode 100644
index 0000000..193e088
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/net/package.html
@@ -0,0 +1,29 @@
+<!--
+
+    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.
+
+-->
+<html>
+<head>
+</head>
+<body>
+
+A collection of network components using the
+<a href="http://jakarta.apache.org/commons/net.html">Jakarta Commons Net</a> library
+for handling things like FTP
+
+</body>
+</html>
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/quartz/DefaultQuartzMarshaler.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/quartz/DefaultQuartzMarshaler.java
new file mode 100644
index 0000000..149bdd2
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/quartz/DefaultQuartzMarshaler.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.servicemix.components.quartz;
+
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.dom.DOMSource;
+
+import org.apache.servicemix.components.util.MarshalerSupport;
+import org.apache.servicemix.jbi.util.DOMUtil;
+import org.quartz.JobDataMap;
+import org.quartz.JobDetail;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * The default implementation of the Quartz marshaler
+ *
+ * @version $Revision: 426415 $
+ */
+public class DefaultQuartzMarshaler extends MarshalerSupport implements QuartzMarshaler {
+
+    public void populateNormalizedMessage(NormalizedMessage message, JobExecutionContext context) throws JobExecutionException, MessagingException {
+        JobDetail detail = context.getJobDetail();
+        JobDataMap dataMap = detail.getJobDataMap();
+        for (Iterator iter = dataMap.entrySet().iterator(); iter.hasNext(); ) {
+            Map.Entry entry = (Map.Entry) iter.next();
+            String key = (String) entry.getKey();
+            if (!key.equals(QuartzComponent.COMPONENT_KEY)) {
+	            Object value = entry.getValue();
+	            message.setProperty(key, value);
+            }
+        }
+
+        try {
+            Document document = getTransformer().createDocument();
+            Element root = document.createElement("timer");
+            document.appendChild(root);
+            DOMUtil.addChildElement(root, "name", detail.getName());
+            DOMUtil.addChildElement(root, "group", detail.getGroup());
+            DOMUtil.addChildElement(root, "fullname", detail.getFullName());
+            DOMUtil.addChildElement(root, "description", detail.getDescription());
+            DOMUtil.addChildElement(root, "fireTime", context.getFireTime());
+
+            message.setContent(new DOMSource(document));
+        }
+        catch (ParserConfigurationException e) {
+            throw new MessagingException("Failed to create content: " + e, e);
+        }
+    }
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/quartz/QuartzComponent.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/quartz/QuartzComponent.java
new file mode 100644
index 0000000..8be9f17
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/quartz/QuartzComponent.java
@@ -0,0 +1,210 @@
+/*
+ * 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.servicemix.components.quartz;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.MessageExchangeListener;
+import org.apache.servicemix.components.util.ComponentSupport;
+import org.quartz.JobDetail;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.quartz.Scheduler;
+import org.quartz.SchedulerException;
+import org.quartz.SchedulerFactory;
+import org.quartz.Trigger;
+import org.quartz.impl.StdSchedulerFactory;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.InOnly;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * A <a href="http://www.opensymphony.com/quartz/">Quartz</a> component for triggering components when timer events fire.
+ *
+ * @version $Revision: 433012 $
+ */
+public class QuartzComponent extends ComponentSupport implements MessageExchangeListener {
+    private static final transient Log log = LogFactory.getLog(QuartzComponent.class);
+
+    public static final String COMPONENT_KEY = "org.apache.servicemix.component";
+
+    private SchedulerFactory factory;
+    private Scheduler scheduler;
+    private Map triggers;
+    private QuartzMarshaler marshaler = new DefaultQuartzMarshaler();
+
+    public void start() throws JBIException {
+        try {
+            scheduler.start();
+            super.start();
+        } catch (SchedulerException e) {
+            throw new JBIException(e);
+        }
+    }
+
+    public void stop() throws JBIException {
+        try {
+            super.stop();
+            scheduler.standby();
+        } catch (SchedulerException e) {
+            throw new JBIException(e);
+        }
+    }
+
+    public void shutDown() throws JBIException {
+        try {
+            scheduler.shutdown();
+        } catch (SchedulerException e) {
+            throw new JBIException(e);
+        } finally {
+            super.shutDown();
+        }
+    }
+
+    public void addTrigger(Trigger trigger, JobDetail detail) throws JBIException {
+        try {
+            // lets default the trigger name to the job name
+            if (trigger.getName() == null) {
+                trigger.setName(detail.getName());
+            }
+            // lets default the trigger group to the job group
+            if (trigger.getGroup() == null) {
+                trigger.setGroup(detail.getGroup());
+            }
+            // default start time to now if not specified
+            if (trigger.getStartTime() == null) {
+                trigger.setStartTime(new Date());
+            }
+            detail.getJobDataMap().put(COMPONENT_KEY, this);
+            Class jobClass = detail.getJobClass();
+            if (jobClass == null) {
+                detail.setJobClass(ServiceMixJob.class);
+            }
+            scheduler.scheduleJob(detail, trigger);
+        }
+        catch (SchedulerException e) {
+            throw new JBIException("Failed to add trigger: " + trigger + " with detail: " + detail + ". Reason: " + e, e);
+        }
+    }
+
+
+    /**
+     * This method is invoked when a Quartz job is fired.
+     *
+     * @param context the Quartz Job context
+     */
+    public void onJobExecute(JobExecutionContext context) throws JobExecutionException {
+        if (log.isDebugEnabled()) {
+            log.debug("Firing Quartz Job with context: " + context);
+        }
+        try {
+            InOnly exchange = getExchangeFactory().createInOnlyExchange();
+            NormalizedMessage message = exchange.createMessage();
+            getMarshaler().populateNormalizedMessage(message, context);
+            exchange.setInMessage(message);
+            send(exchange);
+        }
+        catch (MessagingException e) {
+            throw new JobExecutionException(e);
+        }
+    }
+
+
+    // Properties
+    //-------------------------------------------------------------------------
+    public SchedulerFactory getFactory() {
+        return factory;
+    }
+
+    public void setFactory(SchedulerFactory factory) {
+        this.factory = factory;
+    }
+
+    public Scheduler getScheduler() {
+        return scheduler;
+    }
+
+    public void setScheduler(Scheduler scheduler) {
+        this.scheduler = scheduler;
+    }
+
+    public Map getTriggers() {
+        return triggers;
+    }
+
+    public void setTriggers(Map triggers) {
+        this.triggers = triggers;
+    }
+
+    public QuartzMarshaler getMarshaler() {
+        return marshaler;
+    }
+
+    public void setMarshaler(QuartzMarshaler marshaler) {
+        this.marshaler = marshaler;
+    }
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+    protected void init() throws JBIException {
+        super.init();
+        try {
+            if (scheduler == null) {
+                if (factory == null) {
+                    factory = new StdSchedulerFactory();
+                }
+                scheduler = factory.getScheduler();
+            }
+        }
+        catch (SchedulerException e) {
+            throw new JBIException(e);
+        }
+
+        if (triggers != null) {
+            for (Iterator iter = triggers.entrySet().iterator(); iter.hasNext();) {
+                Map.Entry entry = (Map.Entry) iter.next();
+                Object key = entry.getKey();
+                Object value = entry.getValue();
+                if (key == null) {
+                    throw new IllegalArgumentException("Key of the map cannot be null");
+                }
+                if (value == null) {
+                    throw new IllegalArgumentException("Key of the map cannot be null");
+                }
+                if (!(key instanceof Trigger)) {
+                    throw new IllegalArgumentException("Key of the map must be a Trigger but was: " + key.getClass().getName());
+                }
+                if (!(value instanceof JobDetail)) {
+                    throw new IllegalArgumentException("Key of the map must be a JobDetail but was: " + value.getClass().getName());
+                }
+                addTrigger((Trigger) key, (JobDetail) value);
+            }
+        }
+    }
+
+    public void onMessageExchange(MessageExchange exchange) throws MessagingException {
+        // As we send in-only MEPS, we will only
+        // receive DONE or ERROR status
+    }
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/quartz/QuartzMarshaler.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/quartz/QuartzMarshaler.java
new file mode 100644
index 0000000..7c8dab3
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/quartz/QuartzMarshaler.java
@@ -0,0 +1,39 @@
+/*
+ * 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.servicemix.components.quartz;
+
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
+import javax.jbi.messaging.NormalizedMessage;
+import javax.jbi.messaging.MessagingException;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public interface QuartzMarshaler {
+
+    /**
+     * Populates the given normalized message from the Quartz context
+     *
+     * @param message the normalized message to populate
+     * @param context the Quartz context
+     * @throws JobExecutionException
+     * @throws MessagingException
+     */
+    void populateNormalizedMessage(NormalizedMessage message, JobExecutionContext context) throws JobExecutionException, MessagingException;
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/quartz/ServiceMixJob.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/quartz/ServiceMixJob.java
new file mode 100644
index 0000000..199c222
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/quartz/ServiceMixJob.java
@@ -0,0 +1,36 @@
+/*
+ * 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.servicemix.components.quartz;
+
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
+/**
+ * A Quartz Job which dispatches a message to a component.
+ *
+ * @version $Revision: 426415 $
+ */
+public class ServiceMixJob implements Job {
+    public void execute(JobExecutionContext context) throws JobExecutionException {
+        QuartzComponent component = (QuartzComponent) context.getJobDetail().getJobDataMap().get(QuartzComponent.COMPONENT_KEY);
+        if (component == null) {
+            throw new JobExecutionException("No quartz JBI component available for key: " + QuartzComponent.COMPONENT_KEY + ". Bad job data map");
+        }
+        component.onJobExecute(context);
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/quartz/package.html b/common/servicemix-components/src/main/java/org/apache/servicemix/components/quartz/package.html
new file mode 100644
index 0000000..bf9de58
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/quartz/package.html
@@ -0,0 +1,27 @@
+<!--
+
+    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.
+
+-->
+<html>
+<head>
+</head>
+<body>
+
+A <a href="http://www.opensymphony.com/quartz/">Quartz</a> component for triggering components when timer events fire.
+
+</body>
+</html>
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/reflection/ProxyInOnlyBinding.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/reflection/ProxyInOnlyBinding.java
new file mode 100644
index 0000000..128ea17
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/reflection/ProxyInOnlyBinding.java
@@ -0,0 +1,79 @@
+/*
+ * 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.servicemix.components.reflection;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.InOnly;
+import javax.jbi.messaging.NormalizedMessage;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.components.util.ComponentSupport;
+import org.apache.servicemix.jbi.RuntimeJBIException;
+
+/**
+ * A Proxy factory which sends the method invocations into the JBI container
+ * for processing.
+ *
+ * @version $Revision: 426415 $
+ */
+public class ProxyInOnlyBinding extends ComponentSupport implements InvocationHandler {
+    
+    private static final Log log = LogFactory.getLog(ProxyInOnlyBinding.class);
+
+    private ClassLoader cl;
+    private Class[] interfaces;
+            
+    public void setTarget(Object target) {
+        setTargetType( target.getClass().getClassLoader(), target.getClass().getInterfaces());
+    }
+    
+    private void setTargetType(ClassLoader classLoader, Class[] interfaces) {
+        this.cl = classLoader;
+        this.interfaces = interfaces;        
+    }
+
+    public Object createProxy() {
+        return Proxy.newProxyInstance(cl, interfaces, this);
+    }
+
+    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+        if (log.isTraceEnabled()) {
+            log.trace("Invoked: " + method);
+        }
+        try {
+            InOnly messageExchange = getDeliveryChannel().createExchangeFactory().createInOnlyExchange();
+            NormalizedMessage inMessage = messageExchange.createMessage();
+            if( proxy != null )
+                inMessage.setProperty("proxy", proxy);
+            inMessage.setProperty("method", method);
+            if( args!= null )
+                inMessage.setProperty("args", args);        
+
+            messageExchange.setInMessage(inMessage);
+            getDeliveryChannel().send(messageExchange);
+            return null;
+        }
+        catch (JBIException e) {
+            throw new RuntimeJBIException(e);
+        }
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/reflection/ProxyInOutBinding.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/reflection/ProxyInOutBinding.java
new file mode 100644
index 0000000..cdf6379
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/reflection/ProxyInOutBinding.java
@@ -0,0 +1,83 @@
+/*
+ * 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.servicemix.components.reflection;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.ExchangeStatus;
+import javax.jbi.messaging.InOut;
+import javax.jbi.messaging.NormalizedMessage;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.components.util.ComponentSupport;
+import org.apache.servicemix.jbi.RuntimeJBIException;
+
+/**
+ * A Proxy factory which sends the method invocations into the JBI container
+ * for processing.
+ *
+ * @version $Revision: 426415 $
+ */
+public class ProxyInOutBinding extends ComponentSupport implements InvocationHandler {
+    
+    private static final Log log = LogFactory.getLog(ProxyInOutBinding.class);
+
+    private ClassLoader cl;
+    private final Class[] interfaces;
+    
+    public ProxyInOutBinding(Object target) {
+        this( target.getClass().getClassLoader(), target.getClass().getInterfaces());
+    }
+    
+    public ProxyInOutBinding(ClassLoader cl, Class [] interfaces) {
+        this.cl = cl;
+        this.interfaces = interfaces;        
+    }
+    
+    public Object createProxy() {
+        return Proxy.newProxyInstance(cl, interfaces, this);
+    }
+
+    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+        if (log.isTraceEnabled()) {
+            log.trace("Invoked: " + proxy);
+        }
+        try {
+            InOut messageExchange = getDeliveryChannel().createExchangeFactory().createInOutExchange();
+            NormalizedMessage inMessage = messageExchange.createMessage();
+            inMessage.setProperty("proxy", proxy);
+            inMessage.setProperty("method", method);
+            inMessage.setProperty("args", args);        
+
+            messageExchange.setInMessage(inMessage);
+            if (getDeliveryChannel().sendSync(messageExchange)) {
+                NormalizedMessage outMessage = messageExchange.getOutMessage();
+                return getBody(outMessage);
+            } else if ( messageExchange.getStatus() == ExchangeStatus.ERROR ) {
+                throw messageExchange.getError();
+            }
+            return null;
+        }
+        catch (JBIException e) {
+            throw new RuntimeJBIException(e);
+        }
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/reflection/ReflectionOutBinding.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/reflection/ReflectionOutBinding.java
new file mode 100644
index 0000000..010f84c
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/reflection/ReflectionOutBinding.java
@@ -0,0 +1,51 @@
+/*
+ * 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.servicemix.components.reflection;
+
+import java.lang.reflect.Method;
+
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.NormalizedMessage;
+
+import org.apache.servicemix.components.util.OutBinding;
+
+/**
+ * Consumes normalized method invocation from the JBI container.
+ *
+ * @version $Revision: 426415 $
+ */
+public class ReflectionOutBinding extends OutBinding {
+
+    private Object target;
+    
+    public Object getTarget() {
+        return target;
+    }
+    public void setTarget(Object target) {
+        this.target = target;
+    }    
+    
+    // Implementation methods
+    //-------------------------------------------------------------------------
+    protected void process(MessageExchange messageExchange, NormalizedMessage inMessage) throws Exception {
+        
+        Method method = (Method) inMessage.getProperty("method");
+        Object []args = (Object[]) inMessage.getProperty("args");
+        method.invoke(target, args);
+        done(messageExchange);
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/reflection/package.html b/common/servicemix-components/src/main/java/org/apache/servicemix/components/reflection/package.html
new file mode 100644
index 0000000..f13720f
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/reflection/package.html
@@ -0,0 +1,27 @@
+<!--
+
+    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.
+
+-->
+<html>
+<head>
+</head>
+<body>
+
+A JBI component which uses reflection to invoke methods on POJOs
+
+</body>
+</html>
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/router/Predicate.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/router/Predicate.java
new file mode 100644
index 0000000..c02eb81
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/router/Predicate.java
@@ -0,0 +1,30 @@
+/*
+ * 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.servicemix.components.router;
+
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.component.ComponentContext;
+
+/**
+ * A simple predicate which evaluates to true or false given the current
+ * context and message exchange.
+ * 
+ * @version $Revision: 426415 $
+ */
+public interface Predicate {
+    boolean evaluate(ComponentContext context, MessageExchange exchange);
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/router/RoutingRule.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/router/RoutingRule.java
new file mode 100644
index 0000000..19d0328
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/router/RoutingRule.java
@@ -0,0 +1,73 @@
+/*
+ * 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.servicemix.components.router;
+
+import org.apache.servicemix.jbi.resolver.EndpointFilter;
+import org.apache.servicemix.jbi.resolver.EndpointResolver;
+import org.apache.servicemix.jbi.resolver.NullEndpointFilter;
+
+import javax.jbi.JBIException;
+import javax.jbi.component.ComponentContext;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.servicedesc.ServiceEndpoint;
+
+/**
+ * A simple routing rule which if the predicate is matched then the message is forwarded to
+ * the given endpoint.
+ *
+ * @version $Revision: 426415 $
+ */
+public class RoutingRule {
+    private Predicate predicate;
+    private EndpointResolver resolver;
+    private EndpointFilter filter = NullEndpointFilter.getInstance();
+
+    public EndpointFilter getFilter() {
+        return filter;
+    }
+
+    public void setFilter(EndpointFilter filter) {
+        this.filter = filter;
+    }
+
+    public Predicate getPredicate() {
+        return predicate;
+    }
+
+    public void setPredicate(Predicate predicate) {
+        this.predicate = predicate;
+    }
+
+    public EndpointResolver getResolver() {
+        return resolver;
+    }
+
+    public void setResolver(EndpointResolver resolver) {
+        this.resolver = resolver;
+    }
+
+    public void onMessageExchange(ComponentContext context, MessageExchange exchange) throws JBIException {
+        if (predicate.evaluate(context, exchange)) {
+
+            // lets forward the message on to the endpoint
+            ServiceEndpoint endpoint = resolver.resolveEndpoint(context, exchange, filter);
+            exchange.setEndpoint(endpoint);
+        }
+    }
+
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/router/package.html b/common/servicemix-components/src/main/java/org/apache/servicemix/components/router/package.html
new file mode 100644
index 0000000..1296122
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/router/package.html
@@ -0,0 +1,28 @@
+<!--
+
+    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.
+
+-->
+<html>
+<head>
+</head>
+<body>
+
+A simple router component which based on boolean predicates will route normalized messages
+to different endpoints.
+
+</body>
+</html>
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/rss/FeedWriter.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/rss/FeedWriter.java
new file mode 100644
index 0000000..3df023e
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/rss/FeedWriter.java
@@ -0,0 +1,290 @@
+/*
+ * 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.servicemix.components.rss;
+
+import com.sun.syndication.feed.synd.SyndContent;
+import com.sun.syndication.feed.synd.SyndContentImpl;
+import com.sun.syndication.feed.synd.SyndEntry;
+import com.sun.syndication.feed.synd.SyndEntryImpl;
+import com.sun.syndication.feed.synd.SyndFeed;
+import com.sun.syndication.feed.synd.SyndFeedImpl;
+import com.sun.syndication.io.FeedException;
+import com.sun.syndication.io.SyndFeedInput;
+import com.sun.syndication.io.SyndFeedOutput;
+import com.sun.syndication.io.XmlReader;
+
+import org.apache.servicemix.components.util.OutBinding;
+import org.apache.servicemix.expression.Expression;
+import org.apache.servicemix.expression.ExpressionHelper;
+import org.apache.servicemix.jbi.jaxp.SourceTransformer;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.transform.Source;
+import javax.xml.transform.TransformerException;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * This component generates an RSS/Atom Feed from the JBI messages it receives.
+ * 
+ * @version $Revision: 579627 $
+ */
+public class FeedWriter extends OutBinding {
+
+    private String feedType = "atom_0.3";
+    private SyndFeed cachedFeed;
+    private String title;
+    private String link = "http://servicemix.org/RSS";
+    private Expression entryTitle;
+    private Expression entryValue;
+    private String feedDescription = "This feed is auto-generated by ServiceMix";
+    private int maximumEntryCount = 200;
+    private File feedFile;
+    private String contentType = "text/plain";
+    private SourceTransformer sourceTransformer = new SourceTransformer();
+    private boolean loadOnStartup = true;
+
+    public synchronized SyndFeed getCachedFeed() throws IllegalArgumentException, FeedException, IOException {
+        if (cachedFeed == null) {
+            cachedFeed = loadOrCreateFeed();
+        }
+        return cachedFeed;
+    }
+
+    public void setCachedFeed(SyndFeed feed) {
+        this.cachedFeed = feed;
+    }
+
+    public String getFeedType() {
+        return feedType;
+    }
+
+    public void setFeedType(String feedType) {
+        this.feedType = feedType;
+    }
+
+    public String getFeedDescription() {
+        return feedDescription;
+    }
+
+    public void setFeedDescription(String feedDescription) {
+        this.feedDescription = feedDescription;
+    }
+
+    public String getTitle() {
+        if (title == null) {
+            title = "ServiceMix feed for service: " + getService();
+        }
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getLink() {
+        return link;
+    }
+
+    public void setLink(String link) {
+        this.link = link;
+    }
+
+    public Expression getEntryTitle() {
+        return entryTitle;
+    }
+
+    public void setEntryTitle(Expression title) {
+        this.entryTitle = title;
+    }
+
+    public Expression getEntryValue() {
+        return entryValue;
+    }
+
+    public void setEntryValue(Expression entryValue) {
+        this.entryValue = entryValue;
+    }
+
+    public int getMaximumEntryCount() {
+        return maximumEntryCount;
+    }
+
+    public void setMaximumEntryCount(int maximumEntryCount) {
+        this.maximumEntryCount = maximumEntryCount;
+    }
+
+    public File getFeedFile() {
+        if (feedFile == null) {
+            throw new IllegalArgumentException("You must set the 'feedFile' property");
+        }
+        return feedFile;
+    }
+
+    public void setFeedFile(File feedFile) {
+        this.feedFile = feedFile;
+    }
+
+    public String getContentType() {
+        return contentType;
+    }
+
+    public void setContentType(String contentType) {
+        this.contentType = contentType;
+    }
+
+    public SourceTransformer getSourceTransformer() {
+        return sourceTransformer;
+    }
+
+    public void setSourceTransformer(SourceTransformer sourceTransformer) {
+        this.sourceTransformer = sourceTransformer;
+    }
+
+    public boolean isLoadOnStartup() {
+        return loadOnStartup;
+    }
+
+    public void setLoadOnStartup(boolean loadOnStartup) {
+        this.loadOnStartup = loadOnStartup;
+    }
+
+    // Implementation methods
+    // -------------------------------------------------------------------------
+
+    protected void init() throws JBIException {
+        super.init();
+
+        // enforce validation
+        File file = getFeedFile();
+        if (file.exists() && file.isDirectory()) {
+            throw new IllegalArgumentException("Cannot generate the cachedFeed as the cachedFeed file is a directory: " + file);
+        }
+    }
+
+    protected void process(MessageExchange exchange, NormalizedMessage message) throws Exception {
+        SyndFeed feed = getCachedFeed();
+        synchronized (feed) {
+            addMessageToFeed(feed, exchange, message);
+            removeExpiredEntries(feed);
+            writeFeed(feed, exchange, message);
+        }
+        done(exchange);
+    }
+
+    protected void addMessageToFeed(SyndFeed feed, MessageExchange exchange, NormalizedMessage message) throws TransformerException, MessagingException {
+        List entries = feed.getEntries();
+        SyndEntry entry = createEntry(exchange, message);
+        SyndContent description = createEntryContent(exchange, message);
+        entry.setDescription(description);
+        
+        // TODO this line really should work but for some reason it doesn't
+        // entries.add(0, entry);
+        
+        List temp = new ArrayList();
+        temp.add(entry);
+        temp.addAll(entries);
+        feed.setEntries(temp);
+    }
+
+    protected SyndEntry createEntry(MessageExchange exchange, NormalizedMessage message) throws MessagingException {
+        SyndEntry entry = new SyndEntryImpl();
+
+        entry.setTitle(ExpressionHelper.asString(getEntryTitle(), exchange, message, "ServiceMix Feed"));
+        entry.setLink(getLink());
+        entry.setPublishedDate(new Date());
+        return entry;
+    }
+
+    protected SyndContent createEntryContent(MessageExchange exchange, NormalizedMessage message) throws TransformerException, MessagingException {
+        SyndContent description = new SyndContentImpl();
+        description.setType(contentType);
+        Source content = message.getContent();
+
+        String value = ExpressionHelper.asString(getEntryValue(), exchange, message, null);
+        if (value == null && content != null) {
+            value = getSourceTransformer().toString(content);
+            value = encodeContent(value);
+        }
+        if (value != null) {
+            description.setValue(value);
+        }
+        return description;
+    }
+
+    /**
+     * Encodes the content so its valid XML when used inside an entry
+     */
+    protected String encodeContent(String value) {
+        return "<![CDATA[" + value + "]]>";
+    }
+
+    protected void writeFeed(SyndFeed feed, MessageExchange messageExchange, NormalizedMessage message) throws IOException, FeedException {
+        Writer writer = new FileWriter(feedFile);
+        SyndFeedOutput output = new SyndFeedOutput();
+        output.output(feed, writer);
+        writer.close();
+    }
+
+    /**
+     * Removes any old entires no longer required in the cachedFeed
+     * 
+     * @param feed
+     */
+    protected void removeExpiredEntries(SyndFeed feed) {
+        // lets limit the count
+        if (maximumEntryCount > 0) {
+            List entries = feed.getEntries();
+            int size = entries.size();
+            if (size > maximumEntryCount) {
+                entries.subList(maximumEntryCount, size).clear();
+            }
+        }
+    }
+
+    protected SyndFeed loadOrCreateFeed() throws IllegalArgumentException, FeedException, IOException {
+        if (isLoadOnStartup()) {
+            File file = getFeedFile();
+            if (file.exists() && file.isFile()) {
+                SyndFeedInput input = new SyndFeedInput();
+                XmlReader xmlReader = new XmlReader(file);
+                return input.build(xmlReader);
+            }
+        }
+        return createFeed();
+    }
+
+    protected SyndFeed createFeed() {
+        SyndFeed feed = new SyndFeedImpl();
+        feed.setFeedType(feedType);
+
+        feed.setTitle(getTitle());
+        feed.setLink(getLink());
+        feed.setDescription(getFeedDescription());
+        return feed;
+    }
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/rss/RssPollingComponent.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/rss/RssPollingComponent.java
new file mode 100644
index 0000000..2640829
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/rss/RssPollingComponent.java
@@ -0,0 +1,168 @@
+/*
+ * 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.servicemix.components.rss;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import javax.jbi.JBIException;
+import javax.jbi.messaging.InOnly;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMSource;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.components.util.PollingComponentSupport;
+
+import com.sun.syndication.feed.synd.SyndEntry;
+import com.sun.syndication.feed.synd.SyndFeed;
+import com.sun.syndication.feed.synd.SyndFeedImpl;
+import com.sun.syndication.io.SyndFeedInput;
+import com.sun.syndication.io.SyndFeedOutput;
+import com.sun.syndication.io.XmlReader;
+
+/**
+ * The RssPollingComponent polls for updates to RSS feeds
+ * 
+ * @version $Revision: 426415 $
+ */
+public class RssPollingComponent extends PollingComponentSupport {
+    private static final Log log = LogFactory.getLog(RssPollingComponent.class);
+    private List urlStrings = new ArrayList();
+    private List urls = new ArrayList();
+    private Date lastPolledDate = new Date();
+    private String outputType = "rss_2.0";
+    
+
+    
+    /**
+     * @return Returns the urlStrings.
+     */
+    public List getUrlStrings() {
+        return urlStrings;
+    }
+
+    /**
+     * @param urlStrings The urlStrings to set.
+     */
+    public void setUrlStrings(List urlStrings) {
+        this.urlStrings = urlStrings;
+    }
+
+    /**
+     * @return Returns the outputType.
+     */
+    public String getOutputType() {
+        return outputType;
+    }
+
+    /**
+     * @param outputType The outputType to set.
+     */
+    public void setOutputType(String outputType) {
+        this.outputType = outputType;
+    }
+
+    /**
+     * @return Returns the lastPolledDate.
+     */
+    public Date getLastPolledDate() {
+        return lastPolledDate;
+    }
+
+    /**
+     * @param lastPolledDate The lastPolledDate to set.
+     */
+    public void setLastPolledDate(Date lastPolledDate) {
+        this.lastPolledDate = lastPolledDate;
+    }
+
+   
+    
+    protected void init() throws JBIException {
+        urls.clear();
+        if (urlStrings != null) {
+            for (int i = 0;i < urlStrings.size();i++) {
+                try {
+                    urls.add(new URL(urlStrings.get(i).toString()));
+                }
+                catch (MalformedURLException e) {
+                    log.warn("URL: " + urlStrings.get(i) + " is badly formed", e);
+                }
+            }
+        }
+        super.init();
+       
+    }
+
+    /**
+     * Poll for updates
+     */
+    public void poll() {
+        List list = getLastesEntries();
+        if (list != null && !list.isEmpty()) {
+            SyndFeed feed = new SyndFeedImpl();
+            feed.setFeedType(outputType);
+            feed.setTitle("Aggregated Feed");
+            feed.setDescription("Anonymous Aggregated Feed");
+            feed.setAuthor("servicemix");
+            feed.setLink("http://www.servicemix.org");
+            feed.setEntries(list);
+            // send on to the nmr ...
+            SyndFeedOutput output = new SyndFeedOutput();
+            try {
+                Source source = new DOMSource(output.outputW3CDom(feed));
+                InOnly exchange = getExchangeFactory().createInOnlyExchange();
+                NormalizedMessage message = exchange.createMessage();
+                message.setContent(source);
+                exchange.setInMessage(message);
+                send(exchange);
+            }
+            catch (Exception e) {
+                log.error("Failed to send RSS message to the NMR");
+            }
+            finally {
+                lastPolledDate = new Date();
+            }
+        }
+    }
+
+    protected List getLastesEntries() {
+        List result = new ArrayList();
+        SyndFeedInput input = new SyndFeedInput();
+        for (int i = 0;i < urls.size();i++) {
+            URL inputUrl = (URL) urls.get(i);
+            SyndFeed inFeed;
+            try {
+                inFeed = input.build(new XmlReader(inputUrl));
+                List entries = inFeed.getEntries();
+                for (int k = 0;k < entries.size();k++) {
+                    SyndEntry entry = (SyndEntry) entries.get(k);
+                    if (entry.getPublishedDate().after(getLastPolledDate())) {
+                        result.add(entry);
+                    }
+                }
+            }
+            catch (Exception e) {
+                log.warn("Failed to process feed from: " + inputUrl, e);
+            }
+        }
+        return result;
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/saaj/SaajBinding.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/saaj/SaajBinding.java
new file mode 100644
index 0000000..71671dc
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/saaj/SaajBinding.java
@@ -0,0 +1,159 @@
+/*
+ * 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.servicemix.components.saaj;
+
+import java.io.ByteArrayOutputStream;
+
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.soap.MimeHeaders;
+import javax.xml.soap.SOAPConnection;
+import javax.xml.soap.SOAPConnectionFactory;
+import javax.xml.soap.SOAPException;
+import javax.xml.soap.SOAPMessage;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.MessageExchangeListener;
+import org.apache.servicemix.components.util.TransformComponentSupport;
+
+/**
+ * Converts an inbound JBI message into a <a href="http://java.sun.com/xml/saaj/">SAAJ</a> (Soap With Attachments for Java)
+ * request-response and outputs the response back into JBI Bindings. This provides
+ * a message centric way of invoking SOAP services inside providers such as <a href="http://ws.apache.org/axis/">Apache Axis</a>
+ *
+ * @version $Revision: 429277 $
+ */
+public class SaajBinding extends TransformComponentSupport implements MessageExchangeListener {
+
+    private static final transient Log log = LogFactory.getLog(SaajBinding.class);
+
+    private SaajMarshaler marshaler = new SaajMarshaler();
+    private SOAPConnectionFactory connectionFactory;
+    private Object soapEndpoint;
+    private String soapAction;
+
+
+    public SOAPConnectionFactory getConnectionFactory() throws SOAPException {
+        if (connectionFactory == null) {
+            connectionFactory = createConnectionFactory();
+        }
+        return connectionFactory;
+    }
+
+    public void setConnectionFactory(SOAPConnectionFactory connectionFactory) {
+        this.connectionFactory = connectionFactory;
+    }
+
+    public Object getSoapEndpoint() {
+        return soapEndpoint;
+    }
+
+    public void setSoapEndpoint(Object soapEndpoint) {
+        this.soapEndpoint = soapEndpoint;
+    }
+
+    /**
+     * @deprecated use getMarshaler instead
+     */
+    public SaajMarshaler getMarshaller() {
+        return marshaler;
+    }
+
+    /**
+     * @deprecated use setMarshaler instead
+     */
+    public void setMarshaller(SaajMarshaler marshaler) {
+        this.marshaler = marshaler;
+    }
+
+    /**
+     * @return the marshaler
+     */
+    public SaajMarshaler getMarshaler() {
+        return marshaler;
+    }
+
+    /**
+     * @param marshaler the marshaler to set
+     */
+    public void setMarshaler(SaajMarshaler marshaler) {
+        this.marshaler = marshaler;
+    }
+
+    protected boolean transform(MessageExchange exchange, NormalizedMessage in, NormalizedMessage out) throws Exception {
+        SOAPConnection connection = getConnectionFactory().createConnection();
+        try {
+            SOAPMessage inMessage = marshaler.createSOAPMessage(in);
+            MimeHeaders mh = inMessage.getMimeHeaders();
+            if (mh.getHeader("SOAPAction") == null) {
+                if (soapAction != null && soapAction.length() > 0) {
+                    mh.addHeader("SOAPAction", soapAction);
+                } else {
+                    mh.addHeader("SOAPAction", "\"\"");
+                }
+                inMessage.saveChanges();
+            }
+
+            if (log.isDebugEnabled()) {
+                ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+                inMessage.writeTo(buffer);
+                log.debug(new String(buffer.toByteArray()));
+            }
+            
+            SOAPMessage response = connection.call(inMessage, soapEndpoint);
+            if (response != null) {
+                marshaler.toNMS(out, response);
+                return true;
+            } else {
+                return false;
+            }
+        }
+        finally {
+            try {
+                connection.close();
+            }
+            catch (SOAPException e) {
+                log.warn("Failed to close connection: " + e, e);
+            }
+        }
+    }
+
+    protected SOAPConnectionFactory createConnectionFactory() throws SOAPException {
+        return SOAPConnectionFactory.newInstance();
+    }
+
+
+    protected SOAPConnection createConnection() throws SOAPException {
+        return getConnectionFactory().createConnection();
+    }
+
+    /**
+	 * @return Returns the soapAction.
+	 */
+	public String getSoapAction() {
+		return soapAction;
+	}
+ 
+	/**
+	 * @param soapAction
+	 *            The soapAction to set.
+	 */
+	public void setSoapAction(String soapAction) {
+		this.soapAction = soapAction;
+	}
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/saaj/SaajMarshaler.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/saaj/SaajMarshaler.java
new file mode 100644
index 0000000..1f9c604
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/saaj/SaajMarshaler.java
@@ -0,0 +1,220 @@
+/*
+ * 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.servicemix.components.saaj;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Iterator;
+
+import javax.activation.DataHandler;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.XMLConstants;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.soap.AttachmentPart;
+import javax.xml.soap.MessageFactory;
+import javax.xml.soap.MimeHeader;
+import javax.xml.soap.SOAPBody;
+import javax.xml.soap.SOAPElement;
+import javax.xml.soap.SOAPEnvelope;
+import javax.xml.soap.SOAPException;
+import javax.xml.soap.SOAPMessage;
+import javax.xml.soap.SOAPPart;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.dom.DOMSource;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.jbi.jaxp.SourceTransformer;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.xml.sax.SAXException;
+
+/**
+ * @version $Revision: 431309 $
+ */
+public class SaajMarshaler {
+
+    private static final transient Log log = LogFactory.getLog(SaajMarshaler.class);
+
+    protected SourceTransformer transformer = new SourceTransformer();
+    private MessageFactory messageFactory;
+
+    public void toNMS(NormalizedMessage normalizedMessage, SOAPMessage soapMessage) throws MessagingException, SOAPException {
+
+        if (log.isDebugEnabled()) {
+        	try {
+	            ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+	            soapMessage.writeTo(buffer);
+	            log.debug(new String(buffer.toByteArray()));
+        	} catch (Exception e) { }
+        }
+        
+    	addNmsProperties(normalizedMessage, soapMessage);
+
+        SOAPPart soapPart = soapMessage.getSOAPPart();
+        SOAPBody soapBody = soapPart.getEnvelope().getBody();
+        SOAPElement elem = null;
+        for (Iterator it = soapBody.getChildElements(); it.hasNext();) {
+        	Object child =  it.next();
+        	if (child instanceof SOAPElement) {
+        		elem = (SOAPElement) child;
+        		break;
+        	}
+        }
+        if (elem == null) {
+        	throw new IllegalStateException("Could not find any element in soap body");
+        }
+        
+        for (SOAPElement parent = elem.getParentElement(); parent != null; parent = parent.getParentElement()) {
+        	// The following code works with sun saaj implementation
+		    NamedNodeMap attributes = parent.getAttributes();
+		    if (attributes != null) {
+		        for (int i = 0; i < attributes.getLength(); i++) {
+		            Attr att = (Attr) parent.getAttributes().item(i);
+		            if (att.getName().startsWith(XMLConstants.XMLNS_ATTRIBUTE + ":")
+		                    && elem.getAttributeNodeNS(att.getNamespaceURI(), att.getLocalName()) == null) {
+		        		elem.addNamespaceDeclaration(att.getName().substring(XMLConstants.XMLNS_ATTRIBUTE.length() + 1), att.getValue());
+		                elem.setAttributeNS(att.getNamespaceURI(), att.getName(), att.getValue());
+		            }
+		        }
+		    }
+		    // The following code works with axis saaj implementation
+        	for (Iterator itNs = parent.getNamespacePrefixes(); itNs.hasNext();) {
+        		String prefix = (String) itNs.next();
+        		String nsuri = parent.getNamespaceURI(prefix);
+        		if (elem.getAttributeNS(XMLConstants.XMLNS_ATTRIBUTE_NS_URI, prefix) == null) {
+	        		elem.addNamespaceDeclaration(prefix, nsuri);
+	        		elem.setAttributeNS(XMLConstants.XMLNS_ATTRIBUTE_NS_URI, XMLConstants.XMLNS_ATTRIBUTE + ":" + prefix, nsuri);
+        		}
+        	}
+		}
+        
+        if (log.isDebugEnabled()) {
+        	try {
+        		log.debug(transformer.toString(elem));
+        	} catch (Exception e) { }
+        }
+        
+        normalizedMessage.setContent(new DOMSource(elem));
+
+        addNmsAttachments(normalizedMessage, soapMessage);
+    }
+
+    public SOAPMessage createSOAPMessage(NormalizedMessage normalizedMessage) throws SOAPException, IOException, TransformerException, MessagingException, ParserConfigurationException, SAXException {
+        SOAPMessage soapMessage = getMessageFactory().createMessage();
+
+        addSoapProperties(soapMessage, normalizedMessage);
+
+        SOAPPart soapPart = soapMessage.getSOAPPart();
+        SOAPEnvelope envelope = soapPart.getEnvelope();
+        SOAPBody body = envelope.getBody();
+
+        // lets turn the payload into a DOM Node to avoid blatting over the envelope
+        // Do not use DOMResult to transform as namespaces are lost (why ?)
+        //DOMResult result = new DOMResult(null);
+        //transformer.toResult(normalizedMessage.getContent(), result);
+        //Document document = (Document) result.getNode();
+        Document document = transformer.toDOMDocument(normalizedMessage);
+        body.addDocument(document);
+
+        addSoapAttachments(soapMessage, normalizedMessage);
+
+        return soapMessage;
+    }
+
+    // Properties
+    //-------------------------------------------------------------------------
+    public MessageFactory getMessageFactory() throws SOAPException {
+        if (messageFactory == null) {
+            messageFactory = createMessageFactory();
+        }
+        return messageFactory;
+    }
+
+    public void setMessageFactory(MessageFactory messageFactory) {
+        this.messageFactory = messageFactory;
+    }
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+
+    protected void addNmsProperties(NormalizedMessage normalizedMessage, SOAPMessage soapMessage) {
+        Iterator iter = soapMessage.getMimeHeaders().getAllHeaders();
+        while (iter.hasNext()) {
+            MimeHeader header = (MimeHeader) iter.next();
+            normalizedMessage.setProperty(header.getName(), header.getValue());
+        }
+    }
+
+    protected void addNmsAttachments(NormalizedMessage normalizedMessage, SOAPMessage soapMessage) throws MessagingException, SOAPException {
+        Iterator iter = soapMessage.getAttachments();
+        while (iter.hasNext()) {
+            AttachmentPart attachment = (AttachmentPart) iter.next();
+            normalizedMessage.addAttachment(attachment.getContentId(), asDataHandler(attachment));
+        }
+    }
+
+    protected void addSoapProperties(SOAPMessage soapMessage, NormalizedMessage normalizedMessage) throws SOAPException {
+        for (Iterator iter = normalizedMessage.getPropertyNames().iterator(); iter.hasNext();) {
+            String name = (String) iter.next();
+            Object value = normalizedMessage.getProperty(name);
+            if (shouldIncludeHeader(normalizedMessage, name, value)) {
+                soapMessage.getMimeHeaders().addHeader(name, value.toString());
+            }
+            if (shouldIncludeProperty(normalizedMessage, name, value)) {
+                soapMessage.setProperty(name, value);
+            }
+        }
+    }
+
+    protected void addSoapAttachments(SOAPMessage soapMessage, NormalizedMessage normalizedMessage) throws IOException {
+        Iterator iterator = normalizedMessage.getAttachmentNames().iterator();
+        while (iterator.hasNext()) {
+            String name = (String) iterator.next();
+            DataHandler attachment = normalizedMessage.getAttachment(name);
+            AttachmentPart attachmentPart = soapMessage.createAttachmentPart(attachment.getContent(), attachment.getContentType());
+            attachmentPart.setContentId(name);
+            soapMessage.addAttachmentPart(attachmentPart);
+        }
+    }
+
+    /**
+     * Decides whether or not the given header should be included in the SAAJ message as a MimeHeader
+     */
+    protected boolean shouldIncludeHeader(NormalizedMessage normalizedMessage, String name, Object value) {
+        // TODO: remove http headers that may come from a consumer http BC
+        return true;
+    }
+
+    /**
+     * Decides whether or not the given property should be included in the SAAJ message as a property
+     */
+    protected boolean shouldIncludeProperty(NormalizedMessage normalizedMessage, String name, Object value) {
+        return true;
+    }
+
+    protected DataHandler asDataHandler(AttachmentPart attachment) throws SOAPException {
+        return new DataHandler(attachment.getContent(), attachment.getContentType());
+    }
+
+
+    protected MessageFactory createMessageFactory() throws SOAPException {
+        return MessageFactory.newInstance();
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/saaj/package.html b/common/servicemix-components/src/main/java/org/apache/servicemix/components/saaj/package.html
new file mode 100644
index 0000000..86a4da0
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/saaj/package.html
@@ -0,0 +1,28 @@
+<!--
+
+    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.
+
+-->
+<html>
+<head>
+</head>
+<body>
+
+Bindings for <a href="http://java.sun.com/xml/saaj/">SAAJ</a> (Soap With Attachments for Java - which used to be called JAXM). This provides
+a message centric way of invoking SOAP services inside providers such as <a href="http://ws.apache.org/axis/">Apache Axis</a>
+
+</body>
+</html>
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/script/ScriptComponent.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/script/ScriptComponent.java
new file mode 100644
index 0000000..711436a
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/script/ScriptComponent.java
@@ -0,0 +1,299 @@
+/*
+ * 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.servicemix.components.script;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Logger;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.InOnly;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.script.Bindings;
+import javax.script.Compilable;
+import javax.script.CompiledScript;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
+import javax.script.ScriptException;
+import javax.xml.namespace.QName;
+
+import org.apache.servicemix.components.util.TransformComponentSupport;
+import org.apache.servicemix.jbi.messaging.NormalizedMessageImpl;
+import org.springframework.core.io.Resource;
+
+/**
+ * A component which is capable of invoking a compiledScript using
+ * <a href="http://servicemix.org/JSR+223">JSR 223</a> to allow any scripting language to be integrated.
+ *
+ * @version $Revision: 556864 $
+ */
+public class ScriptComponent extends TransformComponentSupport {
+
+    public static final QName SERVICE = new QName("http://servicemix.org/example/", "receiver");
+    public static final String ENDPOINT = "receiver";
+
+    private ScriptEngine engine;
+    private String scriptEngineName;
+    private CompiledScript compiledScript;
+    private String scriptText;
+    private Resource script;
+    private String logResourceBundle;
+
+    private boolean disableOutput;
+    private Logger scriptLogger;
+    private Map bindings = new HashMap();
+
+    public ScriptComponent() {
+        super(SERVICE, ENDPOINT);
+    }
+
+    public ScriptComponent(QName service, String endpoint) {
+        super(service, endpoint);
+    }
+
+    public void start() throws JBIException {
+
+        if (engine == null) {
+            if (compiledScript != null) {
+                engine = compiledScript.getEngine();
+            }
+            else {
+                if (scriptEngineName != null) {
+                    engine = createScriptEngine();
+                }
+                if (engine == null) {
+                    throw new JBIException("Must be configured with either the 'compiledScript' or 'engine' property");
+                }
+            }
+        }
+        if (compiledScript == null) {
+            checkScriptTextAvailable();
+        }
+        if (compiledScript == null) {
+            if (engine instanceof Compilable) {
+                Compilable compilable = (Compilable) engine;
+                compileScript(compilable);
+            }
+        }
+    }
+
+    // Properties
+    //-------------------------------------------------------------------------
+    public ScriptEngine getEngine() {
+        return engine;
+    }
+
+    public void setEngine(ScriptEngine engine) {
+        this.engine = engine;
+    }
+
+    public CompiledScript getCompiledScript() {
+        return compiledScript;
+    }
+
+    public void setCompiledScript(CompiledScript compiledScript) {
+        this.compiledScript = compiledScript;
+    }
+
+    public String getScriptText() {
+        return scriptText;
+    }
+
+    /**
+     * Sets the script as a String
+     *
+     * @param scriptText
+     */
+    public void setScriptText(String scriptText) {
+        this.scriptText = scriptText;
+    }
+
+    /**
+     * Returns the script as a spring resource
+     *
+     * @return
+     */
+    public Resource getScript() {
+        return script;
+    }
+
+    /**
+     * Sets the script as a Spring resource
+     *
+     * @param script
+     */
+    public void setScript(Resource script) {
+        this.script = script;
+    }
+
+    public String getScriptEngineName() {
+        return scriptEngineName;
+    }
+
+    public void setScriptEngineName(String scriptEngineName) {
+        this.scriptEngineName = scriptEngineName;
+    }
+
+    public boolean isDisableOutput() {
+        return disableOutput;
+    }
+
+    public void setDisableOutput(boolean disableOutput) {
+        this.disableOutput = disableOutput;
+    }
+
+    public String getLogResourceBundle() {
+        return logResourceBundle;
+    }
+
+    public Map getBindings() {
+        return bindings;
+    }
+
+    /**
+     * Sets the component level bindings available to scripts as a variable called 'bindings'
+     *
+     * @param bindings
+     */
+    public void setBindings(Map bindings) {
+        this.bindings = bindings;
+    }
+
+    /**
+     * Sets the resource bundle to use when creating a logger, if one is not
+     * explicitly configured.
+     *
+     * @param logResourceBundle
+     */
+    public void setLogResourceBundle(String logResourceBundle) {
+        this.logResourceBundle = logResourceBundle;
+    }
+
+    public Logger getScriptLogger() throws MessagingException {
+        if (scriptLogger == null) {
+            scriptLogger = createScriptLogger();
+        }
+        return scriptLogger;
+    }
+
+    /**
+     * Sets the logger to use if the script decides to log
+     *
+     * @param scriptLogger
+     */
+    public void setScriptLogger(Logger scriptLogger) {
+        this.scriptLogger = scriptLogger;
+    }
+
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+    protected boolean transform(MessageExchange exchange, NormalizedMessage in, NormalizedMessage out) throws Exception {
+        Bindings bindings = engine.createBindings();
+        
+        populateBindings(bindings, exchange, in, out);
+        try {
+            runScript(bindings);
+            return !isDisableOutput();
+        }
+        catch (ScriptException e) {
+            throw new MessagingException("Failed to run compiledScript. Reason: " + e, e);
+        }
+    }
+
+    protected void populateBindings(Bindings bindings, MessageExchange exchange, NormalizedMessage in, NormalizedMessage out) throws MessagingException {
+        bindings.put("componentContext", getContext());
+        bindings.put("deliveryChannel", getDeliveryChannel());
+        bindings.put("exchange", exchange);
+        bindings.put("inMessage", in);
+        bindings.put("log", getScriptLogger());
+        bindings.put("componentNamespace", bindings);
+        bindings.put("bindings", this.bindings);
+
+        InOnly outExchange = null;
+        if (isInAndOut(exchange)) {
+            bindings.put("outMessage", out);
+        }
+        else if (!isDisableOutput()) {
+            outExchange = getExchangeFactory().createInOnlyExchange();
+            if (out instanceof NormalizedMessageImpl) {
+                bindings.put("outExchange", ((NormalizedMessageImpl) out).getExchange());
+            }
+            bindings.put("outMessage", out);
+        }
+    }
+
+    protected Logger createScriptLogger() throws MessagingException {
+        if (logResourceBundle != null) {
+            try {
+                return getContext().getLogger(getClass().getName(), logResourceBundle);
+            }
+            catch (JBIException e) {
+                throw new MessagingException(e);
+            }
+        }
+        else {
+            return Logger.getLogger(getClass().getName());
+        }
+    }
+
+    protected void runScript(Bindings bindings) throws ScriptException {
+        if (compiledScript != null) {
+            compiledScript.eval(bindings);
+        }
+        else {
+            evaluteScript(bindings);
+        }
+    }
+
+    protected void evaluteScript(Bindings bindings) throws ScriptException {
+        engine.eval(scriptText, bindings);
+    }
+
+    protected void compileScript(Compilable compilable) throws JBIException {
+        try {
+            if (scriptText != null) {
+                compiledScript = compilable.compile(scriptText);
+            }
+            else if (script != null) {
+                compiledScript = compilable.compile(new InputStreamReader(script.getInputStream()));
+
+            }
+        }
+        catch (ScriptException e) {
+            throw new JBIException("Failed to parse compiledScript. Reason:  " + e, e);
+        }
+        catch (IOException e) {
+            throw new JBIException("Failed to parse compiledScript. Reason:  " + e, e);
+        }
+    }
+
+    protected ScriptEngine createScriptEngine() {
+        ScriptEngineManager manager = new ScriptEngineManager();
+        return manager.getEngineByName(scriptEngineName);
+    }
+
+    protected void checkScriptTextAvailable() throws JBIException {
+        if (scriptText == null && script == null) {
+            throw new JBIException("If no 'compiledScript' is specified you must specify the 'scriptText' or 'script'");
+        }
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/script/ScriptExpression.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/script/ScriptExpression.java
new file mode 100644
index 0000000..a157549
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/script/ScriptExpression.java
@@ -0,0 +1,48 @@
+/*
+ * 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.servicemix.components.script;
+
+import org.apache.servicemix.expression.Expression;
+
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.jbi.messaging.MessagingException;
+import javax.script.CompiledScript;
+import javax.script.ScriptContext;
+import javax.script.ScriptException;
+
+/**
+ * An {@link Expression} implementation using
+ * <a href="http://servicemix.org/JSR+223">JSR 223</a> to allow any scripting language to be used as an expression
+ * language.
+ *
+ * @version $Revision: 426415 $
+ */
+public class ScriptExpression implements Expression {
+    private CompiledScript compiledScript;
+
+    public Object evaluate(MessageExchange exchange, NormalizedMessage message) throws MessagingException {
+        try {
+             /** TODO */
+            ScriptContext namespace = null;
+            return compiledScript.eval(namespace);
+        }
+        catch (ScriptException e) {
+            throw new MessagingException(e);
+        }
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/script/package.html b/common/servicemix-components/src/main/java/org/apache/servicemix/components/script/package.html
new file mode 100644
index 0000000..affeaa7
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/script/package.html
@@ -0,0 +1,30 @@
+<!--
+
+    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.
+
+-->
+<html>
+<head>
+</head>
+<body>
+
+<p>
+A component which uses <a href="http://servicemix.org/JSR+223">JSR 223</a>
+to allow any scripting language to be integrated.
+</p>
+
+</body>
+</html>
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/splitter/SplitterComponent.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/splitter/SplitterComponent.java
new file mode 100644
index 0000000..736105d
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/splitter/SplitterComponent.java
@@ -0,0 +1,119 @@
+/*
+ * 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.servicemix.components.splitter;
+
+import java.io.IOException;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.ExchangeStatus;
+import javax.jbi.messaging.InOnly;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpression;
+import javax.xml.xpath.XPathExpressionException;
+import javax.xml.xpath.XPathFactory;
+
+import org.apache.servicemix.components.util.TransformComponentSupport;
+import org.apache.servicemix.jbi.MissingPropertyException;
+import org.apache.servicemix.jbi.jaxp.SourceTransformer;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+/**
+ * This Component splits a message according to a XPath expression.
+ * 
+ * @author george
+ * @deprecated use the XPathSplitter pattern from the EIP component instead
+ */
+public class SplitterComponent extends TransformComponentSupport {
+
+	/** Holds value of property nodePath. */
+	private String nodePath;
+
+	private XPathExpression expression;
+
+	private SourceTransformer st = new SourceTransformer();
+
+	protected void init() throws JBIException {
+		super.init();
+
+		if (nodePath == null) {
+			throw new MissingPropertyException("nodePath");
+		}
+	}
+
+	protected boolean transform(MessageExchange me, NormalizedMessage in,
+			NormalizedMessage out) throws MessagingException {
+		NodeList nodes;
+		try {
+			Node doc = st.toDOMNode(in);
+			if (expression == null) {
+				XPath xpath = XPathFactory.newInstance().newXPath();
+				expression = xpath.compile(nodePath);
+			}
+			nodes = (NodeList) expression.evaluate(doc, XPathConstants.NODESET);
+		} catch (TransformerException e) {
+			throw new MessagingException(e);
+		} catch (IOException e) {
+			throw new MessagingException(e);
+		} catch (SAXException e) {
+			throw new MessagingException(e);
+		} catch (ParserConfigurationException e) {
+			throw new MessagingException(e);
+		} catch (XPathExpressionException e) {
+			// If XPath Expression is mal formed
+			throw new MessagingException(e);
+		}
+		int total = nodes.getLength();
+		for (int i = 0; i < total; i++) {
+			out.setContent(new DOMSource(nodes.item(i)));
+			InOnly outExchange = getExchangeFactory().createInOnlyExchange();
+			outExchange.setInMessage(out);
+			getDeliveryChannel().sendSync(outExchange);
+			outExchange.setStatus(ExchangeStatus.DONE);
+		}
+		return false;
+	}
+
+	/**
+	 * Getter for property nodePath.
+	 * 
+	 * @return Value of property nodePath.
+	 */
+	public String getNodePath() {
+		return nodePath;
+	}
+
+	/**
+	 * @org.xbean.Property alias="select"
+	 * 
+	 * Setter for property nodePath.
+	 * @param nodePath
+	 *            New value of property nodePath.
+	 */
+	public void setNodePath(String nodePath) {
+		this.nodePath = nodePath;
+		this.expression = null;
+	}
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/validation/CountingErrorHandler.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/validation/CountingErrorHandler.java
new file mode 100644
index 0000000..b82bb93
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/validation/CountingErrorHandler.java
@@ -0,0 +1,105 @@
+/*
+ * 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.servicemix.components.validation;
+
+import javax.jbi.messaging.MessagingException;
+
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.SAXException;
+
+/**
+ * A simple implementation of {@link ErrorHandler} which just counts the number of warnings, errors and fatal errors.
+ *
+ * @version $Revision: 430194 $
+ */
+public class CountingErrorHandler implements MessageAwareErrorHandler {
+    private int warningCount;
+    private int errorCount;
+    private int fatalErrorCount;
+
+    /*  (non-Javadoc)
+     * @see org.apache.servicemix.components.validation.MessageAwareErrorHandler#hasErrors()
+     */
+    public boolean hasErrors() {
+        return getErrorCount() > 0 || getFatalErrorCount() > 0;
+    }
+
+    /*  (non-Javadoc)
+     * @see org.apache.servicemix.components.validation.MessageAwareErrorHandler#getWarningCount()
+     */
+    public int getWarningCount() {
+        return warningCount;
+    }
+
+    /*  (non-Javadoc)
+     * @see org.apache.servicemix.components.validation.MessageAwareErrorHandler#getErrorCount()
+     */
+    public int getErrorCount() {
+        return errorCount;
+    }
+
+    /*  (non-Javadoc)
+     * @see org.apache.servicemix.components.validation.MessageAwareErrorHandler#getFatalErrorCount()
+     */
+    public int getFatalErrorCount() {
+        return fatalErrorCount;
+    }
+
+    /*  (non-Javadoc)
+     * @see org.xml.sax.ErrorHandler#warning(org.xml.sax.SAXParseException)
+     */
+    public void warning(SAXParseException e) throws SAXException {
+        ++warningCount;
+    }
+
+    /*  (non-Javadoc)
+     * @see org.xml.sax.ErrorHandler#error(org.xml.sax.SAXParseException)
+     */
+    public void error(SAXParseException e) throws SAXException {
+        ++errorCount;
+    }
+
+    /*  (non-Javadoc)
+     * @see org.xml.sax.ErrorHandler#fatalError(org.xml.sax.SAXParseException)
+     */
+    public void fatalError(SAXParseException e) throws SAXException {
+        ++fatalErrorCount;
+    }
+    
+    /*  (non-Javadoc)
+     * @see org.apache.servicemix.components.validation.MessageAwareErrorHandler#capturesMessages()
+     */
+    public boolean capturesMessages() {
+    	return false;
+    }
+
+	/* (non-Javadoc)
+	 * @see org.apache.servicemix.components.validation.MessageAwareErrorHandler#getMessagesAs(java.lang.Class)
+	 */
+	public Object getMessagesAs(Class format) throws MessagingException {
+		throw new MessagingException("Unsupported message format: " + format.getName());
+	}
+
+	/* (non-Javadoc)
+	 * @see org.apache.servicemix.components.validation.MessageAwareErrorHandler#supportsMessageFormat(java.lang.Class)
+	 */
+	public boolean supportsMessageFormat(Class format) {
+		return false;
+	}
+    
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/validation/CountingErrorHandlerFactory.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/validation/CountingErrorHandlerFactory.java
new file mode 100644
index 0000000..da3b06c
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/validation/CountingErrorHandlerFactory.java
@@ -0,0 +1,33 @@
+/*
+ * 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.servicemix.components.validation;
+
+/**
+ * @author gmcdonald
+ *
+ */
+public class CountingErrorHandlerFactory implements
+        MessageAwareErrorHandlerFactory {
+
+    /* (non-Javadoc)
+     * @see org.apache.servicemix.components.validation.MessageAwareErrorHandlerFactory#createMessageAwareErrorHandler()
+     */
+    public MessageAwareErrorHandler createMessageAwareErrorHandler() {
+        return new CountingErrorHandler();
+    }
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/validation/MessageAggregatingErrorHandler.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/validation/MessageAggregatingErrorHandler.java
new file mode 100644
index 0000000..8741953
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/validation/MessageAggregatingErrorHandler.java
@@ -0,0 +1,314 @@
+/*

+ * 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.servicemix.components.validation;

+

+import java.io.IOException;

+import java.io.PrintWriter;

+import java.io.StringWriter;

+

+import javax.jbi.messaging.MessagingException;

+import javax.xml.parsers.ParserConfigurationException;

+import javax.xml.transform.TransformerException;

+import javax.xml.transform.dom.DOMSource;

+

+import org.apache.servicemix.jbi.jaxp.SourceTransformer;

+import org.apache.servicemix.jbi.jaxp.StringSource;

+import org.xml.sax.ErrorHandler;

+import org.xml.sax.SAXParseException;

+import org.xml.sax.SAXException;

+

+/**

+ * An implementation of {@link ErrorHandler} which aggregates all warnings and

+ * error messages into a StringBuffer.

+ *

+ * @version $Revision: 359186 $

+ */

+public class MessageAggregatingErrorHandler implements MessageAwareErrorHandler {

+    

+    private static final String openCDATA = "<![CDATA[";

+    private static final String closeCDATA = "]]>";

+    private static final String openError = "<error>";

+    private static final String closeError = "</error>";

+    private static final String openFatalError = "<fatalError>";

+    private static final String closeFatalError = "</fataError>";

+    private static final String openWarning = "<warning>";

+    private static final String closeWarning = "</warning>";

+    

+    private String openRootElement;

+    private String closeRootElement;

+

+    /**

+     * Number of warnings.

+     */

+    private int warningCount;

+    

+    /**

+     * Number of errors.

+     */

+    private int errorCount;

+    

+    /**

+     * Number of fatal errors.

+     */

+    private int fatalErrorCount;

+    

+    /**

+     * The root element name for the fault xml message

+     */

+    private String rootPath;

+    

+    /**

+     * The namespace for the fault xml message

+     */

+    private String namespace;

+    

+    /**

+     * Determines whether or not to include stacktraces in the fault xml message

+     */

+    private boolean includeStackTraces;

+    

+    /**

+     * Variable to hold the warning/error messages from the validator

+     */

+    private StringBuffer messages = new StringBuffer();

+    

+    private SourceTransformer sourceTransformer = new SourceTransformer();

+    

+    /**

+     * Constructor.

+     * 

+     * @param rootElement

+     *      The root element name of the fault xml message 

+     * @param namespace

+     *      The namespace for the fault xml message

+     * @param includeStackTraces

+     *      Include stracktraces in the final output

+     */

+    public MessageAggregatingErrorHandler(String rootPath, String namespace, boolean includeStackTraces) throws IllegalArgumentException {

+        if (rootPath == null || rootPath.trim().length() == 0) {

+            throw new IllegalArgumentException("rootPath must not be null or an empty string");

+        }

+        this.rootPath = rootPath;

+        this.namespace = namespace;

+        this.includeStackTraces = includeStackTraces;

+        createRootElementTags();

+    }

+

+    /**

+     * Creates the root element tags for later use down to n depth.

+     * Note: the rootPath here is of the form:

+     * 

+     *      <code>rootElementName/elementName-1/../elementName-n</code>

+     * 

+     * The namespace will be appended to the root element if it is not

+     * null or empty.

+     */

+    private void createRootElementTags() {

+        /* 

+         * since the rootPath is constrained to be not null or empty

+         * then we have at least one path element.

+         */

+        String[] pathElements = rootPath.split("/");

+

+        StringBuffer openRootElementSB = new StringBuffer().append("<").append(pathElements[0]);

+        StringBuffer closeRootElementSB = new StringBuffer();

+        

+        if (namespace != null && namespace.trim().length() > 0) {

+            openRootElementSB.append(" xmlns=\"").append(namespace).append("\">"); 

+        } else {

+            openRootElementSB.append(">");

+        }

+        

+        if (pathElements.length > 0) {

+            for (int i = 1, j = pathElements.length - 1; i < pathElements.length; i++, j--) {

+                openRootElementSB.append("<").append(pathElements[i]).append(">");

+                closeRootElementSB.append("</").append(pathElements[j]).append(">");

+            }

+        }

+        

+        // create the closing root element tag

+        closeRootElementSB.append("</").append(pathElements[0]).append(">");

+        

+        openRootElement = openRootElementSB.toString();

+        closeRootElement = closeRootElementSB.toString();

+    }

+    

+    /*  (non-Javadoc)

+     * @see org.apache.servicemix.components.validation.MessageAwareErrorHandler#hasErrors()

+     */

+    public boolean hasErrors() {

+        return getErrorCount() > 0 || getFatalErrorCount() > 0;

+    }

+

+    /*  (non-Javadoc)

+     * @see org.apache.servicemix.components.validation.MessageAwareErrorHandler#getWarningCount()

+     */

+    public int getWarningCount() {

+        return warningCount;

+    }

+

+    /*  (non-Javadoc)

+     * @see org.apache.servicemix.components.validation.MessageAwareErrorHandler#getErrorCount()

+     */

+    public int getErrorCount() {

+        return errorCount;

+    }

+

+    /*  (non-Javadoc)

+     * @see org.apache.servicemix.components.validation.MessageAwareErrorHandler#getFatalErrorCount()

+     */

+    public int getFatalErrorCount() {

+        return fatalErrorCount;

+    }

+

+    /*  (non-Javadoc)

+     * @see org.xml.sax.ErrorHandler#warning(org.xml.sax.SAXParseException)

+     */

+    public void warning(SAXParseException e) throws SAXException {

+        ++warningCount;

+

+        // open warning and CDATA tags

+        messages.append(openWarning).append(openCDATA);

+        

+        // append the fatal error message

+        appendErrorMessage(e);

+        

+        // close CDATA and warning tags

+        messages.append(closeCDATA).append(closeWarning);

+    }

+

+    /*  (non-Javadoc)

+     * @see org.xml.sax.ErrorHandler#error(org.xml.sax.SAXParseException)

+     */

+    public void error(SAXParseException e) throws SAXException {

+        ++errorCount;

+

+        // open fatal error and CDATA tags

+        messages.append(openError).append(openCDATA);

+        

+        // append the error message

+        appendErrorMessage(e);

+        

+        // close CDATA and error tags

+        messages.append(closeCDATA).append(closeError);

+    }

+

+    /*  (non-Javadoc)

+     * @see org.xml.sax.ErrorHandler#fatalError(org.xml.sax.SAXParseException)

+     */

+    public void fatalError(SAXParseException e) throws SAXException {

+        ++fatalErrorCount;

+        

+        // open fatal error and CDATA tags

+        messages.append(openFatalError).append(openCDATA);

+        

+        // append the fatal error message

+        appendErrorMessage(e);

+        

+        // close CDATA and fatal error tags

+        messages.append(closeCDATA).append(closeFatalError);

+    }

+

+    /**

+     * Append the error message or stacktrace to the messages attribute.

+     * 

+     * @param e

+     */

+    private void appendErrorMessage(SAXParseException e) {

+        if (includeStackTraces) {

+            StringWriter sw = new StringWriter();

+            e.printStackTrace(new PrintWriter(sw));

+            messages.append(sw.toString());

+        } else {

+            messages.append(e.getLocalizedMessage());

+        }

+    }

+    

+    /*  (non-Javadoc)

+     * @see org.apache.servicemix.components.validation.MessageAwareErrorHandler#capturesMessages()

+     */

+    public boolean capturesMessages() {

+        return true;

+    }

+

+    /* (non-Javadoc)

+     * @see org.apache.servicemix.components.validation.MessageAwareErrorHandler#getMessagesAs(java.lang.Class)

+     */

+    public Object getMessagesAs(Class format) throws MessagingException {

+        if (format == DOMSource.class) {

+            return getDOMSource();

+        } else if (format == StringSource.class) {

+            return getStringSource();

+        } else if (format == String.class) {

+            return getMessagesWithRootElement();

+        }

+        throw new MessagingException("Unsupported message format: " + format.getName());

+    }

+

+    /* (non-Javadoc)

+     * @see org.apache.servicemix.components.validation.MessageAwareErrorHandler#supportsMessageFormat(java.lang.Class)

+     */

+    public boolean supportsMessageFormat(Class format) {

+        if (format == DOMSource.class) {

+            return true;

+        } else if (format == StringSource.class) {

+            return true;

+        } else if (format == String.class) {

+            return true;

+        }

+        return false;

+    }

+    

+    /**

+     * Return the messages encapsulated with the root element.

+     * 

+     * @return

+     */

+    private String getMessagesWithRootElement() {

+        return new StringBuffer().append(openRootElement).append(messages).append(closeRootElement).toString();

+    }

+    

+    /**

+     * Get the error messages as a String Source.

+     * 

+     * @return

+     */

+    private StringSource getStringSource() {

+        return new StringSource(getMessagesWithRootElement());

+    }

+    

+    /**

+     * Get the error messages as a DOMSource.

+     * 

+     * @return

+     * @throws MessagingException

+     */

+    private DOMSource getDOMSource() throws MessagingException {

+        try {

+            return sourceTransformer.toDOMSource(getStringSource());

+        } catch (ParserConfigurationException e) {

+            throw new MessagingException("Failed to create DOMSource for Schema validation messages: " + e, e);

+        } catch (IOException e) {

+            throw new MessagingException("Failed to create DOMSource for Schema validation messages: " + e, e);

+        } catch (SAXException e) {

+            throw new MessagingException("Failed to create DOMSource for Schema validation messages: " + e, e);

+        } catch (TransformerException e) {

+            throw new MessagingException("Failed to create DOMSource for Schema validation messages: " + e, e);

+        }

+    }

+    

+}

diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/validation/MessageAggregatingErrorHandlerFactory.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/validation/MessageAggregatingErrorHandlerFactory.java
new file mode 100644
index 0000000..b7524db
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/validation/MessageAggregatingErrorHandlerFactory.java
@@ -0,0 +1,90 @@
+/*
+ * 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.servicemix.components.validation;
+
+/**
+ * @author gmcdonald
+ *
+ */
+public class MessageAggregatingErrorHandlerFactory implements
+        MessageAwareErrorHandlerFactory {
+
+    /**
+     * The root element name for the fault xml message
+     */
+    private String rootPath;
+    
+    /**
+     * The namespace for the fault xml message
+     */
+    private String namespace;
+    
+    /**
+     * Determines whether or not to include stacktraces in the fault xml message
+     */
+    private boolean includeStackTraces;
+    
+    /**
+     * @return Returns the includeStackTraces.
+     */
+    public boolean isIncludeStackTraces() {
+        return includeStackTraces;
+    }
+
+    /**
+     * @param includeStackTraces The includeStackTraces to set.
+     */
+    public void setIncludeStackTraces(boolean includeStackTraces) {
+        this.includeStackTraces = includeStackTraces;
+    }
+
+    /**
+     * @return Returns the namespace.
+     */
+    public String getNamespace() {
+        return namespace;
+    }
+
+    /**
+     * @param namespace The namespace to set.
+     */
+    public void setNamespace(String namespace) {
+        this.namespace = namespace;
+    }
+
+    /**
+     * @return Returns the rootPath.
+     */
+    public String getRootPath() {
+        return rootPath;
+    }
+
+    /**
+     * @param rootPath The rootPath to set.
+     */
+    public void setRootPath(String rootPath) {
+        this.rootPath = rootPath;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.servicemix.components.validation.MessageAwareErrorHandlerFactory#createMessageAwareErrorHandler()
+     */
+    public MessageAwareErrorHandler createMessageAwareErrorHandler() {
+        return new MessageAggregatingErrorHandler(rootPath, namespace, includeStackTraces);
+    }
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/validation/MessageAwareErrorHandler.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/validation/MessageAwareErrorHandler.java
new file mode 100644
index 0000000..a8a7d5d
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/validation/MessageAwareErrorHandler.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.servicemix.components.validation;
+
+import javax.jbi.messaging.MessagingException;
+
+import org.xml.sax.ErrorHandler;
+
+public interface MessageAwareErrorHandler extends ErrorHandler {
+	
+    /**
+     * Does the error handler contain any error messages?
+     * 
+     * @return
+     */
+	public boolean hasErrors();
+
+    /**
+     * Return the number of warnings.
+     * 
+     * @return
+     */
+	public int getWarningCount();
+
+    /**
+     * Return the number of errors.
+     * 
+     * @return
+     */
+	public int getErrorCount();
+
+    /**
+     * Return the number of fatal errors.
+     * 
+     * @return
+     */
+    public int getFatalErrorCount();
+
+	/**
+	 * Does this ErrorHandler implementation capture error messages?
+	 * 
+	 * @return
+	 */
+	public boolean capturesMessages();
+	
+	/**
+	 * Get the messages from this ErrorHandler in a particular format.
+	 * 
+	 * @return
+	 */
+	public Object getMessagesAs(Class format) throws MessagingException;
+	
+	/**
+	 * Does the message support a given format?
+	 * 
+	 * @param clazz
+	 * 		The Class of the format for which support is required.
+	 * @return
+	 */
+	public boolean supportsMessageFormat(Class format);
+	
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/validation/MessageAwareErrorHandlerFactory.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/validation/MessageAwareErrorHandlerFactory.java
new file mode 100644
index 0000000..ef70bf1
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/validation/MessageAwareErrorHandlerFactory.java
@@ -0,0 +1,33 @@
+/*
+ * 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.servicemix.components.validation;
+
+/**
+ * Simple factory interface to a MessageAwareErrorHandler implementation
+ * 
+ * @author gmcdonald
+ *
+ */
+public interface MessageAwareErrorHandlerFactory {
+    
+    /**
+     * Create and return a concrete MessageAwareErrorHandler implementation
+     * 
+     * @return
+     */
+    public MessageAwareErrorHandler createMessageAwareErrorHandler();
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/validation/ValidateComponent.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/validation/ValidateComponent.java
new file mode 100644
index 0000000..58a7117
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/validation/ValidateComponent.java
@@ -0,0 +1,235 @@
+/*
+ * 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.servicemix.components.validation;
+
+import org.apache.servicemix.components.util.TransformComponentSupport;
+import org.apache.servicemix.jbi.FaultException;
+import org.apache.servicemix.jbi.jaxp.SourceTransformer;
+import org.apache.servicemix.jbi.jaxp.StringSource;
+import org.apache.servicemix.jbi.util.MessageUtil;
+import org.springframework.core.io.Resource;
+import org.xml.sax.SAXException;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.Fault;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Source;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.dom.DOMResult;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamSource;
+import javax.xml.validation.Schema;
+import javax.xml.validation.SchemaFactory;
+import javax.xml.validation.Validator;
+import java.io.IOException;
+
+/**
+ * This component performs a schema validation on the incoming document
+ * and returning a fault if the document does not conform to the schema
+ * otherwise the message is passed on its way.
+ *
+ * @version $Revision: 631926 $
+ */
+public class ValidateComponent extends TransformComponentSupport {
+    private Schema schema;
+    private String schemaLanguage = "http://www.w3.org/2001/XMLSchema";
+    private Source schemaSource;
+    private Resource schemaResource;
+    private MessageAwareErrorHandlerFactory errorHandlerFactory = new CountingErrorHandlerFactory();
+    
+    public static final String FAULT_FLOW = "FAULT_FLOW";
+    public static final String FAULT_JBI = "FAULT_JBI";
+    
+    private String handlingErrorMethod = "FAULT_JBI";
+
+    public Schema getSchema() {
+        return schema;
+    }
+
+    public void setSchema(Schema schema) {
+        this.schema = schema;
+    }
+
+    public String getSchemaLanguage() {
+        return schemaLanguage;
+    }
+
+    public void setSchemaLanguage(String schemaLanguage) {
+        this.schemaLanguage = schemaLanguage;
+    }
+
+    public Source getSchemaSource() {
+        return schemaSource;
+    }
+
+    public void setSchemaSource(Source schemaSource) {
+        this.schemaSource = schemaSource;
+    }
+
+    public Resource getSchemaResource() {
+        return schemaResource;
+    }
+
+    public void setSchemaResource(Resource schemaResource) {
+        this.schemaResource = schemaResource;
+    }
+   
+    public MessageAwareErrorHandlerFactory getErrorHandlerFactory() {
+        return errorHandlerFactory;
+    }
+
+    public void setErrorHandlerFactory(MessageAwareErrorHandlerFactory errorHandlerFactory) {
+        this.errorHandlerFactory = errorHandlerFactory;
+    }
+
+    protected void init() throws JBIException {
+        super.init();
+
+        try {
+            if (schema == null) {
+                SchemaFactory factory = SchemaFactory.newInstance(schemaLanguage);
+
+                if (schemaSource == null) {
+                    if (schemaResource == null) {
+                        throw new JBIException("You must specify a schema, schemaSource or schemaResource property");
+                    }
+                    if (schemaResource.getURL() == null) {
+                        schemaSource = new StreamSource(schemaResource.getInputStream());
+                    } else {
+                        schemaSource = new StreamSource(schemaResource.getInputStream(), schemaResource.getURL().toExternalForm()); 
+                    }
+                }
+                schema = factory.newSchema(schemaSource);
+            }
+        }
+        catch (IOException e) {
+            throw new JBIException("Failed to load schema: " + e, e);
+        }
+        catch (SAXException e) {
+            throw new JBIException("Failed to load schema: " + e, e);
+        }
+    }
+
+    protected boolean transform(MessageExchange exchange, NormalizedMessage in, NormalizedMessage out) throws MessagingException {
+        Validator validator = schema.newValidator();
+
+        // create a new errorHandler and set it on the validator
+        MessageAwareErrorHandler errorHandler = errorHandlerFactory.createMessageAwareErrorHandler();
+        validator.setErrorHandler(errorHandler);
+        DOMResult result = new DOMResult();
+        
+        // Transform first so that the input source will be parsed only once
+        // if it is a StreamSource
+        getMessageTransformer().transform(exchange, in, out);
+        try {
+            SourceTransformer sourceTransformer = new SourceTransformer();
+            // Only DOMSource and SAXSource are allowed for validating
+            // See http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/validation/Validator.html#validate(javax.xml.transform.Source,%20javax.xml.transform.Result)
+            // As we expect a DOMResult as output, we must ensure that the input is a 
+            // DOMSource
+            DOMSource src = sourceTransformer.toDOMSource(out.getContent());
+            doValidation(validator,src,result);
+            if (errorHandler.hasErrors()) {
+                Fault fault = exchange.createFault();
+                
+                // Dont set the schema and source document as properties on the fault
+                // because they are not serializable
+                //fault.setProperty("org.apache.servicemix.xml", src);
+                // Dont set the schema because it contains an instance of
+                // com.sun.org.apache.xerces.internal.jaxp.validation.xs.SchemaImpl that
+                // is not serializable
+                //fault.setProperty("org.apache.servicemix.schema", schema);
+                
+                /* 
+                 * check if this error handler supports the capturing of
+                 * error messages.
+                 */
+                if (errorHandler.capturesMessages()) {
+
+                    /* 
+                     * In descending order of preference select a format to use. If
+                     * neither DOMSource, StringSource or String are supported throw
+                     * a messaging exception.
+                     */
+                    if (errorHandler.supportsMessageFormat(DOMSource.class)) {
+                        fault.setContent(
+                                (DOMSource)errorHandler.getMessagesAs(DOMSource.class));
+                    } else if (errorHandler.supportsMessageFormat(StringSource.class)) {
+                        fault.setContent(sourceTransformer.toDOMSource(
+                                (StringSource)errorHandler.getMessagesAs(StringSource.class)));
+                    } else if (errorHandler.supportsMessageFormat(String.class)) {
+                        fault.setContent(
+                                sourceTransformer.toDOMSource(
+                                        new StringSource(
+                                                (String)errorHandler.getMessagesAs(String.class))));
+                    } else {
+                        throw new MessagingException("MessageAwareErrorHandler implementation " + 
+                                errorHandler.getClass().getName() +
+                                " does not support a compatible error message format.");
+                    }
+                } else {
+                    /* 
+                     * we can't do much here if the ErrorHandler implementation does
+                     * not support capturing messages
+                     */
+                    fault.setContent(new DOMSource(result.getNode(), result.getSystemId()));
+                }
+                if (!handlingErrorMethod.equalsIgnoreCase(FAULT_FLOW)) {
+                	// HANDLE AS JBI FAULT
+                	throw new FaultException("Failed to validate against schema: " + schema, exchange, fault);
+                } else {
+                	MessageUtil.transfer(fault, out);
+                	return true;
+                }
+            }
+            else {
+                // Retrieve the ouput of the validation
+                // as it may have been changed by the validator
+                out.setContent(new DOMSource(result.getNode(), result.getSystemId()));
+                return true;
+             }
+        }
+        catch (SAXException e) {
+            throw new MessagingException(e);
+        }
+        catch (IOException e) {
+            throw new MessagingException(e);
+        } 
+        catch (ParserConfigurationException e) {
+            throw new MessagingException(e);
+        } 
+        catch (TransformerException e) {
+            throw new MessagingException(e);
+        }
+    }
+    
+    protected void doValidation(Validator validator, DOMSource src, DOMResult result) throws SAXException, IOException {
+        validator.validate(src,result);
+    }
+
+	public String getHandlingErrorMethod() {
+		return handlingErrorMethod;
+	}
+
+	public void setHandlingErrorMethod(String handlingErrorMethod) {
+		this.handlingErrorMethod = handlingErrorMethod;
+	}
+}
+
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/validation/package.html b/common/servicemix-components/src/main/java/org/apache/servicemix/components/validation/package.html
new file mode 100644
index 0000000..25e0feb
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/validation/package.html
@@ -0,0 +1,27 @@
+<!--
+
+    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.
+
+-->
+<html>
+<head>
+</head>
+<body>
+
+Performs XML validation using <a href="http://java.sun.com/xml/jaxp/index.jsp">JAXP</a> for validating against XSD or RelaxNG
+
+</body>
+</html>
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/vfs/FileObjectEditor.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/vfs/FileObjectEditor.java
new file mode 100644
index 0000000..1200234
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/vfs/FileObjectEditor.java
@@ -0,0 +1,75 @@
+/*
+ * 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.servicemix.components.vfs;
+
+import org.apache.commons.vfs.FileObject;
+import org.apache.commons.vfs.FileSystemException;
+import org.apache.commons.vfs.FileSystemManager;
+import org.apache.commons.vfs.VFS;
+
+import javax.jbi.JBIException;
+
+/**
+ * A bean editor to make it easier to create new file system objects using VFS
+ *
+ * @version $Revision: 426415 $
+ */
+public class FileObjectEditor {
+    private String path;
+    private FileSystemManager fileSystemManager;
+
+    public String getPath() {
+        return path;
+    }
+
+    public void setPath(String path) {
+        this.path = path;
+    }
+
+    public FileSystemManager getFileSystemManager() {
+        return fileSystemManager;
+    }
+
+    public void setFileSystemManager(FileSystemManager fileSystemManager) {
+        this.fileSystemManager = fileSystemManager;
+    }
+
+    public FileObject getFileObject() throws JBIException {
+        try {
+            if (fileSystemManager == null) {
+                fileSystemManager = VFS.getManager();
+            }
+            if (path == null) {
+                throw new IllegalArgumentException("You must specify a path property");
+            }
+            FileObject answer = fileSystemManager.resolveFile(path);
+            if (answer == null) {
+                throw new JBIException("Could not resolve file: " + path);
+            }
+            try {
+                answer.createFolder();
+            }
+            catch (FileSystemException e) {
+                throw new JBIException("Failed to create folder: " + e, e);
+            }
+            return answer;
+        }
+        catch (FileSystemException e) {
+            throw new JBIException("Failed to initialize file system manager: " + e, e);
+        }
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/vfs/FilePoller.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/vfs/FilePoller.java
new file mode 100644
index 0000000..883e2da
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/vfs/FilePoller.java
@@ -0,0 +1,195 @@
+/*
+ * 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.servicemix.components.vfs;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.commons.vfs.FileContent;
+import org.apache.commons.vfs.FileObject;
+import org.apache.commons.vfs.FileSelector;
+import org.apache.commons.vfs.FileSystemManager;
+import org.apache.servicemix.components.util.DefaultFileMarshaler;
+import org.apache.servicemix.components.util.FileMarshaler;
+import org.apache.servicemix.components.util.PollingComponentSupport;
+
+import java.util.concurrent.CopyOnWriteArraySet;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.RobustInOnly;
+import javax.jbi.messaging.NormalizedMessage;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Set;
+
+/**
+ * A polling component which looks for a file in a file system using the
+ * <a href="http://jakarta.apache.org/commons/vfs.html">Jakarta Commons VFS</a> library
+ * for handling various file systems like files, Samba, WebDAV, FTP, SFTP and temporary files.
+ *
+ * @version $Revision: 666120 $
+ */
+public class FilePoller extends PollingComponentSupport {
+    private static final Log log = LogFactory.getLog(FilePoller.class);
+
+    private FileMarshaler marshaler = new DefaultFileMarshaler();
+    private FileObjectEditor editor = new FileObjectEditor();
+    private FileObject directory;
+    private FileSelector selector;
+    private Set workingSet = new CopyOnWriteArraySet();
+    private boolean deleteFile = true;
+
+    public void poll() throws Exception {
+        FileObject[] files = null;
+        // SM-192: Force close the file, so that the cached informations are cleared
+        directory.close();
+        if (selector != null) {
+            files = directory.findFiles(selector);
+        }
+        else {
+            files = directory.getChildren();
+        }
+        for (int i = 0; i < files.length; i++) {
+            pollFile(files[i]);
+        }
+    }
+
+
+    // Properties
+    //-------------------------------------------------------------------------
+    public FileObject getDirectory() {
+        return directory;
+    }
+
+    public void setDirectory(FileObject directory) {
+        this.directory = directory;
+    }
+
+    public FileSelector getSelector() {
+        return selector;
+    }
+
+    public void setSelector(FileSelector selector) {
+        this.selector = selector;
+    }
+
+    public String getPath() {
+        return editor.getPath();
+    }
+
+    public void setPath(String path) {
+        editor.setPath(path);
+    }
+
+    /**
+     * Returns whether or not we should delete the file when its processed
+     */
+    public boolean isDeleteFile() {
+        return deleteFile;
+    }
+
+    public void setDeleteFile(boolean deleteFile) {
+        this.deleteFile = deleteFile;
+    }
+
+    public FileSystemManager getFileSystemManager() {
+        return editor.getFileSystemManager();
+    }
+
+    public void setFileSystemManager(FileSystemManager fileSystemManager) {
+        editor.setFileSystemManager(fileSystemManager);
+    }
+
+    public FileMarshaler getMarshaler() {
+        return marshaler;
+    }
+
+    public void setMarshaler(FileMarshaler marshaler) {
+        this.marshaler = marshaler;
+    }
+
+    /**
+     * The set of FTPFiles that this component is currently working on
+     *
+     * @return
+     */
+    public Set getWorkingSet() {
+        return workingSet;
+    }
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+    protected void init() throws JBIException {
+        if (directory == null) {
+            directory = editor.getFileObject();
+        }
+        super.init();
+    }
+
+    protected void pollFile(final FileObject aFile) {
+        if (workingSet.add(aFile)) {
+            if (log.isDebugEnabled()) {
+                log.debug("Scheduling file " + aFile + " for processing");
+            }
+            getExecutor().execute(new Runnable() {
+                public void run() {
+                    try {
+                        processFileAndDelete(aFile);
+                    } finally {
+                        workingSet.remove(aFile);
+                    }
+                }
+            });
+        }
+    }
+
+    protected void processFileAndDelete(FileObject file) {
+        try {
+            processFile(file);
+            if (isDeleteFile()) {
+                if (!file.delete()) {
+                    throw new IOException("Could not delete file " + file);
+                }
+            }
+        }
+        catch (Exception e) {
+            log.error("Failed to process file: " + file + ". Reason: " + e, e);
+        }
+    }
+
+    protected void processFile(FileObject file) throws Exception {
+        // SM-192: Force close the file, so that the cached informations are cleared
+        file.close();
+        String name = file.getName().getURI();
+        FileContent content = file.getContent();
+        content.close();
+        InputStream in = content.getInputStream();
+        if (in == null) {
+            throw new JBIException("No input available for file!");
+        }
+        RobustInOnly exchange = getExchangeFactory().createRobustInOnlyExchange();
+        NormalizedMessage message = exchange.createMessage();
+        exchange.setInMessage(message);
+        marshaler.readMessage(exchange, message, in, name);
+        getDeliveryChannel().sendSync(exchange);
+        in.close();
+        content.close();
+        if (exchange.getError() != null) {
+            throw exchange.getError();
+        }
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/vfs/FileWriter.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/vfs/FileWriter.java
new file mode 100644
index 0000000..f5167e3
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/vfs/FileWriter.java
@@ -0,0 +1,140 @@
+/*
+ * 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.servicemix.components.vfs;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.commons.vfs.FileContent;
+import org.apache.commons.vfs.FileObject;
+import org.apache.commons.vfs.FileSystemManager;
+import org.apache.servicemix.components.util.DefaultFileMarshaler;
+import org.apache.servicemix.components.util.FileMarshaler;
+import org.apache.servicemix.components.util.OutBinding;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * A component which receives a message and writes the content to a file using the
+ * <a href="http://jakarta.apache.org/commons/vfs.html">Jakarta Commons VFS</a> library
+ * for handling various file systems like files, Samba, WebDAV, FTP, SFTP and temporary files.
+ *
+ * @version $Revision: 426415 $
+ */
+public class FileWriter extends OutBinding {
+    private static final Log log = LogFactory.getLog(FileWriter.class);
+
+    private FileObject directory;
+    private FileObjectEditor editor = new FileObjectEditor();
+    private FileMarshaler marshaler = new DefaultFileMarshaler();
+    private String uniqueFileName = "ServiceMix";
+
+    // Properties
+    //-------------------------------------------------------------------------
+    public FileObject getDirectory() {
+        return directory;
+    }
+
+    public void setDirectory(FileObject directory) {
+        this.directory = directory;
+    }
+
+    public String getPath() {
+        return editor.getPath();
+    }
+
+    public void setPath(String path) {
+        editor.setPath(path);
+    }
+
+    public FileSystemManager getFileSystemManager() {
+        return editor.getFileSystemManager();
+    }
+
+    public void setFileSystemManager(FileSystemManager fileSystemManager) {
+        editor.setFileSystemManager(fileSystemManager);
+    }
+
+    public FileMarshaler getMarshaler() {
+        return marshaler;
+    }
+
+    public void setMarshaler(FileMarshaler marshaler) {
+        this.marshaler = marshaler;
+    }
+
+    public String getUniqueFileName() {
+        return uniqueFileName;
+    }
+
+    /**
+     * Sets the name used to make a unique name if no file name is available on the message.
+     *
+     * @param uniqueFileName the new value of the unique name to use for generating unique names
+     */
+    public void setUniqueFileName(String uniqueFileName) {
+        this.uniqueFileName = uniqueFileName;
+    }
+
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+    protected void init() throws JBIException {
+        if (directory == null) {
+            directory = editor.getFileObject();
+        }
+        super.init();
+    }
+
+    protected void process(MessageExchange exchange, NormalizedMessage message) throws Exception {
+        OutputStream out = null;
+        try {
+            String name = marshaler.getOutputName(exchange, message);
+            if (name == null) {
+                throw new MessagingException("No output name available. Cannot output message!");
+            }
+            directory.close(); // remove any cached informations
+            FileObject newFile = directory.resolveFile(name);
+            newFile.close(); // remove any cached informations
+            FileContent content = newFile.getContent();
+            content.close();
+            if (content != null) {
+                out = content.getOutputStream();
+            }
+            if (out == null) {
+                throw new MessagingException("No output stream available for output name: " + name);
+            }
+            marshaler.writeMessage(exchange, message, out, name);
+            done(exchange);
+        }
+        finally {
+            if (out != null) {
+                try {
+                    out.close();
+                }
+                catch (IOException e) {
+                    log.error("Caught exception while closing stream on error: " + e, e);
+                }
+            }
+        }
+    }
+}
+
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/vfs/package.html b/common/servicemix-components/src/main/java/org/apache/servicemix/components/vfs/package.html
new file mode 100644
index 0000000..8fa1f12
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/vfs/package.html
@@ -0,0 +1,29 @@
+<!--
+
+    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.
+
+-->
+<html>
+<head>
+</head>
+<body>
+
+A collection of file system components using the
+<a href="http://jakarta.apache.org/commons/vfs.html">Jakarta Commons VFS</a> library
+for handling various file systems like files, Samba, WebDAV, FTP, SFTP and temporary files.
+
+</body>
+</html>
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/wsif/FailedToCreateDOMException.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/wsif/FailedToCreateDOMException.java
new file mode 100644
index 0000000..a07e10a
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/wsif/FailedToCreateDOMException.java
@@ -0,0 +1,28 @@
+/*
+ * 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.servicemix.components.wsif;
+
+/**
+ * Thrown if the lazily created DOM node could not be created for the WSIF response.
+ *
+ * @version $Revision: 426415 $
+ */
+public class FailedToCreateDOMException extends RuntimeException {
+    public FailedToCreateDOMException(Throwable cause) {
+        super(cause);
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/wsif/WSIFBinding.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/wsif/WSIFBinding.java
new file mode 100644
index 0000000..e8615f4
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/wsif/WSIFBinding.java
@@ -0,0 +1,182 @@
+/*
+ * 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.servicemix.components.wsif;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.Fault;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.wsdl.Binding;
+import javax.wsdl.Definition;
+import javax.wsdl.WSDLException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.components.util.TransformComponentSupport;
+import org.apache.wsif.WSIFException;
+import org.apache.wsif.WSIFMessage;
+import org.apache.wsif.WSIFOperation;
+import org.apache.wsif.WSIFService;
+import org.apache.wsif.WSIFServiceFactory;
+import org.apache.wsif.util.WSIFUtils;
+import org.springframework.core.io.Resource;
+
+/**
+ * Consumers JBI messages and sends them as a synchronous request/response into WSIF
+ * then forwards the response
+ *
+ * @version $Revision: 556864 $
+ */
+public class WSIFBinding extends TransformComponentSupport {
+
+    private static transient Log log = LogFactory.getLog(WSIFBinding.class);
+
+    private WSIFMarshaler marshaler = new WSIFMarshaler();
+    private WSIFService serviceHelper;
+    private Definition definition;
+    private Resource definitionResource;
+    private WSIFServiceFactory factory = WSIFServiceFactory.newInstance();
+    private WSIFOperationMap operationMap;
+
+    protected void init() throws JBIException {
+        try {
+            if (definition == null) {
+                if (definitionResource == null) {
+                    throw new JBIException("You must specify a definition or definitionResource property");
+                }
+                String uri = definitionResource.getURL().toString();
+                InputStreamReader reader = new InputStreamReader(definitionResource.getInputStream());
+                definition = WSIFUtils.readWSDL(uri, reader);
+            }
+
+            if (serviceHelper == null) {
+                serviceHelper = factory.getService(definition);
+            }
+
+            if (log.isDebugEnabled()) {
+                for (Iterator iter = serviceHelper.getAvailablePortNames(); iter.hasNext();) {
+                    log.debug("Available port name: " + iter.next());
+                }
+            }
+
+            operationMap = new WSIFOperationMap(serviceHelper);
+
+            Map bindings = definition.getBindings();
+            for (Iterator iter = bindings.entrySet().iterator(); iter.hasNext();) {
+                Map.Entry entry = (Map.Entry) iter.next();
+                Binding binding = (Binding) entry.getValue();
+                operationMap.addBinding(binding);
+            }
+        }
+        catch (IOException e) {
+            throw new JBIException(e);
+        }
+        catch (WSDLException e) {
+            throw new JBIException(e);
+        }
+    }
+
+    /**
+     * @deprecated use getMarshaler instead
+     */
+    public WSIFMarshaler getMarshaller() {
+        return marshaler;
+    }
+
+    /**
+     * @deprecated use setMarshaler instead
+     */
+    public void setMarshaller(WSIFMarshaler marshaler) {
+        this.marshaler = marshaler;
+    }
+
+    public WSIFMarshaler getMarshaler() {
+        return marshaler;
+    }
+
+    public void setMarshaler(WSIFMarshaler marshaler) {
+        this.marshaler = marshaler;
+    }
+
+    public Definition getDefinition() {
+        return definition;
+    }
+
+    public void setDefinition(Definition definition) {
+        this.definition = definition;
+    }
+
+    public Resource getDefinitionResource() {
+        return definitionResource;
+    }
+
+    public void setDefinitionResource(Resource definitionResource) {
+        this.definitionResource = definitionResource;
+    }
+
+    public WSIFServiceFactory getFactory() {
+        return factory;
+    }
+
+    public void setFactory(WSIFServiceFactory factory) {
+        this.factory = factory;
+    }
+
+    public WSIFService getServiceHelper() {
+        return serviceHelper;
+    }
+
+    public void setServiceHelper(WSIFService serviceHelper) {
+        this.serviceHelper = serviceHelper;
+    }
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+    protected boolean transform(MessageExchange exchange, NormalizedMessage in, NormalizedMessage out) throws MessagingException {
+        try {
+            WSIFOperationInfo operationInfo = operationMap.getOperationForExchange(exchange);
+
+            WSIFOperation operation = operationInfo.createWsifOperation();
+            WSIFMessage inMessage = operation.createInputMessage();
+            Object body = getBody(in);
+            marshaler.fromNMS(operationInfo, inMessage, in, body);
+
+            WSIFMessage outMessage = operation.createInputMessage();
+            WSIFMessage faultMessage = operation.createInputMessage();
+            boolean answer = operation.executeRequestResponseOperation(inMessage, outMessage, faultMessage);
+            if (answer) {
+                marshaler.toNMS(exchange, out, operationInfo, outMessage);
+            }
+            else {
+                Fault fault = exchange.createFault();
+                marshaler.toNMS(exchange, fault, operationInfo, outMessage);
+                exchange.setFault(fault);
+            }
+            return true;
+        }
+        catch (WSIFException e) {
+            throw new MessagingException(e);
+        }
+    }
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/wsif/WSIFMarshaler.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/wsif/WSIFMarshaler.java
new file mode 100644
index 0000000..408de76
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/wsif/WSIFMarshaler.java
@@ -0,0 +1,204 @@
+/*
+ * 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.servicemix.components.wsif;
+
+import org.apache.servicemix.jbi.jaxp.SourceTransformer;
+import org.apache.servicemix.jbi.util.DOMUtil;
+import org.apache.servicemix.jbi.util.LazyDOMSource;
+import org.apache.wsif.WSIFException;
+import org.apache.wsif.WSIFMessage;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.xml.sax.SAXException;
+
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.wsdl.Part;
+import javax.xml.namespace.QName;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * A class which marshalls a WSIF messages into and out of NMS
+ *
+ * @version $Revision: 431309 $
+ */
+public class WSIFMarshaler {
+    public static final String WSDL_WRAPPER_NAMESPACE = "http://java.sun.com/xml/ns/jbi/wsdl-11-wrapper";
+
+    private SourceTransformer transformer = new SourceTransformer();
+
+    public void toNMS(final MessageExchange exchange, final NormalizedMessage nmsMessage, final WSIFOperationInfo operationInfo, final WSIFMessage wsifMessage) throws WSIFException, MessagingException {
+        addNmsProperties(nmsMessage, wsifMessage);
+        for (Iterator iter = wsifMessage.getPartNames(); iter.hasNext();) {
+            String name = (String) iter.next();
+            Object value = wsifMessage.getObjectPart(name);
+            nmsMessage.setProperty(name, value);
+        }
+        nmsMessage.setContent(new LazyDOMSource() {
+            protected Node loadNode() {
+                return createResultDocument(exchange, nmsMessage, operationInfo, wsifMessage);
+            }
+        });
+    }
+
+    public void fromNMS(WSIFOperationInfo operationInfo, WSIFMessage wsifMessage, NormalizedMessage nmsMessage, Object body) throws WSIFException, MessagingException {
+        addWSIFProperties(wsifMessage, nmsMessage);
+        try {
+            Element element = transformer.toDOMElement(nmsMessage);
+            Map parts = wsifMessage.getMessageDefinition().getParts();
+            for (Iterator iter = parts.entrySet().iterator(); iter.hasNext();) {
+                Map.Entry entry = (Map.Entry) iter.next();
+                String name = (String) entry.getKey();
+                Part part = (Part) entry.getValue();
+
+                Object value = getPartValue(name, part, nmsMessage, element);
+                wsifMessage.setObjectPart(name, value);
+            }
+        }
+        catch (TransformerException e) {
+            throw new MessagingException(e);
+        } 
+        catch (ParserConfigurationException e) {
+            throw new MessagingException(e);
+        } 
+        catch (IOException e) {
+            throw new MessagingException(e);
+        } 
+        catch (SAXException e) {
+            throw new MessagingException(e);
+        }
+    }
+
+    // Properties
+    //-------------------------------------------------------------------------
+    public SourceTransformer getTransformer() {
+        return transformer;
+    }
+
+    public void setTransformer(SourceTransformer transformer) {
+        this.transformer = transformer;
+    }
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+    protected void addNmsProperties(NormalizedMessage nmsMessage, WSIFMessage wsifMessage) throws WSIFException {
+        Iterator iter = wsifMessage.getPartNames();
+        while (iter.hasNext()) {
+            String name = (String) iter.next();
+            Object value = wsifMessage.getObjectPart(name);
+            nmsMessage.setProperty(name, value);
+        }
+    }
+
+    protected void addWSIFProperties(WSIFMessage wsifMessage, NormalizedMessage nmsMessage) throws WSIFException {
+        for (Iterator iter = nmsMessage.getPropertyNames().iterator(); iter.hasNext();) {
+            String name = (String) iter.next();
+            Object value = nmsMessage.getProperty(name);
+            if (shouldIncludeHeader(nmsMessage, name, value)) {
+                wsifMessage.setObjectPart(name, value);
+            }
+        }
+    }
+
+
+    /**
+     * Decides whether or not the given header should be included in the WSIF message.
+     * By default this includes all values
+     */
+    protected boolean shouldIncludeHeader(NormalizedMessage normalizedMessage, String name, Object value) {
+        return true;
+    }
+
+    protected Object getPartValue(String name, Part part, NormalizedMessage nmsMessage, Element body) throws MessagingException, TransformerException, ParserConfigurationException, IOException, SAXException {
+        if (isSimpleType(part)) {
+            // lets extract the text content   
+            return DOMUtil.getElementText(body).trim();
+        }
+        // TODO we should be extracting each part of the XML using XPath
+        return transformer.toDOMNode(nmsMessage);
+
+    }
+
+    /**
+     * Returns true if the given part is a string type
+     */
+    protected boolean isSimpleType(Part part) {
+       QName typeName = part.getTypeName();
+       if (typeName != null) {
+          return "http://www.w3.org/2001/XMLSchema".equals(typeName.getNamespaceURI());
+       }
+       return false;
+    }
+
+    protected Node createResultDocument(MessageExchange exchange, NormalizedMessage normalizedMessage, WSIFOperationInfo operationInfo, WSIFMessage wsifMessage) {
+        try {
+            Document document = transformer.createDocument();
+            Element root = document.createElementNS(WSDL_WRAPPER_NAMESPACE, "jbi:message");
+            document.appendChild(root);
+            root.setAttribute("xmlns:jbi", WSDL_WRAPPER_NAMESPACE);
+            QName operation = exchange.getOperation();
+            String operationName = "unknown";
+            if (operation != null) {
+                operationName = operation.getLocalPart();
+                String uri = operation.getNamespaceURI();
+                if (uri != null && uri.length() > 0) {
+                    root.setAttribute("xmlns:op", uri);
+                }
+            }
+            root.setAttribute("version", "1.0");
+            root.setAttribute("type", "op:" + operationName);
+            root.setAttribute("name", operationName);
+
+
+            for (Iterator iter = wsifMessage.getPartNames(); iter.hasNext();) {
+                String name = (String) iter.next();
+                Object value = normalizedMessage.getProperty(name);
+
+                Element element = document.createElementNS(WSDL_WRAPPER_NAMESPACE, "jbi:part");
+                root.appendChild(element);
+                addPartValue(element, name, value);
+            }
+
+            return document;
+        }
+        catch (Exception e) {
+            throw new FailedToCreateDOMException(e);
+        }
+    }
+
+    protected void addPartValue(Element element, String name, Object value) {
+        if (value instanceof Document) {
+            Document doc = (Document) value;
+            Element root = doc.getDocumentElement();
+            doc.removeChild(root);
+            element.appendChild(root);
+        }
+        else if (value != null) {
+            String text = value.toString();
+            element.appendChild(element.getOwnerDocument().createTextNode(text));
+        }
+    }
+
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/wsif/WSIFOperationInfo.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/wsif/WSIFOperationInfo.java
new file mode 100644
index 0000000..fc9d872
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/wsif/WSIFOperationInfo.java
@@ -0,0 +1,40 @@
+/*
+ * 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.servicemix.components.wsif;
+
+import org.apache.wsif.WSIFException;
+import org.apache.wsif.WSIFOperation;
+import org.apache.wsif.WSIFPort;
+
+/**
+ * The information about an operation.
+ *
+ * @version $Revision: 426415 $
+ */
+public class WSIFOperationInfo {
+    private WSIFPort port;
+    private String name;
+
+    public WSIFOperationInfo(WSIFPort port, String name) {
+        this.port = port;
+        this.name = name;
+    }
+
+    public WSIFOperation createWsifOperation() throws WSIFException {
+        return this.port.createOperation(name);
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/wsif/WSIFOperationMap.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/wsif/WSIFOperationMap.java
new file mode 100644
index 0000000..a93b5ee
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/wsif/WSIFOperationMap.java
@@ -0,0 +1,112 @@
+/*
+ * 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.servicemix.components.wsif;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.jbi.messaging.MessageExchange;
+import javax.wsdl.Binding;
+import javax.wsdl.BindingOperation;
+import javax.wsdl.Operation;
+import javax.xml.namespace.QName;
+
+import org.apache.servicemix.jbi.NoSuchOperationException;
+import org.apache.wsif.WSIFException;
+import org.apache.wsif.WSIFService;
+
+/**
+ * Maintains a Map of the available operations for the binding.
+ * 
+ * @version $Revision: 426415 $
+ */
+public class WSIFOperationMap {
+
+    private WSIFService service;
+    private Map operationMap = new HashMap();
+    private WSIFOperationInfo defaultOperation;
+
+    public WSIFOperationMap(WSIFService service) {
+        this.service = service;
+    }
+
+    /**
+     * Returns the operation information for the current message exchange.
+     *
+     * @param exchange the current message exchange
+     * @return the operation information
+     * @throws NoSuchOperationException if the operation is not available
+     */
+    public WSIFOperationInfo getOperationForExchange(MessageExchange exchange) throws NoSuchOperationException {
+        QName operationName = exchange.getOperation();
+        WSIFOperationInfo operationInfo = getOperation(operationName);
+        if (operationInfo == null) {
+            throw new NoSuchOperationException(operationName);
+        }
+        return operationInfo;
+    }
+
+    /**
+     * Returns the operation information for the given QName
+     *
+     * @param operationName is the name of the operation
+     * @return the operation information or null if it is not available
+     */
+    public WSIFOperationInfo getOperation(QName operationName) {
+        if (operationName == null) {
+            // lets try a default operation
+            return defaultOperation;
+        }
+        return (WSIFOperationInfo) operationMap.get(operationName);
+    }
+
+    public int getOperationCount() {
+        return operationMap.values().size();
+    }
+
+    /**
+     * Returns the operation for the given name
+     *
+     * @param operationName is the name of the operation
+     * @return the operation instance or null if it is not available
+     */
+    public WSIFOperationInfo getOperation(String operationName) {
+        return (WSIFOperationInfo) operationMap.get(operationName);
+    }
+
+    public void addBinding(Binding binding) throws WSIFException {
+        List list = binding.getBindingOperations();
+        for (Iterator iter = list.iterator(); iter.hasNext();) {
+            BindingOperation bindingOperation = (BindingOperation) iter.next();
+            addBindingOperation(binding, bindingOperation);
+        }
+    }
+
+    protected void addBindingOperation(Binding binding, BindingOperation bindingOperation) throws WSIFException {
+        Operation operation = bindingOperation.getOperation();
+        String name = operation.getName();
+        WSIFOperationInfo info = new WSIFOperationInfo(service.getPort(), name);
+        operationMap.put(name, info);
+        operationMap.put(new QName(name), info);
+        if (defaultOperation == null) {
+            defaultOperation = info;
+        }
+    }
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/wsif/WSIFOutBinding.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/wsif/WSIFOutBinding.java
new file mode 100644
index 0000000..9657c1c
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/wsif/WSIFOutBinding.java
@@ -0,0 +1,82 @@
+/*
+ * 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.servicemix.components.wsif;
+
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.NormalizedMessage;
+
+import org.apache.servicemix.components.util.OutBinding;
+import org.apache.wsif.WSIFMessage;
+import org.apache.wsif.WSIFOperation;
+
+/**
+ * Consumers JBI messages and sends them as a oneway into WSIF
+ *
+ * @version $Revision: 429277 $
+ */
+public class WSIFOutBinding extends OutBinding {
+
+    private WSIFMarshaler marshaler = new WSIFMarshaler();
+    private WSIFOperationMap operationMap;
+
+    /**
+     * @deprecated use getMarshaler instead
+     */
+    public WSIFMarshaler getMarshaller() {
+        return marshaler;
+    }
+
+    /**
+     * @deprecated use setMarshaler instead
+     */
+    public void setMarshaller(WSIFMarshaler marshaler) {
+        this.marshaler = marshaler;
+    }
+
+    /**
+     * @return the marshaler
+     */
+    public WSIFMarshaler getMarshaler() {
+        return marshaler;
+    }
+
+    /**
+     * @param marshaler the marshaler to set
+     */
+    public void setMarshaler(WSIFMarshaler marshaler) {
+        this.marshaler = marshaler;
+    }
+
+    public WSIFOperationMap getOperationMap() {
+        return operationMap;
+    }
+
+    public void setOperationMap(WSIFOperationMap operationMap) {
+        this.operationMap = operationMap;
+    }
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+    protected void process(MessageExchange exchange, NormalizedMessage normalizedMessage) throws Exception {
+        WSIFOperationInfo operationInfo = operationMap.getOperationForExchange(exchange);
+        WSIFOperation operation = operationInfo.createWsifOperation();
+        WSIFMessage message = operation.createInputMessage();
+        marshaler.fromNMS(operationInfo, message, normalizedMessage, getBody(normalizedMessage));
+        operation.executeInputOnlyOperation(message);
+        done(exchange);
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/wsif/package.html b/common/servicemix-components/src/main/java/org/apache/servicemix/components/wsif/package.html
new file mode 100644
index 0000000..776bd98
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/wsif/package.html
@@ -0,0 +1,27 @@
+<!--
+
+    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.
+
+-->
+<html>
+<head>
+</head>
+<body>
+
+Bindings for <a href="http://ws.apache.org/wsif/">WSIF</a> 
+
+</body>
+</html>
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/xfire/XFireBinding.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/xfire/XFireBinding.java
new file mode 100644
index 0000000..ae399b1
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/xfire/XFireBinding.java
@@ -0,0 +1,80 @@
+/*
+ * 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.servicemix.components.xfire;
+
+import java.io.ByteArrayOutputStream;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.stream.XMLStreamReader;
+
+import org.apache.servicemix.components.util.OutBinding;
+import org.codehaus.xfire.MessageContext;
+import org.codehaus.xfire.XFire;
+import org.codehaus.xfire.exchange.InMessage;
+import org.codehaus.xfire.transport.Channel;
+import org.codehaus.xfire.transport.Transport;
+import org.codehaus.xfire.transport.local.LocalTransport;
+
+public class XFireBinding extends OutBinding {
+    private XMarshaler marshaler;
+
+    private XFire xfire;
+
+    public XFireBinding()
+    {
+        super();
+
+        this.marshaler = new XMarshaler();
+    }
+    
+    protected void process(MessageExchange messageExchange, NormalizedMessage nm) throws Exception {
+        
+        XMLStreamReader reader = marshaler.createStreamReader(nm);
+        if (reader == null) {
+            throw new JBIException("Could not get source as XMLStreamReader.");
+        }
+        
+        InMessage in = new InMessage(reader, "");
+        MessageContext context = new MessageContext();
+        context.setXFire(xfire);
+        context.setService(xfire.getServiceRegistry().getService(getService().getLocalPart()));
+
+        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+        context.setProperty(Channel.BACKCHANNEL_URI, buffer);
+        
+        Transport transport =  xfire.getTransportManager().getTransport(LocalTransport.BINDING_ID);
+        Channel channel = transport.createChannel();
+        channel.receive(context, in);
+
+        NormalizedMessage outMessage = messageExchange.createMessage();
+
+        marshaler.setContent(outMessage, buffer.toString());
+        marshaler.toNMS(outMessage, context.getOutMessage());
+
+        answer(messageExchange, outMessage);
+    }
+
+    public XFire getXfire() {
+        return xfire;
+    }
+
+    public void setXfire(XFire xfire) {
+        this.xfire = xfire;
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/xfire/XFireOutBinding.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/xfire/XFireOutBinding.java
new file mode 100644
index 0000000..f5f855d
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/xfire/XFireOutBinding.java
@@ -0,0 +1,70 @@
+/*
+ * 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.servicemix.components.xfire;
+
+import org.apache.servicemix.components.util.OutBinding;
+import org.codehaus.xfire.MessageContext;
+import org.codehaus.xfire.XFire;
+import org.codehaus.xfire.exchange.InMessage;
+import org.codehaus.xfire.transport.Channel;
+import org.codehaus.xfire.transport.Transport;
+import org.codehaus.xfire.transport.local.LocalTransport;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.stream.XMLStreamReader;
+
+public class XFireOutBinding extends OutBinding {
+    private XMarshaler marshaler;
+
+    private XFire xfire;
+
+    public XFireOutBinding()
+    {
+        super();
+
+        this.marshaler = new XMarshaler();
+    }
+    
+    protected void process(MessageExchange messageExchange, NormalizedMessage nm) throws Exception {
+        
+        XMLStreamReader reader = marshaler.createStreamReader(nm);
+        if (reader == null) {
+            throw new JBIException("Could not get source as XMLStreamReader.");
+        }
+
+        InMessage in = new InMessage(reader, "");
+        MessageContext context = new MessageContext();
+        context.setXFire(xfire);
+        context.setService(xfire.getServiceRegistry().getService(getService().getLocalPart()));
+
+        Transport transport = xfire.getTransportManager().getTransport(LocalTransport.BINDING_ID);
+        Channel channel = transport.createChannel();
+        channel.receive(context, in);
+
+        done(messageExchange);
+    }
+
+    public XFire getXfire() {
+        return xfire;
+    }
+
+    public void setXfire(XFire xfire) {
+        this.xfire = xfire;
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/xfire/XMarshaler.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/xfire/XMarshaler.java
new file mode 100644
index 0000000..062379d
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/xfire/XMarshaler.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.servicemix.components.xfire;
+
+import java.io.InputStream;
+import java.io.Writer;
+
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+import javax.xml.transform.Source;
+import javax.xml.transform.TransformerException;
+
+import org.apache.servicemix.jbi.jaxp.SourceTransformer;
+import org.apache.servicemix.jbi.jaxp.StAXSourceTransformer;
+import org.apache.servicemix.jbi.jaxp.StringSource;
+import org.codehaus.xfire.exchange.OutMessage;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class XMarshaler {
+
+    private StAXSourceTransformer transformer;
+    
+    public XMarshaler()
+    {
+        transformer = new StAXSourceTransformer();
+    }
+
+    public void setContent(NormalizedMessage message, String xml) throws MessagingException {
+        message.setContent(new StringSource(xml));
+    }
+
+    public XMLStreamReader createStreamReader(NormalizedMessage message) throws XMLStreamException, TransformerException {
+        Source content = message.getContent();
+        return transformer.toXMLStreamReader(content);
+    }
+
+
+    public XMLStreamWriter createStreamWriter(Writer writer) throws XMLStreamException {
+        return transformer.getOutputFactory().createXMLStreamWriter(writer);
+    }
+
+    /**
+     * Converts from an NMS message to an ActiveSOAP message exchange
+     */
+    public void fromNMS(MessageExchange asExchange, NormalizedMessage normalizedMessage) {
+    }
+
+    /**
+     * Converts from an ActiveSOAP message exchange to an NMS message
+     */
+    public void toNMS(NormalizedMessage normalizedMessage, OutMessage outMessage) {
+    }
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/xfire/package.html b/common/servicemix-components/src/main/java/org/apache/servicemix/components/xfire/package.html
new file mode 100644
index 0000000..fd14389
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/xfire/package.html
@@ -0,0 +1,27 @@
+<!--
+
+    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.
+
+-->
+<html>
+<head>
+</head>
+<body>
+
+Bindings for integrating with the <a href="http://xfire.codehaus.org/">XFire</a> SOAP framework
+
+</body>
+</html>
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/xslt/XalanExtension.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/xslt/XalanExtension.java
new file mode 100644
index 0000000..6dc5ec6
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/xslt/XalanExtension.java
@@ -0,0 +1,255 @@
+/*
+ * 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.servicemix.components.xslt;
+
+import org.apache.commons.lang.math.NumberUtils;
+import org.apache.servicemix.components.util.ComponentSupport;
+import org.apache.servicemix.components.util.CopyTransformer;
+import org.apache.servicemix.components.util.MarshalerSupport;
+import org.apache.xalan.extensions.XSLProcessorContext;
+import org.apache.xalan.lib.ExsltDynamic;
+import org.apache.xalan.templates.ElemTemplateElement;
+import org.apache.xalan.transformer.TransformerImpl;
+import org.apache.xml.utils.DOMBuilder;
+import org.apache.xml.utils.PrefixResolver;
+import org.apache.xpath.objects.XObject;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.xml.sax.SAXNotSupportedException;
+
+import javax.jbi.messaging.Fault;
+import javax.jbi.messaging.InOnly;
+import javax.jbi.messaging.InOut;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.namespace.QName;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.dom.DOMSource;
+
+/**
+ * An extension to allow <a href="http://xml.apache.org/xalan/">Xalan</a> to perform XPath based routing using
+ * ServiceMix.
+ *
+ * @version $Revision: 426415 $
+ */
+public class XalanExtension extends MarshalerSupport {
+
+    // Extension elements
+    //-------------------------------------------------------------------------
+
+
+    /**
+     * Forwards the inbound message to the destination copying the content and properties
+     */
+    public void forward(XSLProcessorContext context, Element element) throws MessagingException {
+        ComponentSupport component = getComponent(context, element);
+        if (component == null) {
+            throw new MessagingException("Could not find a component on which to perform the service invocation!");
+        }
+
+        TransformerImpl transformer = context.getTransformer();
+        PrefixResolver namespaceContext = transformer.getXPathContext().getNamespaceContext();
+
+        QName service = getQNameAttribute(namespaceContext, element, "service");
+        QName interfaceName = getQNameAttribute(namespaceContext, element, "interface");
+        QName operation = getQNameAttribute(namespaceContext, element, "operation");
+
+        MessageExchange exchange = getExchange(context, element);
+        NormalizedMessage in = getInMessage(context, element);
+
+        // TODO we should allow nested setOutProperty tags
+
+        component.invoke(exchange, in, service, interfaceName, operation);
+    }
+
+    /**
+     * Invokes the service with the XML content included in the XML element
+     */
+    public void invoke(XSLProcessorContext context, ElemTemplateElement element) throws MessagingException, ParserConfigurationException, TransformerException {
+        ComponentSupport component = getComponent(context, element);
+        if (component == null) {
+            throw new MessagingException("Could not find a component on which to perform the service invocation!");
+        }
+
+        TransformerImpl transformer = context.getTransformer();
+        PrefixResolver namespaceContext = transformer.getXPathContext().getNamespaceContext();
+
+        QName service = getQNameAttribute(namespaceContext, element, "service");
+        QName interfaceName = getQNameAttribute(namespaceContext, element, "interface");
+        QName operation = getQNameAttribute(namespaceContext, element, "operation");
+
+        InOnly outExchange = component.createInOnlyExchange(service, interfaceName, operation);
+        NormalizedMessage out = outExchange.createMessage();
+        outExchange.setInMessage(out);
+
+        transformer.setParameter("out", out);
+
+        // lets copy the content into the body
+        Document document = getTransformer().createDocument();
+        DOMBuilder builder = new DOMBuilder(document);
+        transformer.executeChildTemplates(element, context.getContextNode(), context.getMode(), builder);
+        
+        out.setContent(new DOMSource(document));
+
+        // now lets perform the invocation
+        component.send(outExchange);
+    }
+
+    /**
+     * Calls the service with the XML content included in the XML element and outputs the XML content
+     */
+    public void call(XSLProcessorContext context, ElemTemplateElement element) throws MessagingException, ParserConfigurationException, TransformerException {
+        ComponentSupport component = getComponent(context, element);
+        if (component == null) {
+            throw new MessagingException("Could not find a component on which to perform the service invocation!");
+        }
+
+        TransformerImpl transformer = context.getTransformer();
+        PrefixResolver namespaceContext = transformer.getXPathContext().getNamespaceContext();
+
+        QName service = getQNameAttribute(namespaceContext, element, "service");
+        QName interfaceName = getQNameAttribute(namespaceContext, element, "interface");
+        QName operation = getQNameAttribute(namespaceContext, element, "operation");
+
+        InOut outExchange = component.createInOutExchange(service, interfaceName, operation);
+        NormalizedMessage out = outExchange.createMessage();
+        outExchange.setInMessage(out);
+
+
+        // lets copy the content into the body
+        Document document = getTransformer().createDocument();
+        DOMBuilder builder = new DOMBuilder(document);
+        transformer.executeChildTemplates(element, context.getContextNode(), context.getMode(), builder);
+
+        out.setContent(new DOMSource(document));
+
+        // now lets perform the invocation
+        if (component.getDeliveryChannel().sendSync(outExchange)) {
+            NormalizedMessage result = outExchange.getOutMessage();
+            String outVarName = getAttribute(element, "outVar", "out");
+            transformer.setParameter(outVarName, result);
+        }
+        else {
+            Exception error = outExchange.getError();
+            if (error != null) {
+                transformer.setParameter("error", error);
+            }
+            Fault fault = outExchange.getFault();
+            if (fault != null) {
+                transformer.setParameter("fault", fault);
+            }
+        }
+
+    }
+
+    /**
+     * Copies the properties from the input to the output message
+     */
+    public void copyProperties(XSLProcessorContext context, Element element) throws MessagingException {
+        NormalizedMessage in = getInMessage(context, element);
+        NormalizedMessage out = getOutMessage(context, element);
+        CopyTransformer.copyProperties(in, out);
+    }
+
+    /**
+     * Sets a named property on the output message
+     */
+    public void setOutProperty(XSLProcessorContext context, ElemTemplateElement element) throws MessagingException, SAXNotSupportedException {
+        NormalizedMessage out = getOutMessage(context, element);
+        String name = element.getAttribute("name");
+        if (name == null) {
+            throw new IllegalArgumentException("Must specify a 'name' attribute to set a property on the output message");
+        }
+        String xpath = element.getAttribute("select");
+        if (xpath == null) {
+            throw new IllegalArgumentException("Must specify a 'select' attribute to set a property on the output message");
+        }
+        XObject answer = ExsltDynamic.evaluate(context.getTransformer().getXPathContext().getExpressionContext(), xpath);
+        Object value;
+        try {
+            if (answer.getType() == XObject.CLASS_NUMBER) {
+                value = NumberUtils.createNumber(answer.str());
+            } else if (answer.getType() == XObject.CLASS_BOOLEAN) {
+                value = new Boolean(answer.bool());
+            } else {
+                // XObject guarantees we are never null.
+                value = answer.str();
+            }
+        } catch (TransformerException e) {
+            value = answer.str();
+        } catch (NumberFormatException e) {
+            value = answer.str();
+        }
+        out.setProperty(name, value);
+    }
+
+    // Extension XPath functions
+    //-------------------------------------------------------------------------
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+    protected ComponentSupport getComponent(XSLProcessorContext context, Element element) {
+        return (ComponentSupport) getParameter(context, "component");
+    }
+
+    protected MessageExchange getExchange(XSLProcessorContext context, Element element) {
+        return (MessageExchange) getParameter(context, "exchange");
+    }
+
+    protected NormalizedMessage getInMessage(XSLProcessorContext context, Element element) {
+        return (NormalizedMessage) getParameter(context, "in");
+    }
+
+    protected NormalizedMessage getOutMessage(XSLProcessorContext context, Element element) {
+        return (NormalizedMessage) getParameter(context, "out");
+    }
+
+    protected Object getParameter(XSLProcessorContext context, String name) {
+        return context.getTransformer().getParameter(name);
+    }
+
+    protected QName getQNameAttribute(PrefixResolver namespaceContext, Element element, String name) {
+        String qualifiedName = element.getAttribute(name);
+        if (qualifiedName != null) {
+            int index = qualifiedName.indexOf(':');
+            if (index >= 0) {
+                String prefix = qualifiedName.substring(0, index);
+                String localName = qualifiedName.substring(index + 1);
+                String uri = namespaceContext.getNamespaceForPrefix(prefix);
+                return new QName(uri, localName, prefix);
+            }
+            else {
+                String uri = namespaceContext.getNamespaceForPrefix("");
+                if (uri != null) {
+                    return new QName(uri, qualifiedName);
+                }
+                return new QName(qualifiedName);
+            }
+        }
+        return null;
+    }
+
+    protected String getAttribute(Element element, String attribute, String defaultValue) {
+        String answer = element.getAttribute(attribute);
+        if (answer == null || answer.length() == 0) {
+            answer = defaultValue;
+        }
+        return answer;
+    }
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/xslt/XsltComponent.java b/common/servicemix-components/src/main/java/org/apache/servicemix/components/xslt/XsltComponent.java
new file mode 100644
index 0000000..8c804ce
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/xslt/XsltComponent.java
@@ -0,0 +1,275 @@
+/*
+ * 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.servicemix.components.xslt;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.net.URL;
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Templates;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.apache.servicemix.MessageExchangeListener;
+import org.apache.servicemix.components.util.TransformComponentSupport;
+import org.apache.servicemix.jbi.jaxp.BytesSource;
+import org.apache.servicemix.jbi.jaxp.SourceTransformer;
+import org.apache.servicemix.jbi.jaxp.StringSource;
+import org.springframework.core.io.Resource;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+
+/**
+ * An <a href="http://www.w3.org/TR/xslt">XSLT</a> based JBI component using <a
+ * href="http://java.sun.com/xml/jaxp/">JAXP</a> to perform the XSLT
+ * transformation.
+ * 
+ * @version $Revision: 464270 $
+ */
+public class XsltComponent extends TransformComponentSupport implements MessageExchangeListener {
+
+    private TransformerFactory transformerFactory;
+    private Source xsltSource;
+    private Resource xsltResource;
+    private Templates templates;
+    private boolean disableOutput;
+    private boolean useStringBuffer = true;
+    private boolean forceDocIfDom = true;
+    private Map xsltParameters;
+
+    /**
+     * @return the forceDocIfDom
+     */
+    public boolean isForceDocIfDom() {
+        return forceDocIfDom;
+    }
+
+    /**
+     * @param forceDocIfDom the forceDocIfDom to set
+     */
+    public void setForceDocIfDom(boolean forceDocIfDom) {
+        this.forceDocIfDom = forceDocIfDom;
+    }
+
+    // Properties
+    // -------------------------------------------------------------------------
+    public TransformerFactory getTransformerFactory() {
+        if (transformerFactory == null) {
+            transformerFactory = TransformerFactory.newInstance();
+        }
+        return transformerFactory;
+    }
+
+    public void setTransformerFactory(TransformerFactory transformerFactory) {
+        this.transformerFactory = transformerFactory;
+    }
+
+    public Source getXsltSource() throws Exception {
+        if (xsltSource == null) {
+            // lets create a new one each time
+            // as we can only read a stream once
+            xsltSource = createXsltSource();
+        }
+        return xsltSource;
+    }
+
+    public void setXsltSource(Source xsltSource) {
+        this.xsltSource = xsltSource;
+    }
+
+    public Resource getXsltResource() {
+        return xsltResource;
+    }
+
+    public void setXsltResource(Resource xsltResource) {
+        this.xsltResource = xsltResource;
+    }
+
+    public boolean isDisableOutput() {
+        return disableOutput;
+    }
+
+    public void setDisableOutput(boolean disableOutput) {
+        this.disableOutput = disableOutput;
+    }
+
+    public boolean isUseStringBuffer() {
+        return useStringBuffer;
+    }
+
+    public void setUseStringBuffer(boolean useStringBuffer) {
+        this.useStringBuffer = useStringBuffer;
+    }
+
+    /**
+     * @return the xsltParameters
+     */
+    public Map getXsltParameters() {
+        return xsltParameters;
+    }
+
+    /**
+     * @param xsltParameters the xsltParameters to set
+     */
+    public void setXsltParameters(Map xsltParameters) {
+        this.xsltParameters = xsltParameters;
+    }
+
+    // Implementation methods
+    // -------------------------------------------------------------------------
+    protected boolean transform(MessageExchange exchange, NormalizedMessage in, NormalizedMessage out)
+            throws MessagingException {
+        try {
+            Transformer transformer = createTransformer(exchange, in);
+            configureTransformer(transformer, exchange, in);
+            copyPropertiesAndAttachments(exchange, in, out);
+            transformContent(transformer, exchange, in, out);
+            return shouldOutputResult(transformer);
+        }
+        catch (Exception e) {
+            throw new MessagingException("Failed to transform: " + e, e);
+        }
+    }
+
+    protected void transformContent(Transformer transformer, MessageExchange exchange, NormalizedMessage in, NormalizedMessage out) throws TransformerException, MessagingException, ParserConfigurationException {
+        Source src = in.getContent();
+        if (forceDocIfDom && src instanceof DOMSource) {
+            Node n = ((DOMSource) src).getNode();
+            if (n instanceof Document == false) {
+                Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
+                doc.appendChild(doc.importNode(n, true));
+                src = new DOMSource(doc);
+            }
+        }
+        if (isUseStringBuffer()) {
+            StringWriter buffer = new StringWriter();
+            Result result = new StreamResult(buffer);
+            transformer.transform(src, result);
+            out.setContent(new StringSource(buffer.toString()));
+        }
+        else {
+            ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+            Result result = new StreamResult(buffer);
+            transformer.transform(src, result);
+            out.setContent(new BytesSource(buffer.toByteArray()));
+        }
+    }
+
+    /**
+     * Should we disable output of the result of the XSLT?
+     */
+    protected boolean shouldOutputResult(Transformer transformer) {
+        if (disableOutput) {
+            return false;
+        }
+        return true;
+        /**
+         * String value = transformer.getOutputProperty("disableOutput"); return
+         * value == null || !value.equals("true");
+         */
+    }
+
+    protected Source createXsltSource() throws Exception {
+        if (xsltResource != null) {
+            return new DOMSource(parse(xsltResource));
+        }
+        return null;
+    }
+
+    protected Document parse(Resource res) throws Exception {
+        URL url = null;
+        try {
+            res.getURL();
+        } catch (IOException e) {
+            // Ignore
+        }
+        DocumentBuilder builder = new SourceTransformer().createDocumentBuilder();
+        return builder.parse(res.getInputStream(), url != null ? url.toExternalForm() : null);
+    }
+
+    
+    public Templates getTemplates() throws Exception {
+        if (templates == null) {
+            templates = createTemplates();
+        }
+        return templates;
+    }
+
+    /**
+     * Factory method to create a new transformer instance
+     */
+    protected Templates createTemplates() throws Exception {
+        Source source = getXsltSource();
+        return getTransformerFactory().newTemplates(source);
+    }
+
+    /**
+     * Factory method to create a new transformer instance
+     */
+    protected Transformer createTransformer(MessageExchange exchange, NormalizedMessage in)
+            throws Exception {
+        Source source = getXsltSource();
+        if (source == null) {
+            return getTransformerFactory().newTransformer();
+        }
+        else {
+            return getTemplates().newTransformer();
+        }
+    }
+
+    /**
+     * A hook to allow the transformer to be configured from the current
+     * exchange and inbound message
+     */
+    protected void configureTransformer(Transformer transformer, MessageExchange exchange, NormalizedMessage in) {
+        for (Iterator iter = exchange.getPropertyNames().iterator(); iter.hasNext();) {
+            String name = (String) iter.next();
+            Object value = exchange.getProperty(name);
+            transformer.setParameter(name, value);
+        }
+        for (Iterator iter = in.getPropertyNames().iterator(); iter.hasNext();) {
+            String name = (String) iter.next();
+            Object value = in.getProperty(name);
+            transformer.setParameter(name, value);
+        }
+        if (xsltParameters != null) {
+            for (Iterator iter = xsltParameters.keySet().iterator(); iter.hasNext();) {
+                String name = (String) iter.next();
+                Object value = xsltParameters.get(name);
+                transformer.setParameter(name, value);
+            }
+        }
+        transformer.setParameter("exchange", exchange);
+        transformer.setParameter("in", in);
+        transformer.setParameter("component", this);
+    }
+
+}
diff --git a/common/servicemix-components/src/main/java/org/apache/servicemix/components/xslt/package.html b/common/servicemix-components/src/main/java/org/apache/servicemix/components/xslt/package.html
new file mode 100644
index 0000000..c831662
--- /dev/null
+++ b/common/servicemix-components/src/main/java/org/apache/servicemix/components/xslt/package.html
@@ -0,0 +1,30 @@
+<!--
+
+    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.
+
+-->
+<html>
+<head>
+</head>
+<body>
+
+<p>
+An <a href="http://www.w3.org/TR/xslt">XSLT</a> based JBI component using
+<a href="http://java.sun.com/xml/jaxp/">JAXP</a> to perform the XSLT transformation.
+</p>
+
+</body>
+</html>
diff --git a/common/servicemix-components/src/main/resources/META-INF/drools-servicemix.conf b/common/servicemix-components/src/main/resources/META-INF/drools-servicemix.conf
new file mode 100644
index 0000000..66ed265
--- /dev/null
+++ b/common/servicemix-components/src/main/resources/META-INF/drools-servicemix.conf
@@ -0,0 +1,25 @@
+#
+#    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.
+#
+
+module.uri=http://drools.org/semantics/servicemix
+
+ImportEntry(import)      : org.drools.semantics.base.BaseImportEntryFactory
+ObjectType(class)        : org.drools.semantics.base.ClassObjectTypeFactory
+Condition(condition)     : org.apache.servicemix.components.drools.dsl.JaxenConditionFactory
+Consequence(invoke)      : org.apache.servicemix.components.drools.dsl.InvokeConsequenceFactory
+Consequence(forward)     : org.apache.servicemix.components.drools.dsl.ForwardConsequenceFactory
+Consequence(route)       : org.apache.servicemix.components.drools.dsl.RouteConsequenceFactory
diff --git a/common/servicemix-components/src/main/resources/META-INF/drools.conf b/common/servicemix-components/src/main/resources/META-INF/drools.conf
new file mode 100644
index 0000000..0eade3c
--- /dev/null
+++ b/common/servicemix-components/src/main/resources/META-INF/drools.conf
@@ -0,0 +1,17 @@
+#

+#    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.

+#

+drools-servicemix
\ No newline at end of file
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/cache/CacheTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/cache/CacheTest.java
new file mode 100644
index 0000000..1ca363b
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/cache/CacheTest.java
@@ -0,0 +1,84 @@
+/*
+ * 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.servicemix.components.cache;
+
+import javax.xml.namespace.QName;
+import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMSource;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.jbi.api.EndpointResolver;
+import org.apache.servicemix.tck.TestSupport;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.w3c.dom.Node;
+
+/**
+ * @version $Revision: 690396 $
+ */
+public class CacheTest extends TestSupport {
+    private static transient Log log = LogFactory.getLog(CacheTest.class);
+
+    public void testCache() throws Exception {
+        EndpointResolver cachedService = client.createResolverForService(new QName("http://servicemix.org/cheese/", "myService"));
+        EndpointResolver service = client.createResolverForService(new QName("http://servicemix.org/cheese/", "myServiceImpl"));
+
+        Object object = client.request(cachedService, null, null, "<foo id='123'/>");
+        if (object instanceof Node) {
+            object = new DOMSource((Node) object);
+        }
+        String text = transformer.toString((Source) object);
+
+        log.info("Cache: Received response: " + text);
+
+        object = client.request(cachedService, null, null, "<foo id='123'/>");
+        if (object instanceof Node) {
+            object = new DOMSource((Node) object);
+        }
+        String text2 = transformer.toString((Source) object);
+
+        log.info("Cache: Received response: " + text2);
+
+        assertEquals("Responses should be equal", text, text2);
+
+
+        // now lets try the underlying service to check we get different results each time
+        object = client.request(service, null, null, "<foo id='123'/>");
+        if (object instanceof Node) {
+            object = new DOMSource((Node) object);
+        }
+        text = transformer.toString((Source) object);
+
+        log.info("ServiceImpl: Received response: " + text);
+
+        object = client.request(service, null, null, "<foo id='123'/>");
+        if (object instanceof Node) {
+            object = new DOMSource((Node) object);
+        }
+        text2 = transformer.toString((Source) object);
+
+        log.info("ServiceImpl: Received response: " + text2);
+
+        assertTrue("Responses should be different but were both: " + text, !text.equals(text2));
+
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/cache/example.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/drools/DroolsRouteTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/drools/DroolsRouteTest.java
new file mode 100644
index 0000000..1f8d3a9
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/drools/DroolsRouteTest.java
@@ -0,0 +1,80 @@
+/*
+ * 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.servicemix.components.drools;
+
+import javax.jbi.messaging.ExchangeStatus;
+import javax.jbi.messaging.InOut;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.namespace.QName;
+
+import org.apache.servicemix.jbi.jaxp.StringSource;
+import org.apache.servicemix.tck.TestSupport;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * @version $Revision: 376451 $
+ */
+public class DroolsRouteTest extends TestSupport {
+
+    public void testFiringRules() throws Exception {
+        QName service = new QName("http://servicemix.org/cheese/", "droolsRouter");
+
+        InOut exchange = client.createInOutExchange();
+        exchange.setService(service);
+        NormalizedMessage message = exchange.getInMessage();
+        message.setContent(new StringSource(createMessageXmlText(1)));
+        client.sendSync(exchange);
+        assertEquals(ExchangeStatus.ACTIVE, exchange.getStatus());
+        Node node = transformer.toDOMNode(exchange.getOutMessage().getContent());
+        Element e = null;
+        if (node instanceof Element) {
+            e = (Element) node;
+        } else if (node instanceof Document) {
+            e = ((Document) node).getDocumentElement();
+        } else {
+            fail("Node should be an Element or a Document");
+        }
+        assertEquals("hello", e.getLocalName());
+        client.done(exchange);
+
+        exchange = client.createInOutExchange();
+        exchange.setService(service);
+        message = exchange.getInMessage();
+        message.setContent(new StringSource(createMessageXmlText(2)));
+        client.sendSync(exchange);
+        assertEquals(ExchangeStatus.ACTIVE, exchange.getStatus());
+        node = transformer.toDOMNode(exchange.getOutMessage().getContent());
+        e = null;
+        if (node instanceof Element) {
+            e = (Element) node;
+        } else if (node instanceof Document) {
+            e = ((Document) node).getDocumentElement();
+        } else {
+            fail("Node should be an Element or a Document");
+        }
+        assertEquals("world", e.getLocalName());
+        client.done(exchange);
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/drools/jbi-example-route.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/drools/DroolsTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/drools/DroolsTest.java
new file mode 100644
index 0000000..6a89031
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/drools/DroolsTest.java
@@ -0,0 +1,40 @@
+/*
+ * 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.servicemix.components.drools;
+
+import javax.xml.namespace.QName;
+
+import org.apache.servicemix.tck.TestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class DroolsTest extends TestSupport {
+
+    public void testFiringRules() throws Exception {
+        QName service = new QName("http://servicemix.org/cheese/", "droolsRouter");
+
+        sendMessages(service, 20);
+        assertMessagesReceived(19);
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/drools/example.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/drools/DroolsWithJbiRulesForwardTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/drools/DroolsWithJbiRulesForwardTest.java
new file mode 100644
index 0000000..dd94610
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/drools/DroolsWithJbiRulesForwardTest.java
@@ -0,0 +1,38 @@
+/*
+ * 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.servicemix.components.drools;
+
+import javax.xml.namespace.QName;
+
+import org.springframework.context.support.AbstractXmlApplicationContext;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class DroolsWithJbiRulesForwardTest extends DroolsTest {
+
+    public void testFiringRules() throws Exception {
+        QName service = new QName("http://servicemix.org/cheese/", "droolsRouter");
+
+        sendMessages(service, 3);
+        assertMessagesReceived(4);
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new org.apache.xbean.spring.context.ClassPathXmlApplicationContext("org/apache/servicemix/components/drools/jbi-example-forward.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/drools/DroolsWithJbiRulesTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/drools/DroolsWithJbiRulesTest.java
new file mode 100644
index 0000000..92c46c5
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/drools/DroolsWithJbiRulesTest.java
@@ -0,0 +1,30 @@
+/*
+ * 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.servicemix.components.drools;
+
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class DroolsWithJbiRulesTest extends DroolsTest {
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/drools/jbi-example.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/email/EmailTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/email/EmailTest.java
new file mode 100644
index 0000000..34c401b
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/email/EmailTest.java
@@ -0,0 +1,52 @@
+/*
+ * 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.servicemix.components.email;
+
+import java.util.Date;
+
+import javax.jbi.messaging.InOnly;
+import javax.jbi.messaging.NormalizedMessage;
+
+import org.apache.servicemix.tck.TestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class EmailTest extends TestSupport {
+
+    public void testSendUsingMessageProperties() throws Exception {
+
+        // START SNIPPET: email
+        InOnly exchange = client.createInOnlyExchange();
+        NormalizedMessage message = exchange.getInMessage();
+
+        message.setProperty("org.apache.servicemix.email.to", "scm@servicemix.org");
+        message.setProperty("org.apache.servicemix.email.from", "junit@servicemix.org");
+        message.setProperty("org.apache.servicemix.email.subject", "Hello from JUnit!");
+        message.setProperty("org.apache.servicemix.email.text", "Hi from test case: " + getName() + " running at: " + new Date());
+
+        client.sendSync(exchange);
+        // END SNIPPET: email
+
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/email/example.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/email/MimeMailTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/email/MimeMailTest.java
new file mode 100644
index 0000000..e6609b1
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/email/MimeMailTest.java
@@ -0,0 +1,182 @@
+/*
+ * 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.servicemix.components.email;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.activation.DataHandler;
+import javax.jbi.messaging.InOnly;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.mail.Part;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
+import javax.xml.namespace.QName;
+import javax.xml.transform.Source;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.jbi.resolver.ServiceNameEndpointResolver;
+import org.apache.servicemix.jbi.util.ByteArrayDataSource;
+import org.apache.servicemix.tck.TestSupport;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+
+/**
+ * @version $Revision: 556864 $
+ */
+public class MimeMailTest extends TestSupport {
+
+    private static transient Log log = LogFactory.getLog(MimeMailTest.class);
+
+    public void testSendUsingMessageProperties() throws Exception {
+
+        // START SNIPPET: email
+        InOnly exchange = client.createInOnlyExchange();
+        NormalizedMessage message = exchange.getInMessage();
+
+        message.setProperty("org.apache.servicemix.email.to", "scm@servicemix.org");
+        message.setProperty("org.apache.servicemix.email.from", "junit@servicemix.org");
+        message.setProperty("org.apache.servicemix.email.subject", "Hello from JUnit!");
+        message.setProperty("org.apache.servicemix.email.text", "Hi from test case: " + getName() + " running at: " + new Date());
+
+        client.send(exchange);
+        // END SNIPPET: email
+
+        // lest find the test sender
+        StubJavaMailSender sender = (StubJavaMailSender) getBean("javaMailSender");
+        sender.assertMessagesReceived(1);
+        List messages = sender.getMessages();
+        assertEquals("message size: " + messages, 1, messages.size());
+
+        MimeMessage mail = (MimeMessage) messages.get(0);
+
+        log.info("Created message: " + message);
+
+        assertEquals("subject", "Hello from JUnit!", mail.getSubject());
+    }
+    
+    public void testSendUsingMessagePropertiesWithMultipleRecipients() throws Exception {
+
+        // START SNIPPET: email
+        InOnly exchange = client.createInOnlyExchange();
+        NormalizedMessage message = exchange.getInMessage();
+
+        message.setProperty("org.apache.servicemix.email.to", "scm@servicemix.org,foo@servicemix.org");
+        message.setProperty("org.apache.servicemix.email.cc", "bar@servicemix.org,baz@servicemix.org");
+        message.setProperty("org.apache.servicemix.email.bcc", "guinness@servicemix.org,harper@servicemix.org");
+        message.setProperty("org.apache.servicemix.email.from", "junit@servicemix.org");
+        message.setProperty("org.apache.servicemix.email.subject", "Hello from JUnit!");
+        message.setProperty("org.apache.servicemix.email.text", "Hi from test case: " + getName() + " running at: " + new Date());
+
+        client.send(exchange);
+        // END SNIPPET: email
+
+        // lest find the test sender
+        StubJavaMailSender sender = (StubJavaMailSender) getBean("javaMailSender");
+        sender.assertMessagesReceived(1);
+        List messages = sender.getMessages();
+        assertEquals("message size: " + messages, 1, messages.size());
+
+        MimeMessage mail = (MimeMessage) messages.get(0);
+
+        log.info("Created message: " + message);
+
+        assertEquals("subject", "Hello from JUnit!", mail.getSubject());
+    }
+
+    public void testUsingXPathExpressionsInEmail() throws Exception {
+
+        // START SNIPPET: xpath
+        QName xpathSender = new QName("http://servicemix.org/cheese/", "emailSenderWithExpressions");
+        ServiceNameEndpointResolver resolver = new ServiceNameEndpointResolver(xpathSender);
+
+        InOnly exchange = client.createInOnlyExchange(resolver);
+
+        Source source = getSourceFromClassPath("request.xml");
+        exchange.getInMessage().setContent(source);
+
+        client.send(exchange);
+        // END SNIPPET: xpath
+
+        // lest find the test sender
+        StubJavaMailSender sender = (StubJavaMailSender) getBean("javaMailSender");
+        sender.assertMessagesReceived(1);
+        List messages = sender.getMessages();
+        assertEquals("message size: " + messages, 1, messages.size());
+
+        MimeMessage message = (MimeMessage) messages.get(0);
+
+        log.info("Created message: " + message);
+
+        assertEquals("subject", "Drink a beer James", message.getSubject());
+    }
+
+    public void testUsingXPathExpressionsInEmailWithAttachment() throws Exception {
+
+        // START SNIPPET: xpath
+        QName xpathSender = new QName("http://servicemix.org/cheese/", "emailSenderWithExpressionsAndAttachment");
+        ServiceNameEndpointResolver resolver = new ServiceNameEndpointResolver(xpathSender);
+
+        InOnly exchange = client.createInOnlyExchange(resolver);
+
+        Source source = getSourceFromClassPath("request.xml");
+        exchange.getInMessage().setContent(source);
+        ByteArrayDataSource ds = new ByteArrayDataSource("hello".getBytes(), "text/plain");
+        ds.setName("id");
+        exchange.getInMessage().addAttachment("id", new DataHandler(ds));
+
+        client.send(exchange);
+        // END SNIPPET: xpath
+
+        // lest find the test sender
+        StubJavaMailSender sender = (StubJavaMailSender) getBean("javaMailSender");
+        sender.assertMessagesReceived(1);
+        List messages = sender.getMessages();
+        assertEquals("message size: " + messages, 1, messages.size());
+
+        MimeMessage message = (MimeMessage) messages.get(0);
+
+        log.info("Created message: " + message);
+        Object content = message.getContent();
+        assertTrue(content instanceof MimeMultipart);
+        MimeMultipart contentMP = (MimeMultipart) content;
+        assertEquals(contentMP.getCount(), 3); // first attachement for text body and second for file attached
+        Part part = contentMP.getBodyPart(0);
+        assertTrue(part.isMimeType("text/plain"));
+        Set names = new HashSet();
+        part = contentMP.getBodyPart(1);
+        String disposition = part.getDisposition();
+        assertTrue(disposition.equalsIgnoreCase(Part.ATTACHMENT));
+        DataHandler att = part.getDataHandler();
+        names.add(att.getName().toLowerCase());
+        part = contentMP.getBodyPart(2);
+        disposition = part.getDisposition();
+        assertTrue(disposition.equalsIgnoreCase(Part.ATTACHMENT));
+        att = part.getDataHandler();
+        names.add(att.getName().toLowerCase());
+        assertTrue(names.contains("example.xml"));
+        assertTrue(names.contains("id"));
+        assertEquals("subject", "Drink a beer James", message.getSubject());
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/email/mimeMail.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/email/SimpleMailTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/email/SimpleMailTest.java
new file mode 100644
index 0000000..90cfd80
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/email/SimpleMailTest.java
@@ -0,0 +1,105 @@
+/*
+ * 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.servicemix.components.email;
+
+import java.util.Date;
+import java.util.List;
+
+import javax.jbi.messaging.InOnly;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.namespace.QName;
+import javax.xml.transform.Source;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.jbi.resolver.ServiceNameEndpointResolver;
+import org.apache.servicemix.tck.TestSupport;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.springframework.mail.SimpleMailMessage;
+
+/**
+ * @version $Revision: 556864 $
+ */
+public class SimpleMailTest extends TestSupport {
+
+    private static final transient Log log = LogFactory.getLog(SimpleMailTest.class);
+
+    public void testUsingXPathExpressionsInSimpleEmail() throws Exception {
+
+        // START SNIPPET: xpathSimple
+        QName xpathSender = new QName("http://servicemix.org/cheese/", "simpleMailSenderWithExpressions");
+        ServiceNameEndpointResolver resolver = new ServiceNameEndpointResolver(xpathSender);
+
+        InOnly exchange = client.createInOnlyExchange(resolver);
+
+        Source source = getSourceFromClassPath("request.xml");
+        exchange.getInMessage().setContent(source);
+
+        client.send(exchange);
+        // END SNIPPET: xpathSimple
+
+        // lest find the test sender
+        StubJavaMailSender sender = (StubJavaMailSender) getBean("javaMailSender");
+        sender.assertMessagesReceived(1);
+
+        List messages = sender.getMessages();
+        assertEquals("message size: " + messages, 1, messages.size());
+
+        SimpleMailMessage message = (SimpleMailMessage) messages.get(0);
+
+        log.info("Created message: " + message);
+
+        assertEquals("text", "Hello there James how are you today?", message.getText());
+        assertEquals("from", "james@nowhere.com", message.getFrom());
+    }
+
+    public void testUsingPropertyExpressionsInSimpleEmail() throws Exception {
+        // START SNIPPET: xpathSimple
+        QName xpathSender = new QName("http://servicemix.org/cheese/", "simpleMailSenderWithPropertyExpressions");
+        ServiceNameEndpointResolver resolver = new ServiceNameEndpointResolver(xpathSender);
+
+        InOnly exchange = client.createInOnlyExchange(resolver);
+        NormalizedMessage message = exchange.getInMessage();
+
+        message.setProperty("to", "scm@servicemix.org");
+        message.setProperty("from", "junit@servicemix.org");
+        message.setProperty("text", "Hi from test case: " + getName() + " running at: " + new Date());
+
+        client.send(exchange);
+        // END SNIPPET: xpathSimple
+
+        // lest find the test sender
+        StubJavaMailSender sender = (StubJavaMailSender) getBean("javaMailSender");
+        sender.assertMessagesReceived(1);
+
+        List messages = sender.getMessages();
+
+        assertEquals("message size: " + messages, 1, messages.size());
+
+        SimpleMailMessage mailMessage = (SimpleMailMessage) messages.get(0);
+
+        log.info("Created message: " + mailMessage);
+
+        assertEquals("subject", "Subject came from expression", mailMessage.getSubject());
+        assertEquals("from", "junit@servicemix.org", mailMessage.getFrom());
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/email/simpleMail.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/email/StubJavaMailSender.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/email/StubJavaMailSender.java
new file mode 100644
index 0000000..fea7aad
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/email/StubJavaMailSender.java
@@ -0,0 +1,170 @@
+/*
+ * 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.servicemix.components.email;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.mail.Session;
+import javax.mail.internet.MimeMessage;
+
+import junit.framework.Assert;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.mail.MailException;
+import org.springframework.mail.SimpleMailMessage;
+import org.springframework.mail.javamail.JavaMailSender;
+import org.springframework.mail.javamail.MimeMessagePreparator;
+
+/**
+ * A stub {@link JavaMailSender} useful for testing.
+ *
+ * @version $Revision: 556864 $
+ */
+public class StubJavaMailSender extends Assert implements JavaMailSender {
+
+    private static transient Log log = LogFactory.getLog(StubJavaMailSender.class);
+
+    private List messages = new ArrayList();
+    private Object semaphore = new Object();
+
+    public void send(MimeMessage mimeMessage) throws MailException {
+        addMessage(mimeMessage);
+    }
+
+    public void send(MimeMessagePreparator preparator) throws MailException {
+        try {
+            MimeMessage message = createMimeMessage();
+            preparator.prepare(message);
+            send(message);
+        }
+        catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public MimeMessage createMimeMessage() {
+        return new MimeMessage((Session) null);
+    }
+
+    public MimeMessage createMimeMessage(InputStream inputStream) throws MailException {
+        return createMimeMessage();
+    }
+
+    public void send(MimeMessage[] messages) throws MailException {
+        for (int i = 0; i < messages.length; i++) {
+            MimeMessage message = messages[i];
+            send(message);
+        }
+    }
+
+    public void send(MimeMessagePreparator[] preparators) throws MailException {
+        for (int i = 0; i < preparators.length; i++) {
+            MimeMessagePreparator preparator = preparators[i];
+            send(preparator);
+        }
+    }
+
+    public void send(SimpleMailMessage simpleMailMessage) throws MailException {
+        addMessage(simpleMailMessage);
+    }
+
+    public void send(SimpleMailMessage[] simpleMailMessages) throws MailException {
+        for (int i = 0; i < simpleMailMessages.length; i++) {
+            SimpleMailMessage simpleMailMessage = simpleMailMessages[i];
+            send(simpleMailMessage);
+        }
+    }
+
+
+    /**
+     * @return all the messages on the list so far, clearing the buffer
+     */
+    public List flushMessages() {
+        synchronized (semaphore) {
+            List answer = new ArrayList(messages);
+            messages.clear();
+            return answer;
+        }
+    }
+
+    public synchronized List getMessages() {
+        synchronized (semaphore) {
+            return new ArrayList(messages);
+        }
+    }
+
+    public void addMessage(Object message) {
+        synchronized (semaphore) {
+            messages.add(message);
+            semaphore.notifyAll();
+        }
+    }
+
+    public int getMessageCount() {
+        synchronized (semaphore) {
+            return messages.size();
+        }
+    }
+
+
+    public void waitForMessagesToArrive(int messageCount) {
+        log.info("Waiting for message to arrive");
+
+        long start = System.currentTimeMillis();
+
+        for (int i = 0; i < messageCount; i++) {
+            try {
+                if (hasReceivedMessages(messageCount)) {
+                    break;
+                }
+                synchronized (semaphore) {
+                    semaphore.wait(4000);
+                }
+            }
+            catch (InterruptedException e) {
+                log.info("Caught: " + e);
+            }
+        }
+        long end = System.currentTimeMillis() - start;
+
+        log.info("End of wait for " + end + " millis");
+    }
+
+
+    /**
+     * Performs a testing assertion that the correct number of messages have been received
+     *
+     * @param messageCount
+     */
+    public void assertMessagesReceived(int messageCount) {
+        waitForMessagesToArrive(messageCount);
+
+        assertEquals("expected number of messages", messageCount, getMessageCount());
+        log.info("Received messages:  " + getMessages());
+    }
+
+    public boolean hasReceivedMessage() {
+        return getMessageCount() == 0;
+    }
+
+    public boolean hasReceivedMessages(int messageCount) {
+        return getMessageCount() >= messageCount;
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/file/BinaryFileTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/file/BinaryFileTest.java
new file mode 100644
index 0000000..2387d78
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/file/BinaryFileTest.java
@@ -0,0 +1,69 @@
+/*
+ * 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.servicemix.components.file;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileWriter;
+
+import org.apache.servicemix.jbi.util.FileUtil;
+import org.apache.servicemix.tck.TestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+
+/**
+ * @version $Revision: 359213 $
+ */
+public class BinaryFileTest extends TestSupport {
+
+	protected void setUp() throws Exception {
+		FileUtil.deleteFile(new File("target/test-data/in"));
+		FileUtil.deleteFile(new File("target/test-data/out"));
+		super.setUp();
+	}
+	
+    public void testSendBinary() throws Exception {
+    	String contents = "Binary content";
+        FileWriter fw = new FileWriter("target/test-data/in/file.txt");
+        fw.write(contents);
+        fw.close();
+        
+        File output = null;
+        long start = System.currentTimeMillis();
+        while (System.currentTimeMillis() - start < 5000) {
+        	File outDir = new File("target/test-data/out");
+        	File[] files = outDir.listFiles();
+        	if (files != null && files.length > 0) {
+        		output = files[0];
+        		break;
+        	}
+        	Thread.sleep(50);
+        }
+        if (output == null) {
+        	fail("No output file found");
+        }
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        FileUtil.copyInputStream(new FileInputStream(output), baos);
+        String outContents = baos.toString();
+        assertEquals(contents, outContents);
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/file/binary-example.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/file/FileTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/file/FileTest.java
new file mode 100644
index 0000000..dadf930
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/file/FileTest.java
@@ -0,0 +1,47 @@
+/*
+ * 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.servicemix.components.file;
+
+import java.io.File;
+
+import javax.xml.namespace.QName;
+
+import org.apache.servicemix.jbi.util.FileUtil;
+import org.apache.servicemix.tck.TestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class FileTest extends TestSupport {
+
+	protected void setUp() throws Exception {
+		FileUtil.deleteFile(new File("target/test-data/file"));
+		super.setUp();
+	}
+	
+    public void testSendMessagesToFileSystemThenPoollThem() throws Exception {
+        QName service = new QName("http://servicemix.org/cheese/", "fileSender");
+
+        assertSendAndReceiveMessages(service);
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/file/example.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/groovy/GroovyChainTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/groovy/GroovyChainTest.java
new file mode 100644
index 0000000..46fdfdf
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/groovy/GroovyChainTest.java
@@ -0,0 +1,98 @@
+/*
+ * 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.servicemix.components.groovy;
+
+import java.io.StringReader;
+
+import javax.jbi.messaging.InOut;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.namespace.QName;
+import javax.xml.transform.stream.StreamSource;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.client.ServiceMixClient;
+import org.apache.servicemix.jbi.container.SpringJBIContainer;
+import org.apache.servicemix.jbi.jaxp.SourceTransformer;
+import org.apache.servicemix.tck.Receiver;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+
+/**
+ * @version $Revision: 556864 $
+ */
+public class GroovyChainTest extends TestCase {
+    private static transient Log log = LogFactory.getLog(GroovyChainTest.class);
+
+    protected AbstractXmlApplicationContext context;
+    protected ServiceMixClient client;
+    protected Receiver receiver;
+
+    protected SourceTransformer transformer = new SourceTransformer();
+
+
+    // Send methods
+    //-------------------------------------------------------------------------
+    public void testChain() throws Exception {
+
+        InOut exchange = client.createInOutExchange();
+
+        NormalizedMessage message = exchange.getInMessage();
+        message.setContent(new StreamSource(new StringReader("<hello>world</hello>")));
+
+        QName service = new QName("http://servicemix.org/cheese/", "receiver");
+        exchange.setService(service);
+        client.sendSync(exchange);
+        
+        log.info(transformer.toString(exchange.getMessage("out").getContent()));
+    }
+
+
+    protected void setUp() throws Exception {
+        context = createBeanFactory();
+        //context.setXmlValidating(false);
+
+        client = (ServiceMixClient) getBean("client");
+
+        // TODO
+        //receiver = (Receiver) getBean("receiver");
+
+        SpringJBIContainer jbi = (SpringJBIContainer) getBean("jbi");
+        assertNotNull(jbi);
+    }
+
+    protected void tearDown() throws Exception {
+        super.tearDown();
+
+        if (context != null) {
+            context.close();
+        }
+    }
+
+    protected Object getBean(String name) {
+        Object answer = context.getBean(name);
+        assertNotNull("Could not find object in Spring for key: " + name, answer);
+        return answer;
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/groovy/groovy-chain.xml");
+
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/groovy/GroovyTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/groovy/GroovyTest.java
new file mode 100644
index 0000000..157e573
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/groovy/GroovyTest.java
@@ -0,0 +1,37 @@
+/*
+ * 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.servicemix.components.groovy;
+
+import org.apache.servicemix.components.groovy.GroovyComponent;
+import org.apache.servicemix.tck.SpringTestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class GroovyTest extends SpringTestSupport {
+
+    public void testSendingAndReceivingMessagesUsingSpring() throws Exception {
+        GroovyComponent component = (GroovyComponent) getBean("receiver");
+        assertNotNull(component);
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/groovy/spring-groovy.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/groovy/ServiceMixClientTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/groovy/ServiceMixClientTest.java
new file mode 100644
index 0000000..91697b1
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/groovy/ServiceMixClientTest.java
@@ -0,0 +1,287 @@
+/*
+ * 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.servicemix.components.groovy;
+
+import java.io.StringReader;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.ExchangeStatus;
+import javax.jbi.messaging.Fault;
+import javax.jbi.messaging.InOnly;
+import javax.jbi.messaging.InOut;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.namespace.QName;
+import javax.xml.transform.stream.StreamSource;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.MessageExchangeListener;
+import org.apache.servicemix.client.ServiceMixClient;
+import org.apache.servicemix.components.util.ComponentSupport;
+import org.apache.servicemix.jbi.api.EndpointResolver;
+import org.apache.servicemix.jbi.jaxp.StringSource;
+import org.apache.servicemix.jbi.container.SpringJBIContainer;
+import org.apache.servicemix.jbi.jaxp.SourceTransformer;
+import org.apache.servicemix.tck.Receiver;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+
+/**
+ * @version $Revision: 733499 $
+ */
+public class ServiceMixClientTest extends TestCase {
+    private static transient Log log = LogFactory.getLog(ServiceMixClientTest.class);
+
+    protected AbstractXmlApplicationContext context;
+    protected SpringJBIContainer container;
+    protected ServiceMixClient client;
+    protected Receiver receiver;
+
+    protected SourceTransformer transformer = new SourceTransformer();
+
+
+    // Send methods
+    //-------------------------------------------------------------------------
+    public void testSendUsingJbiAPIs() throws Exception {
+
+        InOnly exchange = client.createInOnlyExchange();
+
+        NormalizedMessage message = exchange.getInMessage();
+        message.setProperty("name", "James");
+        message.setContent(new StreamSource(new StringReader("<hello>world</hello>")));
+
+        QName service = new QName("http://servicemix.org/cheese/", "receiver");
+        exchange.setService(service);
+        client.send(exchange);
+
+        receiver.getMessageList().assertMessagesReceived(1);
+    }
+
+    public void testSendWithErrorUsingJbiAPIs() throws Exception {
+
+        MessageExchange exchange = client.createInOnlyExchange();
+
+        NormalizedMessage message = exchange.getMessage("in");
+        message.setProperty("name", "James");
+        message.setContent(new StreamSource(new StringReader("<hello>world</hello>")));
+
+        activateComponent(new ReturnErrorComponent(), "error");
+        
+        QName service = new QName("error");
+        exchange.setService(service);
+        client.send(exchange);
+        
+        exchange = client.receive();
+        assertEquals(ExchangeStatus.ERROR, exchange.getStatus());
+    }
+
+    public void testSendWithFaultUsingJbiAPIs() throws Exception {
+
+        MessageExchange exchange = client.createRobustInOnlyExchange();
+
+        NormalizedMessage message = exchange.getMessage("in");
+        message.setProperty("name", "James");
+        message.setContent(new StreamSource(new StringReader("<hello>world</hello>")));
+
+        activateComponent(new ReturnFaultComponent(), "fault");
+        
+        QName service = new QName("fault");
+        exchange.setService(service);
+        client.send(exchange);
+        
+        exchange = client.receive();
+        assertEquals(ExchangeStatus.ACTIVE, exchange.getStatus());
+        assertNotNull(exchange.getFault());
+        client.done(exchange);
+    }
+
+    public void testSendUsingMapAndPOJOsByServiceName() throws Exception {
+
+        Map properties = new HashMap();
+        properties.put("name", "James");
+
+        QName service = new QName("http://servicemix.org/cheese/", "receiver");
+        EndpointResolver resolver = client.createResolverForService(service);
+        client.send(resolver, null, properties, "<hello>world</hello>");
+
+        receiver.getMessageList().assertMessagesReceived(1);
+    }
+
+    public void testSendUsingMapAndPOJOsUsingContainerRouting() throws Exception {
+
+        ServiceMixClient clientNoRouting = (ServiceMixClient) context.getBean("clientWithRouting");
+
+        Map properties = new HashMap();
+        properties.put("name", "James");
+
+        clientNoRouting.send(null, null, properties, "<hello>world</hello>");
+
+        receiver.getMessageList().assertMessagesReceived(1);
+    }
+
+    public void testSendUsingMapAndPOJOsUsingContainerRoutingWithNoConfiguration() throws Exception {
+
+
+        try {
+            Map properties = new HashMap();
+            properties.put("name", "James");
+
+            client.send(null, null, properties, "<hello>world</hello>");
+            fail("Should have thrown an exception as we have not wired in any container routing information to this client");
+        }
+        catch (JBIException e) {
+            log.info("Caught expected exception as we have specified no endpoint resolver: " + e);
+            assertNotNull(e);
+        }
+    }
+
+
+    // Request methods
+    //-------------------------------------------------------------------------
+    public void testRequestUsingJbiAPIsByServiceName() throws Exception {
+        QName service = new QName("http://servicemix.org/cheese/", "myService");
+        assertRequestUsingJBIAPIs(service);
+    }
+
+    public void testRequestUsingMapAndPOJOsByServiceName() throws Exception {
+        QName service = new QName("http://servicemix.org/cheese/", "myService");
+        assertRequestUsingMapAndPOJOByServiceName(service);
+    }
+
+    public void testRequestUsingPOJOWithXStreamMarshaling() throws Exception {
+        QName service = new QName("http://servicemix.org/cheese/", "myService");
+
+        ServiceMixClient client = (ServiceMixClient) context.getBean("clientWithXStream");
+
+        Map properties = new HashMap();
+        properties.put("name", "James");
+
+        EndpointResolver resolver = client.createResolverForService(service);
+        TestBean bean = new TestBean();
+        bean.setName("James");
+        bean.setLength(12);
+        bean.getAddresses().addAll(Arrays.asList(new String[] {"London", "LA"}));
+
+        Object response = client.request(resolver, null, properties, bean);
+
+        assertNotNull("Should have returned a non-null response!", response);
+
+        log.info("Received result: " + response);
+    }
+
+
+
+    // Implementation methods
+    //-------------------------------------------------------------------------
+    protected void assertRequestUsingJBIAPIs(QName service) throws Exception {
+        InOut exchange = client.createInOutExchange();
+
+        NormalizedMessage inMessage = exchange.getInMessage();
+        inMessage.setProperty("name", "James");
+        inMessage.setContent(new StreamSource(new StringReader("<hello>world</hello>")));
+
+        exchange.setService(service);
+        boolean answer = client.sendSync(exchange);
+        assertTrue("Should have successed", answer);
+
+        NormalizedMessage outMessage = exchange.getOutMessage();
+        assertNotNull("outMessage is null!", outMessage);
+
+        assertEquals("foo header", "hello", outMessage.getProperty("foo"));
+        log.info("Received result: " + outMessage.getContent());
+        log.info("XML is: " + transformer.toString(outMessage.getContent()));
+    }
+
+    protected void assertRequestUsingMapAndPOJOByServiceName(QName service) throws Exception {
+        Map properties = new HashMap();
+        properties.put("name", "James");
+
+        EndpointResolver resolver = (EndpointResolver)client.createResolverForService(service);
+        Object response = client.request(resolver, null, properties, "<hello>world</hello>");
+
+        assertNotNull("Should have returned a non-null response!", response);
+        
+        log.info("Received result: " + response);
+    }
+
+    protected void setUp() throws Exception {
+        context = createBeanFactory();
+        //context.setXmlValidating(false);
+
+        client = (ServiceMixClient) getBean("client");
+
+        // TODO
+        //receiver = (Receiver) getBean("receiver");
+
+        container = (SpringJBIContainer) getBean("jbi");
+        receiver = (Receiver) container.getBean("receiver");
+        assertNotNull("receiver not found in JBI container", receiver);
+    }
+
+    protected void tearDown() throws Exception {
+        super.tearDown();
+
+        if (context != null) {
+            context.close();
+        }
+    }
+
+    protected Object getBean(String name) {
+        Object answer = context.getBean(name);
+        assertNotNull("Could not find object in Spring for key: " + name, answer);
+        return answer;
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/groovy/example.xml");
+
+    }
+
+    protected void activateComponent(ComponentSupport comp, String name) throws Exception {
+        comp.setService(new QName(name));
+        comp.setEndpoint("endpoint");
+        container.activateComponent(comp, name);
+    }
+    
+    public static class ReturnErrorComponent extends ComponentSupport implements MessageExchangeListener {
+
+        public void onMessageExchange(MessageExchange exchange) throws MessagingException {
+            if (exchange.getStatus() == ExchangeStatus.ACTIVE) {
+                fail(exchange, new Exception());
+            }
+        }
+    }
+
+    public static class ReturnFaultComponent extends ComponentSupport implements MessageExchangeListener {
+        
+        public void onMessageExchange(MessageExchange exchange) throws MessagingException {
+            if (exchange.getStatus() == ExchangeStatus.ACTIVE) {
+                Fault fault = exchange.createFault();
+                fault.setContent(new StringSource("<fault/>"));
+                fail(exchange, fault);
+            }
+        }
+    }
+    
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/groovy/TestBean.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/groovy/TestBean.java
new file mode 100644
index 0000000..2b6a611
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/groovy/TestBean.java
@@ -0,0 +1,55 @@
+/*
+ * 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.servicemix.components.groovy;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A sample test bean used to test out XStream marshalling
+ *
+ * @version $Revision: 426415 $
+ */
+public class TestBean {
+    private String name;
+    private int length;
+    private List  addresses = new ArrayList();
+
+    public List getAddresses() {
+        return addresses;
+    }
+
+    public void setAddresses(List addresses) {
+        this.addresses = addresses;
+    }
+
+    public int getLength() {
+        return length;
+    }
+
+    public void setLength(int length) {
+        this.length = length;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/http/HttpSoapAndSaajTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/http/HttpSoapAndSaajTest.java
new file mode 100644
index 0000000..047120c
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/http/HttpSoapAndSaajTest.java
@@ -0,0 +1,170 @@
+/*
+ * 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.servicemix.components.http;
+
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLConnection;
+
+import javax.xml.messaging.URLEndpoint;
+import javax.xml.namespace.QName;
+import javax.xml.transform.TransformerException;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.traversal.NodeIterator;
+
+import junit.framework.TestCase;
+
+import org.apache.activemq.broker.BrokerService;
+import org.apache.activemq.xbean.BrokerFactoryBean;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.components.saaj.SaajBinding;
+import org.apache.servicemix.components.util.MockServiceComponent;
+import org.apache.servicemix.jbi.container.ActivationSpec;
+import org.apache.servicemix.jbi.container.JBIContainer;
+import org.apache.servicemix.jbi.jaxp.SourceTransformer;
+import org.apache.servicemix.jbi.jaxp.StringSource;
+import org.apache.servicemix.jbi.util.DOMUtil;
+import org.apache.servicemix.jbi.util.FileUtil;
+import org.apache.xml.serialize.OutputFormat;
+import org.apache.xml.serialize.XMLSerializer;
+import org.apache.xpath.CachedXPathAPI;
+import org.springframework.core.io.ClassPathResource;
+
+public class HttpSoapAndSaajTest extends TestCase {
+    
+    private static final int PORT_1 = 7012;
+    private static final int PORT_2 = 7012;
+    private static final int PORT_WS_1 = 7014;
+    private static final int PORT_WS_2 = 7014;
+
+    private static transient Log log = LogFactory.getLog(HttpSoapAndSaajTest.class);
+
+    protected JBIContainer container;
+	protected BrokerService broker;
+    
+    protected void setUp() throws Exception {
+        BrokerFactoryBean bfb = new BrokerFactoryBean(new ClassPathResource("broker.xml"));
+        bfb.afterPropertiesSet();
+        broker = bfb.getBroker();
+        broker.start();
+        container = new JBIContainer();
+        container.setMonitorInstallationDirectory(false);
+        container.setUseMBeanServer(false);
+        container.setCreateMBeanServer(false);
+        container.setEmbedded(true);
+        container.setFlowName("jms?jmsURL=tcp://localhost:61626");
+        container.init();
+        container.start();
+    }
+    
+    protected void tearDown() throws Exception {
+        if (container != null) {
+            container.shutDown();
+        }
+        if (broker != null) {
+        	broker.stop();
+        }
+    }
+    
+    public void testInOut() throws Exception {
+        ActivationSpec as = new ActivationSpec();
+        as.setId("saaj");
+        SaajBinding saaj = new SaajBinding();
+        saaj.setSoapEndpoint(new URLEndpoint("http://localhost:" + PORT_WS_1)); 
+        as.setComponent(saaj);
+        as.setService(new QName("saaj"));
+        container.activateComponent(as);
+        
+        as = new ActivationSpec();
+        as.setId("xfireBinding");
+        as.setComponent(new HttpSoapConnector(null, PORT_2, true));
+        as.setDestinationService(new QName("saaj"));
+        container.activateComponent(as);
+        
+        as = new ActivationSpec();
+        as.setId("webservice");
+        as.setComponent(new HttpConnector(null, PORT_WS_2));
+        as.setDestinationService(new QName("mock"));
+        container.activateComponent(as);
+        
+        as = new ActivationSpec();
+        as.setId("mock");
+        MockServiceComponent mock = new MockServiceComponent();
+        mock.setResponseResource(new ClassPathResource("soap-response.xml", getClass()));
+        as.setComponent(mock);
+        as.setService(new QName("mock"));
+        container.activateComponent(as);
+
+        URLConnection connection = new URL("http://localhost:" + PORT_1).openConnection();
+        connection.setDoOutput(true);
+        connection.setDoInput(true);
+        ((HttpURLConnection) connection).setRequestProperty("Content-Type", "text/xml; charset=utf-8;");
+        OutputStream os = connection.getOutputStream();
+        // Post the request file.
+        InputStream fis = getClass().getResourceAsStream("soap-request.xml");
+        FileUtil.copyInputStream(fis, os);
+        // Read the response.
+        InputStream is = connection.getInputStream();
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        FileUtil.copyInputStream(is, baos);
+        
+        // Check xml validity
+        Node node = new SourceTransformer().toDOMNode(new StringSource(baos.toString()));
+
+        OutputFormat format = new OutputFormat((Document) node);
+        format.setLineWidth(65);
+        format.setIndenting(true);
+        format.setIndent(2);
+
+        ByteArrayOutputStream output = new ByteArrayOutputStream();
+        XMLSerializer serializer = new XMLSerializer(output, format);
+        serializer.serialize((Document) node);
+        log.info(output.toString());
+        
+        CachedXPathAPI cachedXPathAPI = new CachedXPathAPI();
+        NodeIterator iterator = cachedXPathAPI.selectNodeIterator(node, "//*[local-name() = 'userId']");
+        Element root = (Element) iterator.nextNode();
+        QName qname = DOMUtil.createQName(root, root.getAttributeNS("http://www.w3.org/2001/XMLSchema-instance", "type"));
+        assertEquals("http://www.w3.org/2001/XMLSchema", qname.getNamespaceURI());
+        assertEquals("string", qname.getLocalPart());
+        
+    }
+
+    protected String textValueOfXPath(Node node, String xpath) throws TransformerException {
+        CachedXPathAPI cachedXPathAPI = new CachedXPathAPI();
+        NodeIterator iterator = cachedXPathAPI.selectNodeIterator(node, xpath);
+        Node root = iterator.nextNode();
+        if (root instanceof Element) {
+            Element element = (Element) root;
+            if (element == null) {
+                return "";
+            }
+            String text = DOMUtil.getElementText(element);
+            return text;
+        }
+        else {
+            return root.getNodeValue();
+        }
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/http/HttpSoapAttachmentsTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/http/HttpSoapAttachmentsTest.java
new file mode 100644
index 0000000..a265806
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/http/HttpSoapAttachmentsTest.java
@@ -0,0 +1,97 @@
+/*
+ * 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.servicemix.components.http;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.InputStream;
+
+import javax.activation.DataHandler;
+import javax.activation.FileDataSource;
+import javax.mail.MessagingException;
+import javax.xml.namespace.QName;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.components.util.EchoComponent;
+import org.apache.servicemix.jbi.container.ActivationSpec;
+import org.apache.servicemix.jbi.container.JBIContainer;
+import org.codehaus.xfire.attachments.JavaMailAttachments;
+import org.codehaus.xfire.attachments.SimpleAttachment;
+
+public class HttpSoapAttachmentsTest extends TestCase {
+    private static transient Log log = LogFactory.getLog(HttpSoapAttachmentsTest.class);
+
+    private static final int PORT = 7012;
+
+    protected JBIContainer container;
+    
+    protected void setUp() throws Exception {
+        container = new JBIContainer();
+        container.setMonitorInstallationDirectory(false);
+        container.setUseMBeanServer(false);
+        container.setCreateMBeanServer(false);
+        container.setEmbedded(true);
+        container.init();
+        container.start();
+    }
+    
+    protected void tearDown() throws Exception {
+        if (container != null) {
+            container.shutDown();
+        }
+    }
+    
+    public void testWithAttachments() throws Exception {
+        ActivationSpec as = new ActivationSpec();
+        as.setId("echo");
+        as.setComponent(new EchoComponent());
+        as.setService(new QName("echo"));
+        container.activateComponent(as);
+        as = new ActivationSpec();
+        as.setId("xfireBinding");
+        as.setComponent(new HttpSoapConnector(null, PORT, true));
+        as.setDestinationService(new QName("echo"));
+        container.activateComponent(as);
+
+        JavaMailAttachments sendAtts = new JavaMailAttachments();
+        sendAtts.setSoapMessage(new SimpleAttachment("soap-request.xml",
+                createDataHandler("soap-request.xml")));
+        sendAtts.addPart(new SimpleAttachment("ServiceMix.jpg",
+                createDataHandler("ServiceMix.jpg")));
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        sendAtts.write(bos);
+        InputStream is = new ByteArrayInputStream(bos.toByteArray());
+        PostMethod method = new PostMethod("http://localhost:" + PORT);
+        method.setRequestEntity(new InputStreamRequestEntity(is));
+        method.setRequestHeader("Content-Type", sendAtts.getContentType());
+        new HttpClient().executeMethod(method);
+        log.info(method.getResponseBodyAsString());
+    }
+
+    private DataHandler createDataHandler(String name) throws MessagingException {
+        File f = new File(getClass().getResource(name).getPath());
+        FileDataSource fs = new FileDataSource(f);
+        return new DataHandler(fs);
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/http/HttpSoapTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/http/HttpSoapTest.java
new file mode 100644
index 0000000..9367755
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/http/HttpSoapTest.java
@@ -0,0 +1,253 @@
+/*
+ * 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.servicemix.components.http;
+
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URL;
+import java.net.URLConnection;
+
+import javax.jbi.messaging.InOnly;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.namespace.QName;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.traversal.NodeIterator;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.methods.StringRequestEntity;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.components.util.EchoComponent;
+import org.apache.servicemix.components.util.MockServiceComponent;
+import org.apache.servicemix.components.util.TraceComponent;
+import org.apache.servicemix.jbi.container.ActivationSpec;
+import org.apache.servicemix.jbi.container.JBIContainer;
+import org.apache.servicemix.jbi.jaxp.SourceTransformer;
+import org.apache.servicemix.jbi.jaxp.StringSource;
+import org.apache.servicemix.jbi.messaging.InOnlyImpl;
+import org.apache.servicemix.jbi.util.DOMUtil;
+import org.apache.servicemix.jbi.util.FileUtil;
+import org.apache.servicemix.tck.ReceiverComponent;
+import org.apache.xpath.CachedXPathAPI;
+import org.springframework.core.io.ClassPathResource;
+
+public class HttpSoapTest extends TestCase {
+    private static transient Log log = LogFactory.getLog(HttpSoapTest.class);
+
+    protected JBIContainer container;
+    
+    protected void setUp() throws Exception {
+        System.setProperty("DEBUG", "true");
+        container = new JBIContainer();
+        container.setMonitorInstallationDirectory(false);
+        container.setUseMBeanServer(false);
+        container.setCreateMBeanServer(false);
+        container.setEmbedded(true);
+        container.init();
+        container.start();
+    }
+    
+    protected void tearDown() throws Exception {
+        if (container != null) {
+            container.shutDown();
+        }
+    }
+    
+    public void testInOut() throws Exception {
+        int PORT = 7012;
+        ActivationSpec as = new ActivationSpec();
+        as.setId("echo");
+        as.setComponent(new EchoComponent());
+        as.setService(new QName("echo"));
+        container.activateComponent(as);
+        as = new ActivationSpec();
+        as.setId("xfireBinding");
+        as.setComponent(new HttpSoapConnector(null, PORT, true));
+        as.setDestinationService(new QName("echo"));
+        container.activateComponent(as);
+        
+        URLConnection connection = new URL("http://localhost:" + PORT).openConnection();
+        connection.setDoOutput(true);
+        connection.setDoInput(true);
+        OutputStream os = connection.getOutputStream();
+        // Post the request file.
+        InputStream fis = getClass().getResourceAsStream("soap-request.xml");
+        FileUtil.copyInputStream(fis, os);
+        // Read the response.
+        InputStream is = connection.getInputStream();
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        FileUtil.copyInputStream(is, baos);
+        log.info(baos.toString());
+    }
+
+    public void testInOnly() throws Exception {
+        int PORT = 7013;
+        ActivationSpec as = new ActivationSpec();
+        as.setId("trace");
+        as.setComponent(new TraceComponent());
+        as.setService(new QName("trace"));
+        container.activateComponent(as);
+        as = new ActivationSpec();
+        as.setId("xfireBinding");
+        as.setComponent(new HttpSoapConnector(null, PORT, false));
+        as.setDestinationService(new QName("trace"));
+        container.activateComponent(as);
+
+        PostMethod method = new PostMethod("http://localhost:" + PORT + "/?name=Guillaume");
+        method.setRequestEntity(new InputStreamRequestEntity(getClass().getResourceAsStream("soap-request.xml")));
+        new HttpClient().executeMethod(method);
+        log.info(method.getResponseBodyAsString());
+    }
+
+    public void testMarhaler() throws Exception {
+        String url = "http://64.124.140.30:9090/soap";
+        HttpSoapClientMarshaler marshaler = new HttpSoapClientMarshaler();
+        PostMethod method = new PostMethod(url);
+        method.addRequestHeader("Content-Type", "text/xml");
+        method.addRequestHeader("SOAPAction", "urn:xmethods-delayed-quotes#getQuote");
+        
+        InOnly exchange = new InOnlyImpl("id");
+        NormalizedMessage in = exchange.createMessage();
+        exchange.setInMessage(in);
+        in.setContent(new StringSource("<?xml version='1.0'?><ns1:getQuote xmlns:ns1='urn:xmethods-delayed-quotes' xmlns:xsi='http://www.w3.org/1999/XMLSchema-instance' xmlns:se='http://schemas.xmlsoap.org/soap/envelope/' se:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'><symbol xsi:type='xsd:string'>SUNW</symbol></ns1:getQuote>"));
+        marshaler.fromNMS(method, exchange, in);
+        log.info(((StringRequestEntity) method.getRequestEntity()).getContent());
+
+        HttpClient httpClient = new HttpClient();
+        httpClient.executeMethod(method);
+        log.info(method.getResponseBodyAsString());
+        
+        exchange = new InOnlyImpl("id");
+        in = exchange.createMessage();
+        exchange.setInMessage(in);
+        marshaler.toNMS(in, method);
+        
+        log.info(new SourceTransformer().toString(in.getContent()));
+    }
+    
+    public void testMarshalerNamespaces() throws Exception {
+        ActivationSpec as = new ActivationSpec();
+        as.setId("mock");
+        MockServiceComponent mock = new MockServiceComponent();
+        mock.setResponseResource(new ClassPathResource("org/apache/servicemix/components/http/soap-response.xml"));
+        as.setComponent(mock);
+        as.setService(new QName("mock"));
+        container.activateComponent(as);
+        
+        as = new ActivationSpec();
+        as.setId("http");
+        as.setDestinationService(new QName("mock"));
+        HttpConnector http = new HttpConnector();
+        http.setPort(8100);
+        as.setComponent(http);
+        container.activateComponent(as);
+
+        String url = "http://localhost:8100";
+        HttpSoapClientMarshaler marshaler = new HttpSoapClientMarshaler();
+        PostMethod method = new PostMethod(url);
+        method.addRequestHeader("Content-Type", "text/xml");
+        method.addRequestHeader("SOAPAction", "urn:xmethods-delayed-quotes#getQuote");
+        
+        InOnly exchange = new InOnlyImpl("id");
+        NormalizedMessage in = exchange.createMessage();
+        exchange.setInMessage(in);
+        in.setContent(new StringSource("<?xml version='1.0'?><ns1:getQuote xmlns:ns1='urn:xmethods-delayed-quotes' xmlns:xsi='http://www.w3.org/1999/XMLSchema-instance' xmlns:se='http://schemas.xmlsoap.org/soap/envelope/' se:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'><symbol xsi:type='xsd:string'>SUNW</symbol></ns1:getQuote>"));
+        marshaler.fromNMS(method, exchange, in);
+        log.info(((StringRequestEntity) method.getRequestEntity()).getContent());
+
+        HttpClient httpClient = new HttpClient();
+        httpClient.executeMethod(method);
+        log.info(method.getResponseBodyAsString());
+        
+        exchange = new InOnlyImpl("id");
+        in = exchange.createMessage();
+        exchange.setInMessage(in);
+        marshaler.toNMS(in, method);
+        
+
+        Node node = new SourceTransformer().toDOMNode(new SourceTransformer().toStreamSource(in.getContent()));
+        log.info(new SourceTransformer().toString(node));
+        
+        CachedXPathAPI cachedXPathAPI = new CachedXPathAPI();
+        NodeIterator iterator = cachedXPathAPI.selectNodeIterator(node, "//*[local-name() = 'userId']");
+        Element root = (Element) iterator.nextNode();
+        QName qname = DOMUtil.createQName(root, root.getAttributeNS("http://www.w3.org/2001/XMLSchema-instance", "type"));
+        assertEquals("http://www.w3.org/2001/XMLSchema", qname.getNamespaceURI());
+        assertEquals("string", qname.getLocalPart());
+    }
+    
+    public void testNamespaces() throws Exception {
+        ActivationSpec as = new ActivationSpec();
+        as.setId("receiver");
+        ReceiverComponent receiver = new ReceiverComponent();
+        as.setComponent(receiver);
+        as.setService(new QName("receiver"));
+        container.activateComponent(as);
+        
+        as = new ActivationSpec();
+        as.setId("http");
+        as.setDestinationService(new QName("receiver"));
+        HttpSoapConnector http = new HttpSoapConnector();
+        http.setDefaultInOut(false);
+        http.setPort(8100);
+        as.setComponent(http);
+        container.activateComponent(as);
+
+        URLConnection connection = new URL("http://localhost:8100").openConnection();
+        connection.setDoOutput(true);
+        connection.setDoInput(true);
+        OutputStream os = connection.getOutputStream();
+        // Post the request file.
+        InputStream fis = getClass().getResourceAsStream("soap-response.xml");
+        FileUtil.copyInputStream(fis, os);
+        connection.getInputStream();
+        
+        receiver.getMessageList().assertMessagesReceived(1);
+        NormalizedMessage msg = (NormalizedMessage) receiver.getMessageList().flushMessages().get(0);
+
+        Node node = new SourceTransformer().toDOMNode(new SourceTransformer().toStreamSource(msg.getContent()));
+        log.info(new SourceTransformer().toString(node));
+        
+        CachedXPathAPI cachedXPathAPI = new CachedXPathAPI();
+        NodeIterator iterator = cachedXPathAPI.selectNodeIterator(node, "//*[local-name() = 'userId']");
+        Element root = (Element) iterator.nextNode();
+        QName qname = DOMUtil.createQName(root, root.getAttributeNS("http://www.w3.org/2001/XMLSchema-instance", "type"));
+        assertEquals("http://www.w3.org/2001/XMLSchema", qname.getNamespaceURI());
+        assertEquals("string", qname.getLocalPart());
+    }
+    
+    public void testMaxThreadsForJettySocketListener()
+        throws Exception {
+    		int maxThreads = 512;
+    		
+    		HttpSoapConnector httpSoap = new HttpSoapConnector();
+    		httpSoap.setMaxThreads(maxThreads);
+    		assertEquals("The maxThreads value on the HttpSoapConnector is not correct!", maxThreads, httpSoap.getMaxThreads());
+    		
+    		HttpConnector http = new HttpConnector();
+    		http.setMaxThreads(maxThreads);
+    		assertEquals("The maxThreads value on the HttpConnector is not correct!", maxThreads, http.getMaxThreads());
+    }
+
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/http/HttpSoapWsTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/http/HttpSoapWsTest.java
new file mode 100644
index 0000000..cbc23f5
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/http/HttpSoapWsTest.java
@@ -0,0 +1,68 @@
+/*
+ * 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.servicemix.components.http;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.URL;
+import java.net.URLConnection;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.tck.TestSupport;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+
+/**
+ * @version $Revision: 359186 $
+ */
+public class HttpSoapWsTest extends TestSupport {
+    private static transient Log log = LogFactory.getLog(HttpSoapWsTest.class);
+
+    protected String quote = "SUNW";
+
+    public void testWithURLConnection() throws Exception {
+        URLConnection connection = new URL("http://localhost:8912").openConnection();
+        connection.setDoOutput(true);
+        connection.setDoInput(true);
+        OutputStream os = connection.getOutputStream();
+
+        // Post the request file.
+        InputStream fis = getClass().getResourceAsStream("soap-request.xml");
+        int c;
+        while ((c = fis.read()) >= 0) {
+            os.write(c);
+        }
+        os.flush();
+        os.close();
+        fis.close();
+
+        // Read the response.
+        BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
+        String inputLine;
+        while ((inputLine = in.readLine()) != null) {
+            log.info(inputLine);
+        }
+        in.close();
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/http/ws-example.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/http/HttpTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/http/HttpTest.java
new file mode 100644
index 0000000..ea3cb57
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/http/HttpTest.java
@@ -0,0 +1,108 @@
+/*
+ * 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.servicemix.components.http;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.URL;
+import java.net.URLConnection;
+
+import javax.xml.namespace.QName;
+
+import org.w3c.dom.Node;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.tck.TestSupport;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+
+/**
+ * @version $Revision: 556864 $
+ */
+public class HttpTest extends TestSupport {
+    private static transient Log log = LogFactory.getLog(HttpTest.class);
+
+    protected String quote = "SUNW";
+    
+    protected void setUp() throws Exception {
+        System.setProperty("javax.net.debug", "all");
+        // The following properties will be used by default if not specified in the xml conf
+        /*
+        System.setProperty("javax.net.ssl.trustStore", getResourceFilePath("client.keystore"));
+        System.setProperty("javax.net.ssl.trustStorePassword", "password");
+        System.setProperty("javax.net.ssl.keyStore", getResourceFilePath("server.keystore"));
+        System.setProperty("javax.net.ssl.keyStorePassword", "password");
+        */
+        super.setUp();
+    }
+    
+    String getResourceFilePath(String resource) throws Exception {
+        URL url = getClass().getResource(resource);
+        File f = new File(url.toURI());
+        return f.toString();
+    }
+
+    public void testCurrencyQuotes() throws Exception {
+        QName serviceName = new QName("http://servicemix.org/cheese/", "httpSender");
+        String file = "request.xml";
+
+        Object answer = requestServiceWithFileRequest(serviceName, file);
+        assertTrue("Shoud return a DOM Node: " + answer, answer instanceof Node);
+        Node node = (Node) answer;
+        log.info(transformer.toString(node));
+
+        String text = textValueOfXPath(node, "//Result").trim();
+
+        log.info("Found price: " + text);
+
+        assertTrue("price text should not be empty", text.length() > 0);
+
+    }
+    
+    public void testWithURLConnection() throws Exception {
+        URLConnection connection = new URL("http://localhost:8912").openConnection();
+        connection.setDoOutput(true);
+        connection.setDoInput(true);
+        OutputStream os = connection.getOutputStream();
+
+        // Post the request file.
+        InputStream fis = getClass().getResourceAsStream("request.xml");
+        int c;
+        while ((c = fis.read()) >= 0) {
+            os.write(c);
+        }
+        os.flush();
+        os.close();
+        fis.close();
+
+        // Read the response.
+        BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
+        String inputLine;
+        while ((inputLine = in.readLine()) != null) {
+            log.info(inputLine);
+        }
+        in.close();
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/http/example.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/jabber/JabberChatTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/jabber/JabberChatTest.java
new file mode 100644
index 0000000..ff0adbd
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/jabber/JabberChatTest.java
@@ -0,0 +1,39 @@
+/*
+ * 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.servicemix.components.jabber;
+
+import org.apache.servicemix.tck.TestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+
+import javax.xml.namespace.QName;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class JabberChatTest extends TestSupport {
+
+    public void testSendMessagesToJmsThenOutofJmsToReceiver() throws Exception {
+        QName service = new QName("http://servicemix.org/cheese/", "myJabberSender");
+
+        assertSendAndReceiveMessages(service);
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/jabber/example.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/jabber/JabberChatWithActiveMQTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/jabber/JabberChatWithActiveMQTest.java
new file mode 100644
index 0000000..cc88fc7
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/jabber/JabberChatWithActiveMQTest.java
@@ -0,0 +1,39 @@
+/*
+ * 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.servicemix.components.jabber;
+
+import org.apache.servicemix.tck.TestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+
+import javax.xml.namespace.QName;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class JabberChatWithActiveMQTest extends TestSupport {
+
+    public void testSendMessagesToJmsThenOutofJmsToReceiver() throws Exception {
+        QName service = new QName("http://servicemix.org/cheese/", "myJabberSender");
+
+        assertSendAndReceiveMessages(service);
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/jabber/activemqAsServer.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/jabber/JabberGroupChatTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/jabber/JabberGroupChatTest.java
new file mode 100644
index 0000000..886b0c3
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/jabber/JabberGroupChatTest.java
@@ -0,0 +1,39 @@
+/*
+ * 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.servicemix.components.jabber;
+
+import org.apache.servicemix.tck.TestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+
+import javax.xml.namespace.QName;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class JabberGroupChatTest extends TestSupport {
+
+    public void testSendMessagesToJmsThenOutofJmsToReceiver() throws Exception {
+        QName service = new QName("http://servicemix.org/cheese/", "myJabberSender");
+
+        assertSendAndReceiveMessages(service);
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/jabber/group-example.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/jca/JmsOverJcaTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/jca/JmsOverJcaTest.java
new file mode 100644
index 0000000..f59999c
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/jca/JmsOverJcaTest.java
@@ -0,0 +1,39 @@
+/*
+ * 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.servicemix.components.jca;
+
+import org.apache.servicemix.tck.TestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+
+import javax.xml.namespace.QName;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class JmsOverJcaTest extends TestSupport {
+
+    public void testSendMessagesToJmsThenOutofJmsToReceiver() throws Exception {
+        QName service = new QName("http://servicemix.org/cheese/", "myJmsSender");
+
+        assertSendAndReceiveMessages(service);
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/jca/example.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/jca/JmsOverJcaWithFullXATest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/jca/JmsOverJcaWithFullXATest.java
new file mode 100644
index 0000000..4cb897b
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/jca/JmsOverJcaWithFullXATest.java
@@ -0,0 +1,40 @@
+/*
+ * 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.servicemix.components.jca;
+
+import org.apache.servicemix.tck.TestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+
+import javax.xml.namespace.QName;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class JmsOverJcaWithFullXATest extends TestSupport {
+
+    public void testSendMessagesToJmsThenOutofJmsToReceiver() throws Exception {
+        QName service = new QName("http://servicemix.org/cheese/", "myJmsSender");
+
+        sendMessages(service, messageCount, false, null);
+        assertMessagesReceived(messageCount);
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/jca/xa-on-jca-flow.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/jca/JmsOverJcaWithXATest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/jca/JmsOverJcaWithXATest.java
new file mode 100644
index 0000000..1ab2b73
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/jca/JmsOverJcaWithXATest.java
@@ -0,0 +1,39 @@
+/*
+ * 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.servicemix.components.jca;
+
+import org.apache.servicemix.tck.TestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+
+import javax.xml.namespace.QName;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class JmsOverJcaWithXATest extends TestSupport {
+
+    public void testSendMessagesToJmsThenOutofJmsToReceiver() throws Exception {
+        QName service = new QName("http://servicemix.org/cheese/", "myJmsSender");
+
+        assertSendAndReceiveMessages(service);
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/jca/exampleWithXA.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/jdbc/JdbcComponentTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/jdbc/JdbcComponentTest.java
new file mode 100644
index 0000000..cea0715
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/jdbc/JdbcComponentTest.java
@@ -0,0 +1,82 @@
+/*
+ * 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.servicemix.components.jdbc;
+
+import java.sql.Connection;
+import java.sql.Statement;
+
+import javax.jbi.messaging.InOut;
+import javax.sql.DataSource;
+import javax.xml.namespace.QName;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.client.DefaultServiceMixClient;
+import org.apache.servicemix.jbi.container.JBIContainer;
+import org.apache.servicemix.jbi.jaxp.SourceTransformer;
+import org.apache.servicemix.jbi.jaxp.StringSource;
+import org.hsqldb.jdbc.jdbcDataSource;
+
+public class JdbcComponentTest extends TestCase {
+    private static transient Log log = LogFactory.getLog(JdbcComponentTest.class);
+
+    private JBIContainer jbi;
+	private DataSource dataSource;
+	private JdbcComponent jdbc;
+	
+	protected void setUp() throws Exception {
+        jdbcDataSource ds = new jdbcDataSource();
+        ds.setDatabase("jdbc:hsqldb:mem:aname");
+        ds.setUser("sa");
+		dataSource = ds;
+		
+		jbi = new JBIContainer();
+		jbi.setEmbedded(true);
+		jbi.init();
+		jbi.start();
+		
+		jdbc = new JdbcComponent();
+		jdbc.setService(new QName("urn:jdbc", "service"));
+		jdbc.setEndpoint("endpoint");
+		jdbc.setDataSource(dataSource);
+		jbi.activateComponent(jdbc, "jdbc");
+	}
+	
+	protected void tearDown() throws Exception {
+		jbi.shutDown();
+	}
+
+	public void testInOut() throws Exception {
+		Connection con = dataSource.getConnection("sa", "");
+		Statement st = con.createStatement();
+		st.execute("create table MyTable (id varchar(80) not null, name varchar(80))");
+		st.execute("insert into MyTable values ('1', 'One')");
+		st.execute("insert into MyTable values ('2', 'Two')");
+		
+		DefaultServiceMixClient client = new DefaultServiceMixClient(jbi);
+		InOut me = client.createInOutExchange();
+		me.setService(new QName("urn:jdbc", "service"));
+		me.getInMessage().setContent(new StringSource("<sql>select * from MyTable</sql>"));
+		client.sendSync(me);
+		String out = new SourceTransformer().contentToString(me.getOutMessage());
+		log.info(out);
+		assertTrue(out.contains("One"));
+		assertTrue(out.contains("Two"));
+	}
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/jdbc/JdbcComponentUniqueNamesTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/jdbc/JdbcComponentUniqueNamesTest.java
new file mode 100644
index 0000000..db75849
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/jdbc/JdbcComponentUniqueNamesTest.java
@@ -0,0 +1,152 @@
+/*
+ * 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.servicemix.components.jdbc;
+
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+
+import junit.framework.TestCase;
+
+public class JdbcComponentUniqueNamesTest extends TestCase {
+
+	public void testNames() throws Exception {
+
+		JdbcComponent comp = new JdbcComponent();
+
+		String[] names = new String[]{"name", "name", "name", "id", "test_1", "test_1", "test_1"};
+		
+		ResultSetMetaData metaData = new MetaMock(names);
+		String[] uniqueColumnNames = comp.getUniqueColumnNames(metaData);
+		
+		String[] expected = 
+			new String[]{
+				"name", 
+				"name_1", 
+				"name_2", 
+				"id", 
+				"test_1", 
+				"test_1_1", 
+				"test_1_2"};
+		
+		for (int i = 0; i < uniqueColumnNames.length; i++) {
+			assertEquals(expected[i], uniqueColumnNames[i]);
+		}
+	}
+
+	private static class MetaMock implements ResultSetMetaData {
+
+		private final String[] names;
+		
+		MetaMock(String[] names) {
+			this.names = names;
+		}
+		
+		public int getColumnCount() throws SQLException {
+			return names.length;
+		}
+
+		public String getColumnName(int column) throws SQLException {
+			return names[column-1];
+		}
+
+		public String getCatalogName(int column) throws SQLException {
+			throw new RuntimeException("not implemented");
+		}
+
+		public String getColumnClassName(int column) throws SQLException {
+			throw new RuntimeException("not implemented");
+		}
+
+		public int getColumnDisplaySize(int column) throws SQLException {
+			throw new RuntimeException("not implemented");
+		}
+
+		public String getColumnLabel(int column) throws SQLException {
+			throw new RuntimeException("not implemented");
+		}
+
+		public int getColumnType(int column) throws SQLException {
+			throw new RuntimeException("not implemented");
+		}
+
+		public String getColumnTypeName(int column) throws SQLException {
+			throw new RuntimeException("not implemented");
+		}
+
+		public int getPrecision(int column) throws SQLException {
+			throw new RuntimeException("not implemented");
+		}
+
+		public int getScale(int column) throws SQLException {
+			throw new RuntimeException("not implemented");
+		}
+
+		public String getSchemaName(int column) throws SQLException {
+			throw new RuntimeException("not implemented");
+		}
+
+		public String getTableName(int column) throws SQLException {
+			throw new RuntimeException("not implemented");
+		}
+
+		public boolean isAutoIncrement(int column) throws SQLException {
+			throw new RuntimeException("not implemented");
+		}
+
+		public boolean isCaseSensitive(int column) throws SQLException {
+			throw new RuntimeException("not implemented");
+		}
+
+		public boolean isCurrency(int column) throws SQLException {
+			throw new RuntimeException("not implemented");
+		}
+
+		public boolean isDefinitelyWritable(int column) throws SQLException {
+			throw new RuntimeException("not implemented");
+		}
+
+		public int isNullable(int column) throws SQLException {
+			throw new RuntimeException("not implemented");
+		}
+
+		public boolean isReadOnly(int column) throws SQLException {
+			throw new RuntimeException("not implemented");
+		}
+
+		public boolean isSearchable(int column) throws SQLException {
+			throw new RuntimeException("not implemented");
+		}
+
+		public boolean isSigned(int column) throws SQLException {
+			throw new RuntimeException("not implemented");
+		}
+
+		public boolean isWritable(int column) throws SQLException {
+			throw new RuntimeException("not implemented");
+		}
+
+		public boolean isWrapperFor(Class arg0) throws SQLException {
+			throw new RuntimeException("not implemented");
+		}
+
+		public Object unwrap(Class arg0) throws SQLException {
+			throw new RuntimeException("not implemented");
+		}
+
+	}
+
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/jms/JmsBindingClusterTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/jms/JmsBindingClusterTest.java
new file mode 100644
index 0000000..145c86b
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/jms/JmsBindingClusterTest.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.servicemix.components.jms;
+
+import org.apache.servicemix.tck.TestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+
+import javax.xml.namespace.QName;
+
+/**
+ * @version $Revision: 359186 $
+ */
+public class JmsBindingClusterTest extends TestSupport {
+
+    public void testSendMessagesToJmsThenOutofJmsToReceiver() throws Exception {
+        QName service = new QName("http://servicemix.org/cheese/", "myJmsSender");
+
+        assertSendAndReceiveMessages(service);
+        
+        // Wait for all messages to be processsed
+        Thread.sleep(100);
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/jms/example-cluster.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/jms/JmsBindingTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/jms/JmsBindingTest.java
new file mode 100644
index 0000000..4da1781
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/jms/JmsBindingTest.java
@@ -0,0 +1,39 @@
+/*
+ * 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.servicemix.components.jms;
+
+import org.apache.servicemix.tck.TestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+
+import javax.xml.namespace.QName;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class JmsBindingTest extends TestSupport {
+
+    public void testSendMessagesToJmsThenOutofJmsToReceiver() throws Exception {
+        QName service = new QName("http://servicemix.org/cheese/", "myJmsSender");
+
+        assertSendAndReceiveMessages(service);
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/jms/example.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/jms/JmsBindingUsingEndpointSubscriptionTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/jms/JmsBindingUsingEndpointSubscriptionTest.java
new file mode 100644
index 0000000..4af9f73
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/jms/JmsBindingUsingEndpointSubscriptionTest.java
@@ -0,0 +1,39 @@
+/*
+ * 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.servicemix.components.jms;
+
+import org.apache.servicemix.tck.TestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+
+import javax.xml.namespace.QName;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class JmsBindingUsingEndpointSubscriptionTest extends TestSupport {
+
+    public void testSendMessagesToJmsThenOutofJmsToReceiver() throws Exception {
+        QName service = new QName("http://servicemix.org/cheese/", "jmsSender");
+
+        assertSendAndReceiveMessages(service);
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/jms/example-endpoint-subscription.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/jmx/CounterMonitorComponentTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/jmx/CounterMonitorComponentTest.java
new file mode 100644
index 0000000..3432578
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/jmx/CounterMonitorComponentTest.java
@@ -0,0 +1,45 @@
+/*
+ * 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.servicemix.components.jmx;
+
+import org.apache.servicemix.jbi.jaxp.StringSource;
+import org.apache.servicemix.tck.TestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+
+/**
+ * @version $Revision: 359186 $
+ */
+public class CounterMonitorComponentTest extends TestSupport {
+
+    public void testCounter() throws Exception {
+        int nb = 10;
+        for (int i = 0; i < nb; i++) {
+            client.send(null, new StringSource("<hello>world</hello>"));
+            // We need to sleep more than the granularity period length
+            // so that we do not loose notifications
+            Thread.sleep(50);
+        }
+        receiver.getMessageList().assertMessagesReceived(nb);
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/jmx/example.xml");
+    }
+    
+    
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/mps/MPSSettingTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/mps/MPSSettingTest.java
new file mode 100644
index 0000000..f899a7f
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/mps/MPSSettingTest.java
@@ -0,0 +1,110 @@
+/*
+ * 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.servicemix.components.mps;
+
+import javax.jbi.messaging.InOut;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.namespace.QName;
+
+import org.apache.servicemix.jbi.jaxp.StringSource;
+import org.apache.servicemix.tck.TestSupport;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+
+/**
+ * @author Rmaon Buckland
+ * @version $Revision: $
+ */
+public class MPSSettingTest extends TestSupport {
+
+	
+	/**
+	 * load the property set from the spring injects string (fixed set)
+	 * @throws Exception
+	 */
+    public void testStaticStringPropertySet() throws Exception {
+        QName service = new QName("http://servicemix.org/cheese/", "mpsFixed");
+
+        InOut exchange = client.createInOutExchange();
+        exchange.setService(service);
+
+        NormalizedMessage message = exchange.getInMessage();
+        message.setContent(new StringSource(createMessageXmlText(777888)));
+        message.setProperty("prop.xpath.or.keep.existing","someValue");
+        message.setProperty("other.set.property","thatOtherValue");
+        client.sendSync(exchange);
+
+        NormalizedMessage outMessage = exchange.getOutMessage();
+
+        assertTrue(outMessage.getProperty("property.1").equals("foobarAndCheese"));
+        assertTrue(outMessage.getProperty("property.2").equals("777888"));
+        assertTrue(outMessage.getProperty("prop.xpath.or.keep.existing").equals("someValue"));
+        // this property is configured, but there is no "value to resolve it to"
+        assertTrue(outMessage.getProperty("new.prop.name") == null);
+        assertTrue(outMessage.getProperty("property.3").equals("thatOtherValue"));
+        
+    }
+    
+    
+    /**
+     * Load the property set using an xpath applied to the in message
+     * @throws Exception
+     */
+    public void testtestXpathLoadingPropertySet() throws Exception {
+        QName service = new QName("http://servicemix.org/cheese/", "mpsXpath");
+
+        InOut exchange = client.createInOutExchange();
+        exchange.setService(service);
+
+        NormalizedMessage message = exchange.getInMessage();
+        message.setContent(new StringSource(createMessageXmlText(400)));
+        client.sendSync(exchange);
+
+        NormalizedMessage outMessage = exchange.getOutMessage();
+
+        assertTrue(outMessage.getProperty("my-superdooper.property").equals("wishAusMadeItTotheFinals"));
+        
+    }
+    
+	/**
+	 * load the property set from a JBI property value
+	 * @throws Exception
+	 */
+    public void testJBIPropertyLoadingPropertySet() throws Exception {
+        QName service = new QName("http://servicemix.org/cheese/", "mpsJBIPropsPS");
+
+        InOut exchange = client.createInOutExchange();
+        exchange.setService(service);
+
+        NormalizedMessage message = exchange.getInMessage();
+        message.setProperty(MessagePropertySetterXML.MPS_PROP_NAME_PROPERTYSET,"hello");
+        message.setContent(new StringSource(createMessageXmlText(54)));
+        client.sendSync(exchange);
+
+        NormalizedMessage outMessage = exchange.getOutMessage();
+
+        assertTrue(outMessage.getProperty("my-superdooper.property").equals("wishAusMadeItTotheFinals"));
+        
+    }
+    
+    
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/mps/servicemix-mps-test.xml");
+    }
+}
+
+
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/mps/PropertySetTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/mps/PropertySetTest.java
new file mode 100644
index 0000000..339ae32
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/mps/PropertySetTest.java
@@ -0,0 +1,344 @@
+/*
+ * 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.servicemix.components.mps;
+
+import java.io.StringReader;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.dom.DOMSource;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.components.mps.ConfigNotSupportedException;
+import org.apache.servicemix.components.mps.PropertySet;
+import org.apache.servicemix.jbi.messaging.NormalizedMessageImpl;
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
+
+public class PropertySetTest extends TestCase {
+
+	private final transient Log logger = LogFactory.getLog(getClass());
+	private final static String TEST_STRING = "PROP_TEST_STRING";
+	private final static String PROPNAME = "property1";
+	private final static String SAMPLE_MSG_XML = "<sample><get x='911'>me</get></sample>";
+	private final static String SAMPLE_MSG_XML2 = "<this><is><some attr='1234'>xml123</some></is></this>";
+	
+	private final static String XML_EXISTING_PROP = "<existing-property/>";
+	private final static String XML_EXISTING_PROP_OTHER_PROP = "<existing-property name=\"newname\"/>";
+	private final static String XML_STATICVAL = "<static-value><![CDATA[a value in the raw]]></static-value>";
+	private final static String XML_XPATH = "<xpath-expression><![CDATA[//get[@x='911']]]></xpath-expression>";
+	
+	private Document makeDocument(String xml) {
+		DocumentBuilder db;
+		try {
+			db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+			return db.parse(new InputSource(new StringReader(xml)));
+		} catch (Exception e) {
+			fail(e.getLocalizedMessage());
+			return null;
+		}
+	}
+		
+	/**
+	 * helper method to return a new JBI NormalizedMessage
+	 * when we need one
+	 * @return
+	 */
+	private NormalizedMessage makeTestMessage(String xml) {
+		NormalizedMessage message = new NormalizedMessageImpl();
+		message.setProperty(PROPNAME,TEST_STRING);
+		if (xml == null) {
+		    xml = SAMPLE_MSG_XML2;
+		}
+		try {
+			DocumentBuilder db;
+			db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+			Document dom = db.parse(new InputSource(new StringReader(xml)));
+			message.setContent(new DOMSource(dom));
+		} catch (Exception e) {
+			fail(e.getLocalizedMessage());
+		}
+		return message;
+	}
+	
+	/**
+	 * Test 
+	 * <property-set name="somename">
+	 *    <property name="newProperty">
+	 *    	<existing-property name="property1"/>
+	 *    </property>
+	 * </property-set>
+	 *
+	 */
+	public void testSimpleStaticValue() {
+		String xmlConfig = new StringBuffer("<property-set name='somename'>")
+			                    .append("<property name='testSimpleStaticValue.property'>")
+			                    .append("<existing-property name='property1'/>")
+			                    .append("</property>")
+			                    .append("</property-set>").toString();
+		Document propertySet = makeDocument(xmlConfig);
+		try {
+			PropertySet ps = new PropertySet("somename",propertySet.getDocumentElement());
+			NormalizedMessage inMessage = makeTestMessage(null);
+			NormalizedMessage outMessage = makeTestMessage(null);
+			ps.applyProperties(inMessage,outMessage);
+			
+			assertTrue(TEST_STRING.equals(outMessage.getProperty("testSimpleStaticValue.property")));
+		} catch (ConfigNotSupportedException e) {
+			fail(e.getLocalizedMessage());
+		} catch (JBIException e) {
+			fail(e.getLocalizedMessage());// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+	
+	/**
+	 * Test 
+	 * <property-set name="somename">
+	 *    <property name="newProperty">
+	 *    	<existing-property name="property1"/>
+	 *    </property>
+	 * </property-set>
+	 *
+	 */
+	public void testSimpleExistingPropInvalidXPath() {
+		String xmlConfig = new StringBuffer("<property-set name='somename'>")
+			                    .append("<property name='testSimpleExistingPropInvalidXPath.property'>")
+			                    .append("<xpath-expression><![CDATA[/someexpath/statement]]></xpath-expression>")
+			                    .append("<existing-property name='property1'/>")
+			                    .append("</property>")
+			                    .append("</property-set>").toString();
+		Document propertySet = makeDocument(xmlConfig);
+		try {
+			PropertySet ps = new PropertySet("somename",propertySet.getDocumentElement());
+			NormalizedMessage inMessage = makeTestMessage(null);
+			NormalizedMessage outMessage = makeTestMessage(null);
+			ps.applyProperties(inMessage,outMessage);
+			
+			assertTrue(TEST_STRING.equals(outMessage.getProperty("testSimpleExistingPropInvalidXPath.property")));
+		} catch (ConfigNotSupportedException e) {
+			fail(e.getLocalizedMessage());
+		} catch (JBIException e) {
+			fail(e.getLocalizedMessage());// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+	
+	/**
+	 * Test 
+	 * <property-set name="somename">
+	 *    <property name="newProperty">
+	 *    	<existing-property name="property1"/>
+	 *    </property>
+	 * </property-set>
+	 *
+	 */
+	public void testStaticValueDefaultWithBadXpath() {
+		String xmlConfig = new StringBuffer("<property-set name='somename'>")
+			                    .append("<property name='testStaticValueDefaultWithBadXpath.property'>")
+			                    .append("<xpath-expression><![CDATA[/someexpath/statement]]></xpath-expression>")
+			                    .append("<static-value>myvalue</static-value>")
+			                    .append("</property>")
+			                    .append("</property-set>").toString();
+		Document propertySet = makeDocument(xmlConfig);
+		try {
+			PropertySet ps = new PropertySet("somename",propertySet.getDocumentElement());
+			NormalizedMessage inMessage = makeTestMessage(null);
+			NormalizedMessage outMessage = makeTestMessage(null);
+			ps.applyProperties(inMessage,outMessage);
+			
+			assertTrue("myvalue".equals(outMessage.getProperty("testStaticValueDefaultWithBadXpath.property")));
+		} catch (ConfigNotSupportedException e) {
+			fail(e.getLocalizedMessage());
+		} catch (JBIException e) {
+			fail(e.getLocalizedMessage());// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}	
+	/**
+	 * Test 
+	 * <property-set name="somename">
+	 *    <property name="newProperty">
+	 *    	<existing-property name="property1"/>
+	 *    </property>
+	 * </property-set>
+	 *
+	 */
+	public void testSimpleValidXPath() {
+		String xmlConfig = new StringBuffer("<property-set name='somename'>")
+			                    .append("<property name='testSimpleValidXPath.property'>")
+			                    .append("<xpath-expression><![CDATA[/this//some/@attr]]></xpath-expression>")
+			                    .append("<existing-property name='property1'/>")
+			                    .append("</property>")
+			                    .append("</property-set>").toString();
+		Document propertySet = makeDocument(xmlConfig);
+		try {
+			PropertySet ps = new PropertySet("somename",propertySet.getDocumentElement());
+			NormalizedMessage inMessage = makeTestMessage("<this><is><some attr='1234'>xml123</some></is></this>");
+			NormalizedMessage outMessage = makeTestMessage(null);
+			ps.applyProperties(inMessage,outMessage);
+			
+			assertTrue(outMessage.getProperty("testSimpleValidXPath.property").toString().equals("1234"));
+		} catch (ConfigNotSupportedException e) {
+			e.printStackTrace();
+			fail(e.getLocalizedMessage());
+		} catch (JBIException e) {
+			e.printStackTrace();
+			fail(e.getLocalizedMessage());
+		}
+	}	
+	
+	
+	/**
+	 * Test 
+	 * <property-set name="somename">
+	 *    <property name="newProperty">
+	 *    	<existing-property name="property1"/>
+	 *    </property>
+	 * </property-set>
+	 *
+	 */
+	public void testInvalidXPathSingle() {
+		String xmlConfig = new StringBuffer("<property-set name='somename'>")
+			                    .append("<property name='testInvalidXPathSingle.property'>")
+			                    .append("<xpath-expression><![CDATA[/NoNode]]></xpath-expression>")
+			                    .append("</property>")
+			                    .append("</property-set>").toString();
+		Document propertySet = makeDocument(xmlConfig);
+		try {
+			PropertySet ps = new PropertySet("somename",propertySet.getDocumentElement());
+			NormalizedMessage inMessage = makeTestMessage("<this><is><some attr='1234'>xml123</some></is></this>");
+			NormalizedMessage outMessage = makeTestMessage(null);
+			ps.applyProperties(inMessage,outMessage);
+			
+			assertTrue("Node is not null",outMessage.getProperty("testInvalidXPathSingle.property") == null);
+		} catch (ConfigNotSupportedException e) {
+			e.printStackTrace();
+			fail(e.getLocalizedMessage());
+		} catch (JBIException e) {
+			e.printStackTrace();
+			fail(e.getLocalizedMessage());
+		}
+	}
+	
+	/**
+	 * Test 
+	 * <property-set name="somename">
+	 *    <property name="newProperty">
+	 *    	<existing-property name="property1"/>
+	 *    </property>
+	 * </property-set>
+	 *
+	 */
+	public void testXPATH2MessagesOneHasOneHasnt() {
+		String xmlConfig = new StringBuffer("<property-set name='somename'>")
+			                    .append("<property name='testXPATH2MessagesOneHasOneHasnt.property'>")
+			                    .append("<xpath-expression><![CDATA[/this//some/@attr]]></xpath-expression>")
+			                    .append("<existing-property name='property1'/>")
+			                    .append("</property>")
+			                    .append("</property-set>").toString();
+		Document propertySet = makeDocument(xmlConfig);
+		try {
+			PropertySet ps = new PropertySet("somename",propertySet.getDocumentElement());
+			NormalizedMessage inMessage = makeTestMessage("<this><is><some attr='1234'>xml123</some></is></this>");
+			// inMessage will have a property1=TEST_STRING
+			
+			NormalizedMessage inMessage2 = makeTestMessage("<this><is><some>xml123</some></is></this>");
+			// inMessage2 will have a property1=TEST_STRING			
+			NormalizedMessage outMessage = makeTestMessage(null);
+
+			ps.applyProperties(inMessage,outMessage);
+			assertTrue(outMessage.getProperty("testXPATH2MessagesOneHasOneHasnt.property").toString().equals("1234"));
+
+			ps.applyProperties(inMessage2,outMessage);
+			assertTrue(outMessage.getProperty("testXPATH2MessagesOneHasOneHasnt.property").toString().equals(TEST_STRING));
+
+		} catch (ConfigNotSupportedException e) {
+			e.printStackTrace();
+			fail(e.getLocalizedMessage());
+		} catch (JBIException e) {
+			e.printStackTrace();
+			fail(e.getLocalizedMessage());
+		}
+	}	
+	
+	/**
+	 * Test 
+	 * <property-set name="somename">
+	 *    <property name="newProperty">
+	 *    	<existing-property name="property1"/>
+	 *    </property>
+	 * </property-set>
+	 *
+	 */
+	public void testManyProperties() {
+		String xmlConfig = new StringBuffer("<property-set name='somename'>")
+			                    .append("<property name='newProperty1'>")
+			                       .append("<xpath-expression><![CDATA[/this//some/@attr]]></xpath-expression>")
+			                       .append("<existing-property name='property1'/>")
+			                    .append("</property>")
+			                    .append("<property name='newProperty2'>")
+			                       .append("<xpath-expression><![CDATA[/this//some/@attrNoExisting]]></xpath-expression>")
+			                       .append("<static-value><![CDATA[Some String I expect to be Set]]></static-value>")
+			                    .append("</property>")
+			                    .append("<property name='newProperty3'>")
+			                       .append("<existing-property name='missingProperty'/>")
+			                       .append("<existing-property name='missingProperty2'/>")
+			                       .append("<static-value><![CDATA[Some String I expect to be Set]]></static-value>")
+			                    .append("</property>")
+			                    .append("<property name='newProperty4'>")
+			                       .append("<xpath-expression><![CDATA[/this//some/nothere/@attr]]></xpath-expression>")
+			                       .append("<existing-property name='property1WhichIsNoteThere'/>")
+			                       .append("<existing-property name='testProperty'/>")
+			                    .append("</property>")
+			                    .append("<property name='newProperty5'>")
+			                       .append("<static-value><![CDATA[tagged]]></static-value>")
+			                       .append("<static-value><![CDATA[taggedNotSet]]></static-value>")
+			                    .append("</property>")
+			                    .append("<property name='newProperty6'>")
+			                       .append("<xpath-expression><![CDATA[/this//some/@attrNoExisting]]></xpath-expression>")
+			                       .append("</property>")			                    
+			                    .append("</property-set>").toString();
+		Document propertySet = makeDocument(xmlConfig);
+		try {
+			PropertySet ps = new PropertySet("somename",propertySet.getDocumentElement());
+			NormalizedMessage inMessage = makeTestMessage("<this><is><some attr='1234'>xml123</some></is></this>");
+			inMessage.setProperty("testProperty","value123");
+			NormalizedMessage outMessage = makeTestMessage(null);
+			ps.applyProperties(inMessage,outMessage);
+			
+			assertTrue("newProperty1 was not set to expected value",outMessage.getProperty("newProperty1").toString().equals("1234"));
+			assertTrue("newProperty2 was not set to expected value",outMessage.getProperty("newProperty2").toString().equals("Some String I expect to be Set"));
+			assertTrue("newProperty3 was not set to expected value",outMessage.getProperty("newProperty3").toString().equals("Some String I expect to be Set"));
+			assertTrue("newProperty4 was not set to expected value",outMessage.getProperty("newProperty4").toString().equals("value123"));
+			assertTrue("newProperty5 was not set to expected value",outMessage.getProperty("newProperty5").toString().equals("tagged"));
+			assertTrue("newProperty5 was not set to expected value",outMessage.getProperty("newProperty6") == null);
+		} catch (ConfigNotSupportedException e) {
+			e.printStackTrace();
+			fail(e.getLocalizedMessage());
+		} catch (JBIException e) {
+			e.printStackTrace();
+			fail(e.getLocalizedMessage());
+		}
+	}	
+	
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/mps/PropertyValueResolverTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/mps/PropertyValueResolverTest.java
new file mode 100644
index 0000000..8513cce
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/mps/PropertyValueResolverTest.java
@@ -0,0 +1,182 @@
+/*
+ * 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.servicemix.components.mps;
+
+import java.io.StringReader;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.dom.DOMSource;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.jbi.messaging.NormalizedMessageImpl;
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
+
+/**
+ * Test cases for the PropertyValueResolver class
+ * 
+ * @author rbuckland
+ * 
+ */
+public class PropertyValueResolverTest extends TestCase {
+
+	private final transient Log logger = LogFactory.getLog(getClass());
+
+	private final static String TEST_STRING = "PROP_TEST_STRING";
+
+	private final static String PROPNAME = "property1";
+
+	private final static String SAMPLE_MSG_XML = "<sample><get x='911'>me</get></sample>";
+
+	private final static String XML_EXISTING_PROP = "<existing-property/>";
+
+	private final static String XML_EXISTING_PROP_OTHER_PROP = "<existing-property name=\"newname\"/>";
+
+	private final static String XML_STATICVAL = "<static-value><![CDATA[a value in the raw]]></static-value>";
+
+	private final static String XML_XPATH = "<xpath-expression><![CDATA[//get[@x='911']]]></xpath-expression>";
+
+	private Document makeDocument(String xml) {
+		DocumentBuilder db;
+		try {
+			db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+			return db.parse(new InputSource(new StringReader(xml)));
+		} catch (Exception e) {
+			fail(e.getLocalizedMessage());
+			return null;
+		}
+	}
+
+	/**
+	 * helper method to return a new JBI NormalizedMessage when we need one
+	 * 
+	 * @return
+	 */
+	private NormalizedMessage makeTestMessage(String xml) {
+		NormalizedMessage message = new NormalizedMessageImpl();
+		message.setProperty(PROPNAME, TEST_STRING);
+		if (xml == null) {
+			xml = "<this><is><some attr='1234'>xml123</some></is></this>";
+		}
+		try {
+			DocumentBuilder db;
+			db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+			Document dom = db.parse(new InputSource(new StringReader(xml)));
+			message.setContent(new DOMSource(dom));
+		} catch (Exception e) {
+			fail(e.getLocalizedMessage());
+		}
+		return message;
+	}
+
+	/**
+	 * Test that a static string, does return a static string
+	 * 
+	 */
+	public void testStaticStringAsFirst() {
+		String propertyNode = (new StringBuffer("<").append(
+				PropertyValueResolver.XML_ELEMENT_NAME).append(
+				" name='newproperty'>").append(XML_STATICVAL).append("</")
+				.append(PropertyValueResolver.XML_ELEMENT_NAME).append(">"))
+				.toString();
+
+		NormalizedMessage in = makeTestMessage(SAMPLE_MSG_XML);
+		NormalizedMessage out = makeTestMessage(SAMPLE_MSG_XML);
+		Document doc = makeDocument(propertyNode);
+		try {
+			PropertyValueResolver pvr = new PropertyValueResolver(
+					"newproperty", doc.getDocumentElement());
+			pvr.setProperty(in, out);
+			logger.debug("prop = " + out.getProperty("newproperty"));
+			assertTrue(out.getProperty("newproperty").toString().equals(
+					"a value in the raw"));
+
+		} catch (JBIException e) {
+			fail(e.getLocalizedMessage());
+		} catch (ConfigNotSupportedException e) {
+			fail(e.getLocalizedMessage());
+		}
+	}
+
+	/**
+	 * Test the xpath PVR
+	 * 
+	 */
+	public void testXPath() {
+		String propertyNode = (new StringBuffer("<").append(
+				PropertyValueResolver.XML_ELEMENT_NAME).append(
+				" name='newproperty'>").append(XML_XPATH).append(XML_STATICVAL)
+				.append("</").append(PropertyValueResolver.XML_ELEMENT_NAME)
+				.append(">")).toString();
+
+		NormalizedMessage in = makeTestMessage(PropertyValueResolverTest.SAMPLE_MSG_XML);
+		NormalizedMessage out = makeTestMessage(SAMPLE_MSG_XML);
+		Document doc = makeDocument(propertyNode);
+		try {
+			PropertyValueResolver pvr = new PropertyValueResolver(
+					"newproperty", doc.getDocumentElement());
+			pvr.setProperty(in, out);
+			logger
+					.debug("xpath:@newproperty = "
+							+ out.getProperty("newproperty"));
+			assertTrue(out.getProperty("newproperty") != null);
+			assertTrue(out.getProperty("newproperty").toString().equals("me"));
+
+		} catch (JBIException e) {
+			fail(e.getLocalizedMessage());
+		} catch (ConfigNotSupportedException e) {
+			fail(e.getLocalizedMessage());
+		}
+	}
+
+	/**
+	 * Test that a existing copier thingo
+	 * 
+	 */
+	public void testExistCopier() {
+		String propertyNode = (new StringBuffer("<").append(
+				PropertyValueResolver.XML_ELEMENT_NAME).append(
+				" name='prop.xyz'>").append(XML_EXISTING_PROP).append(
+				XML_STATICVAL).append("</").append(
+				PropertyValueResolver.XML_ELEMENT_NAME).append(">")).toString();
+
+		NormalizedMessage in = makeTestMessage(PropertyValueResolverTest.SAMPLE_MSG_XML);
+		in.setProperty("prop.xyz", "ahahaha");
+		NormalizedMessage out = makeTestMessage(SAMPLE_MSG_XML);
+		Document doc = makeDocument(propertyNode);
+		try {
+			PropertyValueResolver pvr = new PropertyValueResolver("prop.xyz",
+					doc.getDocumentElement());
+			pvr.setProperty(in, out);
+			logger.debug("prop = " + out.getProperty("prop.xyz"));
+			assertTrue(out.getProperty("prop.xyz") != null);
+			assertTrue(out.getProperty("prop.xyz").toString().equals("ahahaha"));
+
+		} catch (JBIException e) {
+			fail(e.getLocalizedMessage());
+		} catch (ConfigNotSupportedException e) {
+			fail(e.getLocalizedMessage());
+		}
+	}
+
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/mps/PropertyValueTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/mps/PropertyValueTest.java
new file mode 100644
index 0000000..bb5a6cf
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/mps/PropertyValueTest.java
@@ -0,0 +1,127 @@
+/*
+ * 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.servicemix.components.mps;
+
+import java.io.StringReader;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.dom.DOMSource;
+
+import junit.framework.TestCase;
+
+import org.apache.servicemix.jbi.messaging.NormalizedMessageImpl;
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
+
+/**
+ * Test cases for the PeoprtyValue type Objects
+ * @author rbuckland
+ *
+ */
+public class PropertyValueTest extends TestCase {
+
+	private final static String TEST_STRING = "PROP_TEST_STRING";
+	private final static String PROPNAME = "property1";
+	/**
+	 * helper method to return a new JBI NormalizedMessage
+	 * when we need one
+	 * @return
+	 */
+	private NormalizedMessage getTestMessage() {
+		NormalizedMessage message = new NormalizedMessageImpl();
+		message.setProperty(PROPNAME,TEST_STRING);
+		String xml = "<this><is><some attr='1234'>xml123</some></is></this>";
+		try {
+			DocumentBuilder db;
+			db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+			Document dom = db.parse(new InputSource(new StringReader(xml)));
+			message.setContent(new DOMSource(dom));
+		} catch (Exception e) {
+			fail(e.getLocalizedMessage());
+		}
+		return message;
+	}
+
+	/**
+	 * Test that a static string, does return a static string
+	 *
+	 */
+	public void testStaticString() {
+		PropertyValue pv = new StaticStringPropertyValue("someValueX");
+		try {
+			assertTrue(pv.getPropertyValue(getTestMessage()).equals("someValueX"));
+		} catch (JBIException e) {
+			fail(e.getLocalizedMessage());
+		}
+	}
+
+	/**
+	 * Test that a existing property copier works
+	 *
+	 */
+	public void testExistingCopier() {
+		PropertyValue pv = new ExistingPropertyCopier(PROPNAME);
+		try {
+			assertTrue(pv.getPropertyValue(getTestMessage()).equals(TEST_STRING));
+		} catch (JBIException e) {
+			fail(e.getLocalizedMessage());
+		}
+	}
+
+	/**
+	 * Test that a existing property copier works
+	 *
+	 */
+	public void testXPathElementPropertyValue() {
+		PropertyValue pv = new XPathContentMessagePropertyValue("/this/is/some");
+		try {
+			assertTrue(pv.getPropertyValue(getTestMessage()).equals("xml123"));
+		} catch (JBIException e) {
+			fail(e.getLocalizedMessage());
+		}
+	}
+
+	/**
+	 * Test that a existing property copier works
+	 *
+	 */
+	public void testXPathAttrPropertyValue() {
+		PropertyValue pv = new XPathContentMessagePropertyValue("/this/is/some/@attr");
+		try {
+			assertTrue(pv.getPropertyValue(getTestMessage()).equals("1234"));
+		} catch (JBIException e) {
+			fail(e.getLocalizedMessage());
+		}
+	}
+
+	/**
+	 * Test that a existing property copier works
+	 *
+	 */
+	public void testXPathConcatPropertyValue() {
+		PropertyValue pv = new XPathContentMessagePropertyValue("concat('x','y')");
+		try {
+			assertTrue(pv.getPropertyValue(getTestMessage()).equals("xy"));
+		} catch (JBIException e) {
+			fail(e.getLocalizedMessage());
+		}
+	}
+
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/net/FTPPollTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/net/FTPPollTest.java
new file mode 100644
index 0000000..0079ecc
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/net/FTPPollTest.java
@@ -0,0 +1,40 @@
+/*
+ * 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.servicemix.components.net;
+
+import org.apache.servicemix.tck.TestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+
+import javax.xml.namespace.QName;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class FTPPollTest extends TestSupport {
+
+    public void testSendMessagesToFTPThenPollThemAgain() throws Exception {
+        QName service = new QName("http://servicemix.org/cheese/", "ftpSender");
+
+        sendMessages(service, messageCount, false, null);
+        assertMessagesReceived(messageCount);
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/net/ftpPoll.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/net/FTPTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/net/FTPTest.java
new file mode 100644
index 0000000..3dae307
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/net/FTPTest.java
@@ -0,0 +1,81 @@
+/*
+ * 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.servicemix.components.net;
+
+import org.apache.servicemix.jbi.jaxp.StringSource;
+import org.apache.servicemix.jbi.resolver.ServiceNameEndpointResolver;
+import org.apache.servicemix.tck.TestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+
+import javax.jbi.messaging.InOnly;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.namespace.QName;
+
+/**
+ * Warning: this test case requires an FTP server running on localhost with user / password
+ * of [servicemix/rocks].
+ * <p/>
+ * For details of how to set this up on OS X see
+ * <a href="http://www.ldml.com/services/support/macosx/ftpUserCreate.html">this tutorial</a>
+ *
+ * @version $Revision: 426415 $
+ */
+public class FTPTest extends TestSupport {
+
+    public void testSendUsingMessageContentAndUniquelyGeneratedName() throws Exception {
+
+        // START SNIPPET: content
+        InOnly exchange = client.createInOnlyExchange();
+        NormalizedMessage message = exchange.getInMessage();
+
+        message.setContent(new StringSource("<hello>world!</hello>"));
+
+        client.sendSync(exchange);
+        // END SNIPPET: content
+    }
+
+    public void testSendUsingMessageProperties() throws Exception {
+
+        // START SNIPPET: properties
+        InOnly exchange = client.createInOnlyExchange();
+        NormalizedMessage message = exchange.getInMessage();
+
+        message.setProperty("org.apache.servicemix.file.name", "cheese.txt");
+        message.setProperty("org.apache.servicemix.file.content", "Hello World!");
+
+        client.sendSync(exchange);
+        // END SNIPPET: properties
+    }
+
+    public void testSendUsingMessageContentAndExpressionName() throws Exception {
+
+        QName service = new QName("http://servicemix.org/cheese/", "ftpSenderWithExpression");
+        ServiceNameEndpointResolver resolver = new ServiceNameEndpointResolver(service);
+
+        InOnly exchange = client.createInOnlyExchange(resolver);
+        NormalizedMessage message = exchange.getInMessage();
+
+        message.setContent(new StringSource("<order id='abc123'><customer>Duff Beer</customer><value>599.99</value></order>"));
+
+        client.sendSync(exchange);
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/net/ftp.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/pojo/MorePojoTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/pojo/MorePojoTest.java
new file mode 100644
index 0000000..f44ff43
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/pojo/MorePojoTest.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.servicemix.components.pojo;
+
+import org.apache.servicemix.components.util.PojoLifecycleAdaptor;
+import org.apache.servicemix.tck.SpringTestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class MorePojoTest extends SpringTestSupport {
+
+    public void testSendAndReceiveOfMessages() throws Exception {
+        PojoSender sender = (PojoSender) getBean("sender");
+        sender.sendMessages(messageCount);
+
+        PojoLifecycleAdaptor adaptor = (PojoLifecycleAdaptor) getBean("receiver");
+        PojoReceiver receiver = (PojoReceiver) adaptor.getPojo();
+        assertMessagesReceived(receiver.getMessageList(), messageCount);
+    }
+
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/pojo/example-more-pojo.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/pojo/MyReceiver.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/pojo/MyReceiver.java
new file mode 100644
index 0000000..6f21c25
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/pojo/MyReceiver.java
@@ -0,0 +1,93 @@
+/*
+ * 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.servicemix.components.pojo;
+
+import javax.jbi.JBIException;
+import javax.jbi.component.ComponentContext;
+import javax.jbi.component.ComponentLifeCycle;
+import javax.jbi.messaging.ExchangeStatus;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.management.ObjectName;
+import javax.xml.namespace.QName;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.MessageExchangeListener;
+import org.apache.servicemix.tck.MessageList;
+
+/**
+ * @version $Revision: 426415 $
+ */
+
+// START SNIPPET: receive 
+public class MyReceiver implements ComponentLifeCycle, MessageExchangeListener {
+	private static final Log log = LogFactory.getLog(MyReceiver.class);
+	
+    private ComponentContext context;
+    private ObjectName extensionMBeanName;
+    private MessageList messageList = new MessageList();
+
+
+    // ComponentLifeCycle interface
+    //-------------------------------------------------------------------------
+    public ObjectName getExtensionMBeanName() {
+        return extensionMBeanName;
+    }
+
+    public void init(ComponentContext context) throws JBIException {
+        this.context = context;
+
+        // Lets activate myself
+        context.activateEndpoint(new QName("http://servicemix.org/cheese/", "receiver"), "receiver");
+    }
+
+    public void shutDown() throws JBIException {
+    }
+
+    public void start() throws JBIException {
+    }
+
+    public void stop() throws JBIException {
+    }
+
+    // MessageExchangeListener interface
+    //-------------------------------------------------------------------------
+    public void onMessageExchange(MessageExchange exchange) throws MessagingException {
+        log.info("Received message " + exchange);
+        NormalizedMessage message = exchange.getMessage("in");
+        getMessageList().addMessage(message);
+        exchange.setStatus(ExchangeStatus.DONE);
+        context.getDeliveryChannel().send(exchange);
+    }
+
+    // Properties
+    //-------------------------------------------------------------------------
+    public void setExtensionMBeanName(ObjectName extensionMBeanName) {
+        this.extensionMBeanName = extensionMBeanName;
+    }
+
+    public MessageList getMessageList() {
+        return messageList;
+    }
+
+    public void setMessageList(MessageList messageList) {
+        this.messageList = messageList;
+    }
+}
+// END SNIPPET: receive
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/pojo/MySender.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/pojo/MySender.java
new file mode 100644
index 0000000..ec19e33
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/pojo/MySender.java
@@ -0,0 +1,86 @@
+/*
+ * 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.servicemix.components.pojo;
+
+import javax.jbi.JBIException;
+import javax.jbi.component.ComponentContext;
+import javax.jbi.component.ComponentLifeCycle;
+import javax.jbi.messaging.DeliveryChannel;
+import javax.jbi.messaging.InOnly;
+import javax.jbi.messaging.MessageExchangeFactory;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.management.ObjectName;
+
+import org.apache.servicemix.jbi.jaxp.StringSource;
+
+/**
+ * @version $Revision: 426415 $
+ */
+// START SNIPPET: send
+public class MySender implements ComponentLifeCycle {
+    private ComponentContext context;
+    private ObjectName extensionMBeanName;
+
+
+    /**
+     * Sends a number of messages
+     */
+    public void sendMessages(int count) throws MessagingException {
+        DeliveryChannel deliveryChannel = context.getDeliveryChannel();
+        MessageExchangeFactory factory = deliveryChannel.createExchangeFactory();
+
+        for (int i = 0; i < count; i++) {
+            InOnly exchange = factory.createInOnlyExchange();
+            NormalizedMessage message = exchange.createMessage();
+            exchange.setInMessage(message);
+
+            message.setProperty("id", new Integer(i));
+            message.setContent(new StringSource("<example id='" + i + "'/>"));
+
+            deliveryChannel.send(exchange);
+        }
+    }
+
+    // ComponentLifeCycle interface
+    //-------------------------------------------------------------------------
+    public ObjectName getExtensionMBeanName() {
+        return extensionMBeanName;
+    }
+
+    public void init(ComponentContext context) throws JBIException {
+        this.context = context;
+    }
+
+    public void shutDown() throws JBIException {
+    }
+
+    public void start() throws JBIException {
+    }
+
+    public void stop() throws JBIException {
+    }
+
+
+    // Properties
+    //-------------------------------------------------------------------------
+    public void setExtensionMBeanName(ObjectName extensionMBeanName) {
+        this.extensionMBeanName = extensionMBeanName;
+    }
+}
+
+// END SNIPPET: send
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/pojo/PojoReceiver.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/pojo/PojoReceiver.java
new file mode 100644
index 0000000..100abff
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/pojo/PojoReceiver.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.servicemix.components.pojo;
+
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+
+import org.apache.servicemix.MessageExchangeListener;
+import org.apache.servicemix.tck.MessageList;
+
+/**
+ * @version $Revision: 426415 $
+ */
+// START SNIPPET: receive
+public class PojoReceiver implements MessageExchangeListener {
+    private MessageList messageList = new MessageList();
+
+    public void onMessageExchange(MessageExchange exchange) throws MessagingException {
+        NormalizedMessage message = exchange.getMessage("in");
+        getMessageList().addMessage(message);
+    }
+
+    public MessageList getMessageList() {
+        return messageList;
+    }
+}
+// END SNIPPET: receive
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/pojo/PojoSender.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/pojo/PojoSender.java
new file mode 100644
index 0000000..fb27c50
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/pojo/PojoSender.java
@@ -0,0 +1,53 @@
+/*
+ * 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.servicemix.components.pojo;
+
+import org.apache.servicemix.client.ServiceMixClient;
+import org.apache.servicemix.jbi.jaxp.StringSource;
+
+import javax.jbi.messaging.InOnly;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+
+/**
+ * @version $Revision: 426415 $
+ */
+// START SNIPPET: send
+public class PojoSender {
+    private ServiceMixClient client;
+
+    public void sendMessages(int count) throws MessagingException {
+        for (int i = 0; i < count; i++) {
+            InOnly exchange = client.createInOnlyExchange();
+            NormalizedMessage message = exchange.getInMessage();
+
+            message.setProperty("id", new Integer(i));
+            message.setContent(new StringSource("<example id='" + i + "'/>"));
+
+            client.send(exchange);
+        }
+    }
+
+    public ServiceMixClient getClient() {
+        return client;
+    }
+
+    public void setClient(ServiceMixClient client) {
+        this.client = client;
+    }
+}
+// END SNIPPET: send
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/pojo/PojoTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/pojo/PojoTest.java
new file mode 100644
index 0000000..3e34944
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/pojo/PojoTest.java
@@ -0,0 +1,58 @@
+/*
+ * 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.servicemix.components.pojo;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.tck.SpringTestSupport;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+
+/**
+ * @version $Revision: 556864 $
+ */
+public class PojoTest extends SpringTestSupport {
+    private static transient Log log = LogFactory.getLog(PojoTest.class);
+
+    public void testSendAndReceiveOfMessages() throws Exception {
+        MySender sender = (MySender) getBean("sender");
+        sender.sendMessages(messageCount);
+
+        MyReceiver receiver = (MyReceiver) getBean("receiver");
+        assertMessagesReceived(receiver.getMessageList(), messageCount);
+    }
+
+    public void testPerfSendAndReceiveOfMessages() throws Exception {
+    	MySender sender = (MySender) getBean("sender");
+    	MyReceiver receiver = (MyReceiver) getBean("receiver");
+    	sender.sendMessages(100);
+    	assertMessagesReceived(receiver.getMessageList(), 100);
+    	receiver.getMessageList().flushMessages();
+
+    	int messageCount = 500;
+    	long start = System.currentTimeMillis();
+    	sender.sendMessages(messageCount);
+    	assertMessagesReceived(receiver.getMessageList(), messageCount);
+    	long end = System.currentTimeMillis();
+
+    	log.info((end - start) + " ms to send " + messageCount + " messages");
+    }
+    
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/pojo/example.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/quartz/QuartzComponentClusterTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/quartz/QuartzComponentClusterTest.java
new file mode 100644
index 0000000..8b58af0
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/quartz/QuartzComponentClusterTest.java
@@ -0,0 +1,35 @@
+/*
+ * 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.servicemix.components.quartz;
+
+import org.apache.servicemix.tck.TestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+
+/**
+ * @version $Revision: 359186 $
+ */
+public class QuartzComponentClusterTest extends TestSupport {
+
+    public void testSendMessagesToJmsThenOutofJmsToReceiver() throws Exception {
+        assertMessagesReceived();
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/quartz/example-cluster.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/quartz/QuartzComponentTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/quartz/QuartzComponentTest.java
new file mode 100644
index 0000000..908546a
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/quartz/QuartzComponentTest.java
@@ -0,0 +1,35 @@
+/*
+ * 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.servicemix.components.quartz;
+
+import org.apache.servicemix.tck.TestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class QuartzComponentTest extends TestSupport {
+
+    public void testSendMessagesToJmsThenOutofJmsToReceiver() throws Exception {
+        assertMessagesReceived();
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/quartz/example.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/reflection/Counter.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/reflection/Counter.java
new file mode 100644
index 0000000..060f686
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/reflection/Counter.java
@@ -0,0 +1,22 @@
+/*
+ * 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.servicemix.components.reflection;
+
+public interface Counter {
+    void increment();    
+    void decrement();
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/reflection/ReflectionBindingTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/reflection/ReflectionBindingTest.java
new file mode 100644
index 0000000..027a9af
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/reflection/ReflectionBindingTest.java
@@ -0,0 +1,68 @@
+/*
+ * 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.servicemix.components.reflection;
+
+import junit.framework.TestCase;
+
+import org.apache.servicemix.components.reflection.ProxyInOnlyBinding;
+import org.apache.servicemix.jbi.container.SpringJBIContainer;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+
+/**
+ * @version $Revision: 681324 $
+ */
+public class ReflectionBindingTest extends TestCase {
+
+    private AbstractXmlApplicationContext context;
+    protected int messageCount = 20;
+    private SpringJBIContainer jbi;
+
+    public void testSendMessagesToJmsThenOutofJmsToReceiver() throws Exception {
+        Counter counter = (Counter) ((ProxyInOnlyBinding)jbi.getBean("proxyCounter")).createProxy();       
+        for (int i = 1; i <= messageCount; i++) {
+            counter.increment();
+        }        
+        Thread.sleep(2000);
+        SimpleCounter simpleCounter = (SimpleCounter) getBean("counter");
+        assertEquals(messageCount, simpleCounter.getValue() );
+        
+    }
+
+    protected void setUp() throws Exception {
+        context = createBeanFactory();
+        jbi = (SpringJBIContainer) getBean("jbi");
+    }
+    
+    protected void tearDown() throws Exception {
+        if (context != null) {
+            context.close();
+        }
+    }
+
+    protected Object getBean(String name) {
+        Object answer = context.getBean(name);
+        assertNotNull("Could not find object in Spring for key: " + name, answer);
+        return answer;
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/reflection/example.xml");
+    }
+    
+    
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/reflection/SimpleCounter.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/reflection/SimpleCounter.java
new file mode 100644
index 0000000..c8017f9
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/reflection/SimpleCounter.java
@@ -0,0 +1,35 @@
+/*
+ * 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.servicemix.components.reflection;
+
+public class SimpleCounter implements Counter {
+
+    int counter;
+    
+    public void increment() {
+        counter++;        
+    }
+
+    public void decrement() {
+        counter--;
+    }
+    
+    int getValue() {
+        return counter;
+    }
+
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/rss/FeedWriterTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/rss/FeedWriterTest.java
new file mode 100644
index 0000000..7952f79
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/rss/FeedWriterTest.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.servicemix.components.rss;
+
+import org.apache.servicemix.tck.TestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+
+import javax.xml.namespace.QName;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class FeedWriterTest extends TestSupport {
+
+    public void testSendMessagesToJmsThenOutofJmsToReceiver() throws Exception {
+        QName service = new QName("http://servicemix.org/cheese/", "feedWriter");
+
+        sendMessages(service, 5);
+        
+        // now lets assert that the RSS feed has data in it.
+        
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/rss/example.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/saaj/SaajMarshalerTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/saaj/SaajMarshalerTest.java
new file mode 100644
index 0000000..4d01944
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/saaj/SaajMarshalerTest.java
@@ -0,0 +1,125 @@
+/*
+ * 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.servicemix.components.saaj;
+
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.namespace.QName;
+import javax.xml.soap.MessageFactory;
+import javax.xml.soap.MimeHeaders;
+import javax.xml.soap.SOAPMessage;
+import javax.xml.transform.stream.StreamSource;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.jbi.jaxp.SourceTransformer;
+import org.apache.servicemix.jbi.jaxp.StringSource;
+import org.apache.servicemix.jbi.messaging.NormalizedMessageImpl;
+import org.apache.servicemix.jbi.util.DOMUtil;
+import org.apache.xpath.CachedXPathAPI;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.traversal.NodeIterator;
+
+public class SaajMarshalerTest extends TestCase {
+
+	private static final transient Log log = LogFactory.getLog(SaajMarshalerTest.class); 
+	
+	public void testAxisToNMS() throws Exception {
+		MessageFactory messageFactory = new org.apache.axis.soap.MessageFactoryImpl();
+		testToNMS(messageFactory);
+	}
+	
+	public void testAxisCreateSOAPMessage() throws Exception {
+		MessageFactory messageFactory = new org.apache.axis.soap.MessageFactoryImpl();
+		testCreateSOAPMessage(messageFactory);
+	}
+	
+	/*
+	public void testAxis2() throws Exception {
+		MessageFactory messageFactory = new org.apache.axis2.saaj.MessageFactoryImpl();
+		testFactory(messageFactory);
+	}
+	*/
+	
+    /*
+	public void testSunToNMS() throws Exception {
+		MessageFactory messageFactory = new com.sun.xml.messaging.saaj.soap.MessageFactoryImpl();
+		testToNMS(messageFactory);
+	}
+    */
+	
+	/*
+	public void testSunCreateSOAPMessage() throws Exception {
+		MessageFactory messageFactory = new com.sun.xml.messaging.saaj.soap.MessageFactoryImpl();
+		testCreateSOAPMessage(messageFactory);
+	}
+	*/
+	
+	protected void testToNMS(MessageFactory messageFactory) throws Exception {
+		MimeHeaders headers = new MimeHeaders();
+		headers.addHeader("Content-Type", "text/xml;");
+		InputStream is = getClass().getClassLoader().getResourceAsStream("org/apache/servicemix/components/http/soap-response.xml");
+		SOAPMessage sm = messageFactory.createMessage(headers, is);
+		NormalizedMessage nm = new NormalizedMessageImpl();
+		new SaajMarshaler().toNMS(nm, sm);
+
+        Node node = new SourceTransformer().toDOMNode(new SourceTransformer().toStreamSource(nm.getContent()));
+        log.info(new SourceTransformer().toString(node));
+		
+        CachedXPathAPI cachedXPathAPI = new CachedXPathAPI();
+        NodeIterator iterator = cachedXPathAPI.selectNodeIterator(node, "//*[local-name() = 'userId']");
+        Element root = (Element) iterator.nextNode();
+        QName qname = DOMUtil.createQName(root, root.getAttributeNS("http://www.w3.org/2001/XMLSchema-instance", "type"));
+        assertEquals("http://www.w3.org/2001/XMLSchema", qname.getNamespaceURI());
+        assertEquals("string", qname.getLocalPart());
+	}
+	
+	protected void testCreateSOAPMessage(MessageFactory messageFactory) throws Exception { 
+        MimeHeaders headers = new MimeHeaders(); 
+        headers.addHeader("Content-Type", "text/xml;"); 
+         
+        InputStream is = getClass().getClassLoader().getResourceAsStream("org/apache/servicemix/components/saaj/xml-request.xml");         
+        log.info("Raw XML: " + new SourceTransformer().toString(new StreamSource(is))); 
+         
+        is = getClass().getClassLoader().getResourceAsStream("org/apache/servicemix/components/saaj/xml-request.xml");         
+        NormalizedMessage nm = new NormalizedMessageImpl(); 
+        nm.setContent(new StreamSource(is)); 
+           
+        SaajMarshaler marshaler = new SaajMarshaler();
+        marshaler.setMessageFactory(messageFactory);
+        SOAPMessage msg = marshaler.createSOAPMessage(nm);
+        
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        msg.writeTo(baos);
+        String soapEnv = new String(baos.toByteArray());
+        log.info("Prepared SOAP: " + soapEnv); 
+        Node node2 = new SourceTransformer().toDOMNode(new StringSource(soapEnv)); 
+          
+        CachedXPathAPI cachedXPathAPI = new CachedXPathAPI(); 
+        NodeIterator iterator = cachedXPathAPI.selectNodeIterator(node2, "//*[local-name() = 'userId']"); 
+        Element root = (Element) iterator.nextNode(); 
+        QName qname = DOMUtil.createQName(root, root.getAttributeNS("http://www.w3.org/2001/XMLSchema-instance", "type")); 
+        assertEquals("http://www.w3.org/2001/XMLSchema", qname.getNamespaceURI()); 
+        assertEquals("string", qname.getLocalPart()); 
+    } 
+
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/saaj/SaajSoapActionTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/saaj/SaajSoapActionTest.java
new file mode 100644
index 0000000..6096c25
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/saaj/SaajSoapActionTest.java
@@ -0,0 +1,166 @@
+/*
+ * 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.servicemix.components.saaj;
+
+import javax.jbi.messaging.ExchangeStatus;
+import javax.jbi.messaging.InOut;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.messaging.URLEndpoint;
+import javax.xml.namespace.QName;
+import javax.xml.soap.MessageFactory;
+
+import junit.framework.TestCase;
+
+import org.apache.servicemix.MessageExchangeListener;
+import org.apache.servicemix.client.DefaultServiceMixClient;
+import org.apache.servicemix.components.http.HttpConnector;
+import org.apache.servicemix.components.util.ComponentSupport;
+import org.apache.servicemix.jbi.container.ActivationSpec;
+import org.apache.servicemix.jbi.container.JBIContainer;
+import org.apache.servicemix.jbi.jaxp.StringSource;
+
+public class SaajSoapActionTest extends TestCase {
+
+    private JBIContainer jbi;
+    private SaajBinding saaj;
+    private HttpConnector http;
+    
+    protected void setUp() throws Exception {
+        jbi = new JBIContainer();
+        jbi.setEmbedded(true);
+        jbi.setUseMBeanServer(false);
+        jbi.setCreateMBeanServer(false);
+        jbi.init();
+    }
+    
+    protected void tearDown() throws Exception {
+        jbi.shutDown();
+    }
+    
+    protected String testSoapAction(String soapAction, MessageFactory messageFactory) throws Exception {
+        saaj = new SaajBinding();
+        saaj.setService(new QName("saaj"));
+        saaj.setEndpoint("endpoint");
+        saaj.setSoapEndpoint(new URLEndpoint("http://localhost:8192/"));
+        saaj.setSoapAction(soapAction);
+        SaajMarshaler marshaler = new SaajMarshaler();
+        marshaler.setMessageFactory(messageFactory);
+        saaj.setMarshaler(marshaler);
+        jbi.activateComponent(saaj, "saaj");
+        
+        http = new HttpConnector(new org.mortbay.jetty.nio.SelectChannelConnector());
+        http.setHost("localhost");
+        http.setPort(8192);
+        //http.setDefaultInOut(false);
+        ActivationSpec httpAs = new ActivationSpec();
+        httpAs.setComponent(http);
+        httpAs.setComponentName("http");
+        httpAs.setDestinationService(new QName("receiver"));
+        jbi.activateComponent(httpAs);
+        
+        SoapActionReceiver receiver = new SoapActionReceiver();
+        jbi.activateComponent(receiver, "receiver");
+
+        jbi.start();
+        
+        DefaultServiceMixClient client = new DefaultServiceMixClient(jbi);
+        InOut me = client.createInOutExchange();
+        me.setService(new QName("saaj"));
+        me.getInMessage().setContent(new StringSource("<hello>world</hello>"));
+        client.sendSync(me);
+        if (me.getStatus() == ExchangeStatus.ERROR) {
+            if (me.getError() != null) {
+                throw me.getError();
+            }
+        }
+        assertEquals(ExchangeStatus.ACTIVE, me.getStatus());
+        client.done(me);
+        
+        Thread.sleep(50);
+        
+        return receiver.sentSoapAction;
+    }
+    
+    public void testNullSoapActionAxis() throws Exception {
+        String received = testSoapAction(null, new org.apache.axis.soap.MessageFactoryImpl());
+        assertEquals("\"\"", received);
+    }
+    
+    /*
+    public void testNullSoapActionSun() throws Exception {
+        String received = testSoapAction(null, new com.sun.xml.messaging.saaj.soap.MessageFactoryImpl());
+        assertEquals("\"\"", received);
+    }
+    */
+    
+    public void testEmptySoapActionAxis() throws Exception {
+        String received = testSoapAction("", new org.apache.axis.soap.MessageFactoryImpl());
+        assertEquals("\"\"", received);
+    }
+    
+    /*
+    public void testEmptySoapActionSun() throws Exception {
+        String received = testSoapAction("", new com.sun.xml.messaging.saaj.soap.MessageFactoryImpl());
+        assertEquals("", received);
+    }
+    */
+    
+    public void testQuotesSoapActionAxis() throws Exception {
+        String received = testSoapAction("\"\"", new org.apache.axis.soap.MessageFactoryImpl());
+        assertEquals("\"\"", received);
+    }
+    
+    /*
+    public void testQuotesSoapActionSun() throws Exception {
+        String received = testSoapAction("\"\"", new com.sun.xml.messaging.saaj.soap.MessageFactoryImpl());
+        assertEquals("\"\"", received);
+    }
+    */
+    
+    public void testWithSoapActionAxis() throws Exception {
+        String received = testSoapAction("action", new org.apache.axis.soap.MessageFactoryImpl());
+        assertEquals("action", received);
+    }
+    
+    /*
+    public void testWithSoapActionSun() throws Exception {
+        String received = testSoapAction("action", new com.sun.xml.messaging.saaj.soap.MessageFactoryImpl());
+        assertEquals("action", received);
+    }
+    */
+    
+    protected static class SoapActionReceiver extends ComponentSupport implements MessageExchangeListener {
+        public String sentSoapAction;
+        public SoapActionReceiver() {
+            setService(new QName("receiver"));
+            setEndpoint("endpoint");
+        }
+        public void onMessageExchange(MessageExchange exchange) throws MessagingException {
+            if (exchange.getStatus() == ExchangeStatus.ACTIVE) {
+                NormalizedMessage msg = exchange.getMessage("in");
+                sentSoapAction = (String) msg.getProperty("SOAPAction");
+                NormalizedMessage out = exchange.createMessage();
+                out.setContent(msg.getContent());
+                answer(exchange, out);
+            }
+        }
+        
+    }
+    
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/saaj/SaajTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/saaj/SaajTest.java
new file mode 100644
index 0000000..a7fe4c9
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/saaj/SaajTest.java
@@ -0,0 +1,57 @@
+/*
+ * 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.servicemix.components.saaj;
+
+import javax.xml.namespace.QName;
+
+import org.w3c.dom.Node;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.tck.TestSupport;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+
+/**
+ * @version $Revision: 556864 $
+ */
+public class SaajTest extends TestSupport {
+    private static transient Log log = LogFactory.getLog(SaajTest.class);
+
+    protected String quote = "SUNW";
+
+    public void testCurrencyQuotes() throws Exception {
+        QName serviceName = new QName("http://servicemix.org/cheese/", "stockQuote");
+        String file = "request.xml";
+
+        Object answer = requestServiceWithFileRequest(serviceName, file);
+        assertTrue("Shoud return a DOM Node: " + answer, answer instanceof Node);
+        Node node = (Node) answer;
+        log.info(transformer.toString(node));
+
+        String text = textValueOfXPath(node, "//Result").trim();
+
+        log.info("Found price: " + text);
+
+        assertTrue("price text should not be empty", text.length() > 0);
+
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/saaj/example.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/script/GroovyTransformTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/script/GroovyTransformTest.java
new file mode 100644
index 0000000..f7412b1
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/script/GroovyTransformTest.java
@@ -0,0 +1,80 @@
+/*
+ * 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.servicemix.components.script;
+
+import java.util.List;
+
+import javax.jbi.component.Component;
+import javax.jbi.messaging.NormalizedMessage;
+
+import org.apache.servicemix.components.util.ComponentAdaptor;
+import org.apache.servicemix.jbi.framework.ComponentMBeanImpl;
+import org.apache.servicemix.tck.MessageList;
+import org.apache.servicemix.tck.Receiver;
+import org.apache.servicemix.tck.Sender;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class GroovyTransformTest extends org.apache.servicemix.tck.SpringTestSupport {
+
+    public void testSendingAndReceivingMessagesUsingSpring() throws Exception {
+        Sender sender = getSender();
+
+        sender.sendMessages(messageCount);
+
+        MessageList messageList = getReceivedMessageList();
+        messageList.assertMessagesReceived(messageCount);
+
+        // lets now look into the received messages
+        List list = messageList.getMessages();
+        NormalizedMessage message = (NormalizedMessage) list.get(0);
+        Object property = message.getProperty("foo");
+        assertEquals("Message 'foo' header", "hello", property);
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/script/groovy-transform.xml");
+    }
+
+    protected Sender getSender() {
+        Object cmp = getComponent("sender");
+        if (cmp instanceof ComponentAdaptor) {
+            cmp = ((ComponentAdaptor) cmp).getLifeCycle();
+        }
+        return (Sender) cmp;
+    }
+
+    protected Receiver getReceiver() {
+        Object cmp = getComponent("receiver");
+        if (cmp instanceof ComponentAdaptor) {
+            cmp = ((ComponentAdaptor) cmp).getLifeCycle();
+        }
+        return (Receiver) cmp;
+    }
+
+    protected MessageList getReceivedMessageList() {
+        return getReceiver().getMessageList();
+    }
+    
+    protected Component getComponent(String name) {
+        ComponentMBeanImpl lcc = jbi.getComponent(name);
+        return lcc != null ? lcc.getComponent() : null;
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/script/ScriptTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/script/ScriptTest.java
new file mode 100644
index 0000000..1eed514
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/script/ScriptTest.java
@@ -0,0 +1,58 @@
+/*
+ * 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.servicemix.components.script;
+
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.tck.Sender;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+
+/**
+ * @version $Revision: 556864 $
+ */
+public class ScriptTest extends org.apache.servicemix.tck.SpringTestSupport {
+    private static transient Log log = LogFactory.getLog(ScriptTest.class);
+
+    private static List result;
+
+    public static List getResult() {
+        return result;
+    }
+
+    public static void setResult(List result) {
+        ScriptTest.result = result;
+    }
+
+    public void testSendingAndReceivingMessagesUsingSpring() throws Exception {
+        Sender sender = (Sender) getBean("sender");
+        assertNotNull(sender);
+        ScriptComponent component = (ScriptComponent) getBean("receiver");
+        assertNotNull(component);
+        sender.sendMessages(1);
+
+        List result = getResult();
+        assertNotNull("Have not received any results from groovy!", result);
+        log.info("Found results: " + result);
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/script/spring-groovy.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/splitter/SplitterComponentTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/splitter/SplitterComponentTest.java
new file mode 100644
index 0000000..8932a35
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/splitter/SplitterComponentTest.java
@@ -0,0 +1,91 @@
+/*
+ * 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.servicemix.components.splitter;
+
+import javax.xml.namespace.QName;
+
+import junit.framework.TestCase;
+
+import org.apache.servicemix.jbi.container.ActivationSpec;
+import org.apache.servicemix.jbi.container.JBIContainer;
+import org.apache.servicemix.tck.ReceiverComponent;
+import org.apache.servicemix.tck.SenderComponent;
+
+public class SplitterComponentTest extends TestCase {
+	private JBIContainer jbiContainer;
+
+	protected SenderComponent sender;
+
+	protected ReceiverComponent receiver;
+
+	protected SplitterComponent fec;
+
+	protected void setUp() throws Exception {
+		jbiContainer = new JBIContainer();
+		jbiContainer.setUseMBeanServer(false);
+		jbiContainer.setCreateMBeanServer(false);
+		jbiContainer.setFlowName("seda");
+		jbiContainer.init();
+		jbiContainer.start();
+		setUpReceiver();
+		setUpSender();
+		setUpComponent();
+	}
+
+	protected QName getComponentService() {
+		return new QName("http://www.neogrid.com.br", "component");
+	}
+
+	private void setUpSender() throws Exception {
+		sender = new SenderComponent();
+		ActivationSpec as = new ActivationSpec(SenderComponent.ENDPOINT, sender);
+		as.setService(SenderComponent.SERVICE);
+		as.setDestinationService(getComponentService());
+		jbiContainer.activateComponent(as);
+	}
+
+	private void setUpReceiver() throws Exception {
+		receiver = new ReceiverComponent();
+		ActivationSpec as = new ActivationSpec(ReceiverComponent.ENDPOINT,
+				receiver);
+		as.setService(ReceiverComponent.SERVICE);
+		jbiContainer.activateComponent(as);
+	}
+
+	private void setUpComponent() throws Exception {
+		fec = new SplitterComponent();
+		fec.setNodePath("");
+		ActivationSpec as = new ActivationSpec("component", fec);
+		as.setService(getComponentService());
+		as.setDestinationService(ReceiverComponent.SERVICE);
+		jbiContainer.activateComponent(as);
+	}
+
+	public void testForEach() throws Exception {
+		fec.setNodePath("ROOT/DOC[@att = 2]");
+		sender
+				.setMessage("<ROOT><DOC att=\"1\"/><DOC att=\"2\"/><DOC att=\"2\"/></ROOT>");
+		sender.sendMessages(1);
+		Thread.sleep(1000);
+		assertEquals(2, receiver.getMessageList().getMessageCount());
+	}
+
+	protected void tearDown() throws Exception {
+		if (jbiContainer != null)
+			jbiContainer.shutDown();
+	}
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/validation/ValidationTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/validation/ValidationTest.java
new file mode 100644
index 0000000..91c8705
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/validation/ValidationTest.java
@@ -0,0 +1,113 @@
+/*
+ * 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.servicemix.components.validation;
+
+import javax.jbi.messaging.Fault;
+import javax.jbi.messaging.InOut;
+import javax.jbi.messaging.NormalizedMessage;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.client.ServiceMixClient;
+import org.apache.servicemix.jbi.container.SpringJBIContainer;
+import org.apache.servicemix.tck.Receiver;
+import org.apache.servicemix.tck.SpringTestSupport;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+
+/**
+ * @version $Revision: 556864 $
+ */
+public class ValidationTest extends SpringTestSupport {
+    private static transient Log log = LogFactory.getLog(ValidationTest.class);
+
+    protected ServiceMixClient client;
+    protected Receiver receiver;
+
+	protected void setUp() throws Exception {
+		super.setUp();
+        SpringJBIContainer jbi = (SpringJBIContainer) getBean("jbi");
+        receiver = (Receiver) jbi.getBean("receiver");
+    }
+
+    public void testValidMessage() throws Exception {
+    	client = (ServiceMixClient) getBean("defaultErrorHandlerClient");
+    	
+        InOut exchange = client.createInOutExchange();
+        exchange.getInMessage().setContent(getSourceFromClassPath("requestValid.xml"));
+        client.sendSync(exchange);
+
+        NormalizedMessage out = exchange.getOutMessage();
+        Fault fault = exchange.getFault();
+        Exception error = exchange.getError();
+
+        assertEquals("error", null, error);
+        assertEquals("fault", null, fault);
+
+        assertNotNull("Should have an out message", out);
+    }
+
+    public void testInvalidMessage() throws Exception {
+    	client = (ServiceMixClient) getBean("defaultErrorHandlerClient");
+
+    	InOut exchange = client.createInOutExchange();
+        exchange.getInMessage().setContent(getSourceFromClassPath("requestInvalid.xml"));
+        client.sendSync(exchange);
+
+        NormalizedMessage out = exchange.getOutMessage();
+        Fault fault = exchange.getFault();
+        Exception error = exchange.getError();
+
+        assertEquals("out", null, out);
+        assertNotNull("Should have a fault", fault);
+
+        log.info("error is: " + error);
+
+        log.info("Fault is...");
+        log.info(transformer.toString(fault.getContent()));
+
+        // TODO?
+        //assertEquals("error", null, error);
+    }
+
+    public void testInvalidMessageWithMessageAwareErrorHandler() throws Exception {
+    	client = (ServiceMixClient) getBean("messageAwareErrorHandlerClient");
+    	
+    	InOut exchange = client.createInOutExchange();
+        exchange.getInMessage().setContent(getSourceFromClassPath("requestInvalid.xml"));
+        client.sendSync(exchange);
+
+        NormalizedMessage out = exchange.getOutMessage();
+        Fault fault = exchange.getFault();
+        Exception error = exchange.getError();
+
+        assertEquals("out", null, out);
+        assertNotNull("Should have a fault", fault);
+
+        log.info("error is: " + error);
+
+        log.info("Fault is...");
+        log.info(transformer.toString(fault.getContent()));
+
+        // TODO?
+        //assertEquals("error", null, error);
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/validation/example.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/vfs/FileTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/vfs/FileTest.java
new file mode 100644
index 0000000..78fce48
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/vfs/FileTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.servicemix.components.vfs;
+
+import java.io.File;
+
+import org.apache.servicemix.jbi.util.FileUtil;
+import org.apache.servicemix.tck.TestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+
+import javax.xml.namespace.QName;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class FileTest extends TestSupport {
+
+    private static final String SYSTEM_OS_KEY = "os.name";
+    private static final String WINDOWS = "Windows";
+
+	protected void setUp() throws Exception {
+		super.setUp();
+		if (isWindowsOS()) {
+			FileUtil.deleteFile(new File("c:/tmp/servicemix/vfs/test"));
+		} else {
+			FileUtil.deleteFile(new File("/tmp/servicemix/vfs/test"));
+		}
+	}
+	
+    public void testSendMessagesToFileSystemThenPoollThem() throws Exception {
+        QName service = new QName("http://servicemix.org/cheese/", "fileSender");
+        assertSendAndReceiveMessages(service);
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext(getSystemSupportedXMLConfig());
+    }
+
+    protected String getSystemSupportedXMLConfig(){
+        if (isWindowsOS()) {
+            return "org/apache/servicemix/components/vfs/example_win.xml";
+        } else {
+            return "org/apache/servicemix/components/vfs/example.xml";
+        }
+    }
+    
+    protected boolean isWindowsOS() {
+        String os = System.getProperty(SYSTEM_OS_KEY);
+        boolean isWindows = false;
+        int index = (os==null?-1:os.indexOf(WINDOWS));
+        if(index > -1 ){
+            isWindows = true;
+        }
+        return isWindows;
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/wsif/SampleServiceMessageListener.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/wsif/SampleServiceMessageListener.java
new file mode 100644
index 0000000..7eabca6
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/wsif/SampleServiceMessageListener.java
@@ -0,0 +1,95 @@
+/*
+ * 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.servicemix.components.wsif;
+
+
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageListener;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.jms.core.JmsTemplate;
+import org.springframework.jms.core.MessageCreator;
+
+/**
+ * This is a simple MDB that processes a message containing an integer
+ * that represents a zip code, and returns a message containing a
+ * boolean indicating whether DSL service is available at that zip code
+ * or not.
+ * Internally the bean just returns true for zip codes < 50000 and
+ * false otherwise.
+ *
+ * @version $Revision: 556864 $
+ */
+public class SampleServiceMessageListener implements MessageListener, InitializingBean {
+    private static transient Log log = LogFactory.getLog(SampleServiceMessageListener.class);
+
+    private JmsTemplate template;
+
+    public JmsTemplate getTemplate() {
+        return template;
+    }
+
+    public void setTemplate(JmsTemplate template) {
+        this.template = template;
+    }
+
+    public void afterPropertiesSet() throws Exception {
+        if (template == null) {
+            throw new IllegalArgumentException("The template property is not set");
+        }
+    }
+
+    public void onMessage(Message msg) {
+        try {
+            TextMessage message = (TextMessage) msg;
+            // assume we have an integer
+            String text = message.getText();
+            log.info("Text: " + text);
+            int zipCode = new Integer(text).intValue();
+            // return true if zip code < 50000, false otherwise
+            if (zipCode < 50000) {
+                sendMessage(message, "true");
+            }
+            else {
+                sendMessage(message, "false");
+            }
+        }
+        catch (Exception e) {
+            // aargh - this should not happen usually
+            log.error(e.getMessage(), e);
+        }
+    }
+
+    public void sendMessage(final TextMessage requestMsg, final String serviceAvailable) throws JMSException {
+        template.send(requestMsg.getJMSReplyTo(), new MessageCreator() {
+            public Message createMessage(Session session) throws JMSException {
+                TextMessage message = session.createTextMessage();
+                // set the correlation ID
+                message.setJMSCorrelationID(requestMsg.getJMSMessageID());
+                // set the text
+                message.setText(serviceAvailable);
+                return message;
+            }
+        });
+    }
+}	
+
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/wsif/WsifTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/wsif/WsifTest.java
new file mode 100644
index 0000000..bef92d9
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/wsif/WsifTest.java
@@ -0,0 +1,113 @@
+/*
+ * 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.servicemix.components.wsif;
+
+import javax.jbi.messaging.InOut;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.namespace.QName;
+
+import org.w3c.dom.Node;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.tck.TestSupport;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+
+/**
+ * @version $Revision: 556864 $
+ */
+public class WsifTest extends TestSupport {
+    private static transient Log log = LogFactory.getLog(WsifTest.class);
+
+    QName serviceName = new QName("http://servicemix.org/cheese/", "checkAvailability");
+
+    public static final int MESSAGES = 2;
+    
+    public void testUsingXMLMessaging() throws Exception {
+        for (int i = 0; i < MESSAGES; i++) {
+            String file = "request.xml";
+    
+            Object answer = requestServiceWithFileRequest(serviceName, file);
+            assertTrue("Shoud return a DOM Node: " + answer, answer instanceof Node);
+            Node node = (Node) answer;
+            log.info(transformer.toString(node));
+    
+            String text = textValueOfXPath(node, "/*/*[local-name()='part']").trim();
+    
+            log.info("Found value: " + text);
+    
+            assertTrue("price text should not be empty", text.length() > 0);
+        }
+    }
+
+    public void testUsingWSIFStyleJBI() throws Exception {
+        for (int i = 0; i < MESSAGES; i++) {
+            // START SNIPPET: wsif
+            InOut exchange = client.createInOutExchange();
+    
+            exchange.getInMessage().setProperty("zipCode", "10505");
+            client.sendSync(exchange);
+    
+            NormalizedMessage out = exchange.getOutMessage();
+            String result = (String) out.getProperty("result");
+    
+            log.info("Found value: " + result);
+            // END SNIPPET: wsif
+    
+            assertEquals("should have no fault", null, exchange.getFault());
+            Exception error = exchange.getError();
+            if (error != null) {
+                throw error;
+            }
+            assertEquals("should have no error", null, error);
+            assertNotNull("must have an output message!", out);
+    
+            assertTrue("price text should not be empty", result.length() > 0);
+        }
+    }
+
+    public void testUsingWSIFStyleJBIWithEarlyErrorHandling() throws Exception {
+        for (int i = 0; i < MESSAGES; i++) {
+            InOut exchange = client.createInOutExchange();
+    
+            exchange.getInMessage().setProperty("zipCode", "10505");
+            client.sendSync(exchange);
+    
+            Exception error = exchange.getError();
+            if (error != null) {
+                throw error;
+            }
+    
+            assertEquals("should have no fault", null, exchange.getFault());
+            assertEquals("should have no error", null, error);
+    
+            NormalizedMessage out = exchange.getOutMessage();
+            assertNotNull("must have an output message!", out);
+    
+            String result = (String) out.getProperty("result");
+    
+            log.info("Found value: " + result);
+    
+            assertTrue("price text should not be empty", result.length() > 0);
+        }
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/wsif/example.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/xfire/Echo.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/xfire/Echo.java
new file mode 100644
index 0000000..9b39eb2
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/xfire/Echo.java
@@ -0,0 +1,31 @@
+/*
+ * 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.servicemix.components.xfire;
+
+public class Echo {
+    
+    private int count = 0;
+    
+    public String echo(String msg) {
+        count++;
+        return msg;
+    }
+
+    protected int getCount() {
+        return count;
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/xfire/OneWayService.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/xfire/OneWayService.java
new file mode 100644
index 0000000..8a37e75
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/xfire/OneWayService.java
@@ -0,0 +1,31 @@
+/*
+ * 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.servicemix.components.xfire;
+
+import org.apache.servicemix.tck.MessageList;
+
+import javax.jbi.messaging.MessagingException;
+
+public class OneWayService {
+
+    public MessageList messageList = new MessageList();
+    
+    public void receive(String msg) throws MessagingException {
+        messageList.addMessage(msg);
+    }
+
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/xfire/XFireBindingTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/xfire/XFireBindingTest.java
new file mode 100644
index 0000000..8db1fc6
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/xfire/XFireBindingTest.java
@@ -0,0 +1,49 @@
+/*
+ * 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.servicemix.components.xfire;
+
+import javax.xml.namespace.QName;
+
+import org.w3c.dom.Node;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.tck.TestSupport;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+
+public class XFireBindingTest extends TestSupport {
+    private static transient Log log = LogFactory.getLog(XFireBindingTest.class);
+
+    public void testSendingAndReceivingMessagesUsingSpring() throws Exception {
+        Object answer = requestServiceWithFileRequest(new QName("http://xfire.components.servicemix.org", "Echo"),
+                "/org/apache/servicemix/components/xfire/echo.xml");
+        assertTrue("Shoud return a DOM Node: " + answer, answer instanceof Node);
+        Node node = (Node) answer;
+        log.info(transformer.toString(node));
+        
+        Echo echo = (Echo) context.getBean("xfireReceiverService");
+        assertEquals(1, echo.getCount());
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext(new String[] {
+                "/org/apache/servicemix/components/xfire/xfire-inout.xml",
+                "/org/codehaus/xfire/spring/xfire.xml"
+        });
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/xfire/XFireOutBindingTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/xfire/XFireOutBindingTest.java
new file mode 100644
index 0000000..6771238
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/xfire/XFireOutBindingTest.java
@@ -0,0 +1,58 @@
+/*
+ * 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.servicemix.components.xfire;
+
+import javax.jbi.JBIException;
+import javax.xml.namespace.QName;
+import javax.xml.transform.Source;
+
+import org.apache.servicemix.jbi.resolver.ServiceNameEndpointResolver;
+import org.apache.servicemix.tck.TestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+
+public class XFireOutBindingTest extends TestSupport {
+    private OneWayService receiverService;
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        
+        receiverService = (OneWayService) getBean("xfireReceiverService");
+    }
+    
+    public void testSendingAndReceivingMessagesUsingSpring() throws Exception {
+        sendFile(new QName("http://xfire.components.servicemix.org", "OneWayService"),
+                "/org/apache/servicemix/components/xfire/oneway.xml"); 
+
+        receiverService.messageList.assertMessagesReceived(1);
+    }
+
+    protected void sendFile(QName serviceName, String fileOnClassPath) throws JBIException {
+        Source content = getSourceFromClassPath(fileOnClassPath);
+
+        ServiceNameEndpointResolver resolver = new ServiceNameEndpointResolver(serviceName);
+
+        client.send(resolver, null, null, content);
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext(new String[] {
+                "/org/apache/servicemix/components/xfire/xfire-out.xml",
+                "/org/codehaus/xfire/spring/xfire.xml"
+        });
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/xslt/OptionalAxisQueriesTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/xslt/OptionalAxisQueriesTest.java
new file mode 100644
index 0000000..2ae7924
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/xslt/OptionalAxisQueriesTest.java
@@ -0,0 +1,77 @@
+/*
+ * 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.servicemix.components.xslt;
+
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+import org.apache.servicemix.tck.TestSupport;
+import org.apache.servicemix.tck.MessageList;
+
+import javax.xml.namespace.QName;
+
+
+public class OptionalAxisQueriesTest extends TestSupport {
+
+    public void testOptionalAxisQuery() throws Exception {
+        QName service = new QName("http://servicemix.org/cheese/", "transformer");
+
+       String message = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
+               "    <prod:resolveItemXrefResponse " +
+               "           xmlns:prod=\"http://foo.org/prod\" " +
+               "           xmlns:xsi=\"http://foo.org/msi\"" +
+               "           xmlns:ms=\"http://foo.org/ms\">" +
+               "      <prod:response xsi:type=\"wn4:HashMap\">" +
+               "        <ms:Keys>" +
+               "          <ms:Item xsi:type=\"d:string\">DESCR</ms:Item>" +
+               "          <ms:Item xsi:type=\"d:string\">LIST</ms:Item>" +
+               "          <ms:Item xsi:type=\"d:string\">XREF</ms:Item>" +
+               "          <ms:Item xsi:type=\"d:string\">MSTR</ms:Item>" +
+               "        </ms:Keys>" +
+               "        <ms:Values>" +
+               "          <ms:Item xsi:type=\"d:string\">PPR,CPY,20#,84B,LGL,WE</ms:Item>" +
+               "          <ms:Item xsi:type=\"d:double\">17.25</ms:Item>" +
+               "          <ms:Item xsi:type=\"d:string\">EXP8514</ms:Item>" +
+               "          <ms:Item xsi:type=\"d:string\">10040300</ms:Item>" +
+               "        </ms:Values>" +
+               "      </prod:response>" +
+               "    </prod:resolveItemXrefResponse>";
+
+        // send a custom xml message
+        sendMessages(service, 1, message);
+        assertMessagesReceived(1);
+
+        MessageList messageList1 = assertMessagesReceived("service1", 1);
+        MessageList messageList2 = assertMessagesReceived("service2", 1);
+        MessageList messageList3 = assertMessagesReceived("service3", 1);
+        MessageList messageList4 = assertMessagesReceived("service4", 1);
+        MessageList messageList5 = assertMessagesReceived("service5", 1);
+        MessageList messageList6 = assertMessagesReceived("service6", 1);
+
+        assertMessageHeader(messageList1, 0, "foo", "PPR,CPY,20#,84B,LGL,WE");
+        assertMessageHeader(messageList2, 0, "foo", "17.25");
+        assertMessageHeader(messageList3, 0, "foo", "EXP8514");
+        assertMessageHeader(messageList4, 0, "foo", "10040300");
+        assertMessageHeader(messageList5, 0, "foo", new Integer(4));
+        assertMessageHeader(messageList6, 0, "foo", "PPR,CPY,20#,84B,LGL,WE");
+
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/xslt/optional-axis-example.xml");
+    }
+
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/xslt/TransformComponentTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/xslt/TransformComponentTest.java
new file mode 100644
index 0000000..88013cb
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/xslt/TransformComponentTest.java
@@ -0,0 +1,39 @@
+/*
+ * 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.servicemix.components.xslt;
+
+import org.apache.servicemix.tck.TestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+
+import javax.xml.namespace.QName;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class TransformComponentTest extends TestSupport {
+
+    public void testSendMessagesToJmsThenReceiveItTransformItThenRepublishAndReceive() throws Exception {
+        QName service = new QName("http://servicemix.org/cheese/", "myJmsSender");
+
+        assertSendAndReceiveMessages(service);
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/xslt/example.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/xslt/XsltParameterTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/xslt/XsltParameterTest.java
new file mode 100644
index 0000000..36fe1fb
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/xslt/XsltParameterTest.java
@@ -0,0 +1,62 @@
+/*

+ * 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.servicemix.components.xslt;

+

+import javax.jbi.messaging.InOut;

+import javax.jbi.messaging.NormalizedMessage;

+import javax.xml.namespace.QName;

+import javax.xml.transform.Source;

+

+import org.apache.servicemix.jbi.jaxp.StringSource;

+import org.apache.servicemix.tck.TestSupport;

+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;

+import org.springframework.context.support.AbstractXmlApplicationContext;

+import org.w3c.dom.Node;

+

+/**

+ * @author rbuckland

+ * @version $Revision$

+ */

+public class XsltParameterTest extends TestSupport {

+

+    public void testSendMessagesToJmsThenReceiveItTransformItThenRepublishAndReceive() throws Exception {

+       QName service = new QName("http://servicemix.org/cheese/", "transformer");

+

+        InOut exchange = client.createInOutExchange();

+        exchange.setService(service);

+

+        NormalizedMessage message = exchange.getInMessage();

+        message.setContent(new StringSource(createMessageXmlText(777888)));

+        client.sendSync(exchange);

+

+        NormalizedMessage outMessage = exchange.getOutMessage();

+

+        Source content = outMessage.getContent();

+        Node node = transformer.toDOMNode(content);

+

+        String value = textValueOfXPath(node, "//param");

+        String integer = textValueOfXPath(node, "//integer");

+

+        assertTrue(value.equals("cheeseyCheese"));

+        assertTrue(integer.equals("4002"));

+

+    }

+

+    protected AbstractXmlApplicationContext createBeanFactory() {

+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/xslt/servicemix-parameter-test.xml");

+    }

+}

diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/xslt/XsltPublisherTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/xslt/XsltPublisherTest.java
new file mode 100644
index 0000000..a218695
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/xslt/XsltPublisherTest.java
@@ -0,0 +1,58 @@
+/*
+ * 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.servicemix.components.xslt;
+
+import org.apache.servicemix.tck.MessageList;
+import org.apache.servicemix.tck.TestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+
+import javax.xml.namespace.QName;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class XsltPublisherTest extends TestSupport {
+
+    public void testUseXsltAsRouter() throws Exception {
+        QName service = new QName("http://servicemix.org/cheese/", "transformer");
+
+        sendMessages(service, 20);
+        assertMessagesReceived(20);
+
+        MessageList messageList1 = assertMessagesReceived("service1", 20);
+        MessageList messageList2 = assertMessagesReceived("service2", 20);
+        MessageList messageList3 = assertMessagesReceived("service3", 20);
+
+        assertMessageHeader(messageList1, 0, "foo", "hello world!");
+        assertMessageHeader(messageList1, 1, "foo", "hello world!");
+        assertMessageHeader(messageList1, 19, "foo", "hello world!");
+
+        assertMessageHeader(messageList2, 0, "bar", "1");
+        assertMessageHeader(messageList2, 1, "bar", "2");
+
+        assertMessageHeader(messageList3, 0, "bar", "1");
+        assertMessageHeader(messageList3, 1, "bar", "2");
+        assertMessageHeader(messageList3, 0, "foo", "hello world!");
+        assertMessageHeader(messageList3, 1, "foo", "hello world!");
+        assertMessageHeader(messageList3, 19, "foo", "hello world!");
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/xslt/publish.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/xslt/XsltRouterTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/xslt/XsltRouterTest.java
new file mode 100644
index 0000000..00876cb
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/xslt/XsltRouterTest.java
@@ -0,0 +1,40 @@
+/*
+ * 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.servicemix.components.xslt;
+
+import org.apache.servicemix.tck.TestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+
+import javax.xml.namespace.QName;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class XsltRouterTest extends TestSupport {
+
+    public void testUseXsltAsRouter() throws Exception {
+        QName service = new QName("http://servicemix.org/cheese/", "transformer");
+
+        sendMessages(service, 20);
+        assertMessagesReceived(17);
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/xslt/router-example.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/java/org/apache/servicemix/components/xslt/XsltSplitTest.java b/common/servicemix-components/src/test/java/org/apache/servicemix/components/xslt/XsltSplitTest.java
new file mode 100644
index 0000000..1abbe8c
--- /dev/null
+++ b/common/servicemix-components/src/test/java/org/apache/servicemix/components/xslt/XsltSplitTest.java
@@ -0,0 +1,65 @@
+/*
+ * 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.servicemix.components.xslt;
+
+import org.apache.servicemix.tck.MessageList;
+import org.apache.servicemix.tck.TestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
+
+import javax.xml.namespace.QName;
+import java.util.Date;
+
+/**
+ * @version $Revision: 426415 $
+ */
+public class XsltSplitTest extends TestSupport {
+
+    public void testUseXsltAsRouter() throws Exception {
+        QName service = new QName("http://servicemix.org/cheese/", "transformer");
+
+        sendMessages(service, 20);
+        assertMessagesReceived(20);
+
+        MessageList messageList1 = assertMessagesReceived("service1", 20);
+        MessageList messageList2 = assertMessagesReceived("service2", 20);
+        MessageList messageList3 = assertMessagesReceived("service3", 40);
+
+        assertMessageXPath(messageList1, 0, "/cheese", "Edam");
+        assertMessageXPath(messageList1, 1, "/cheese", "Edam");
+        assertMessageXPath(messageList1, 19, "/cheese", "Edam");
+        assertMessageXPath(messageList1, 0, "/cheese/@id", "1");
+        assertMessageXPath(messageList1, 1, "/cheese/@id", "2");
+
+        assertMessageXPath(messageList2, 0, "/beer", "Stella");
+        assertMessageXPath(messageList2, 19, "/beer", "Stella");
+
+        assertMessageXPath(messageList3, 0, "/lineitem", "Beer");
+        assertMessageXPath(messageList3, 1, "/lineitem", "Food");
+        assertMessageXPath(messageList3, 38, "/lineitem", "Beer");
+        assertMessageXPath(messageList3, 39, "/lineitem", "Food");
+    }
+
+    protected String createMessageXmlText(int index) {
+        return "<foo id='" + index + "' sent='" + new Date() + "'>"
+            + "<cheese>Edam</cheese><beer>Stella</beer><lineitem>Beer</lineitem><lineitem>Food</lineitem></foo>";
+    }
+
+    protected AbstractXmlApplicationContext createBeanFactory() {
+        return new ClassPathXmlApplicationContext("org/apache/servicemix/components/xslt/split.xml");
+    }
+}
diff --git a/common/servicemix-components/src/test/resources/broker.xml b/common/servicemix-components/src/test/resources/broker.xml
new file mode 100644
index 0000000..dcd840f
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/broker.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans>
+
+  <broker persistent="false" xmlns="http://activemq.apache.org/schema/core">
+
+    <transportConnectors>
+      <transportConnector uri="tcp://localhost:61626" />
+    </transportConnectors>
+
+  </broker>
+
+</beans>
diff --git a/common/servicemix-components/src/test/resources/jndi.properties b/common/servicemix-components/src/test/resources/jndi.properties
new file mode 100644
index 0000000..e92089f
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/jndi.properties
@@ -0,0 +1,23 @@
+#
+#    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.
+#
+
+# START SNIPPET: jndi
+
+java.naming.factory.initial = org.apache.xbean.spring.jndi.SpringInitialContextFactory
+java.naming.provider.url = jndi.xml
+
+# END SNIPPET: jndi
diff --git a/common/servicemix-components/src/test/resources/jndi.xml b/common/servicemix-components/src/test/resources/jndi.xml
new file mode 100644
index 0000000..1edfbbd
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/jndi.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<!--

+

+    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.

+

+-->

+<beans>

+  <bean id="jndi" 

+        class="org.apache.xbean.spring.jndi.SpringInitialContextFactory" 

+        factory-method="makeInitialContext"

+        singleton="true">

+    <property name="entries">

+      <map>

+      </map>

+    </property>

+  </bean>

+</beans>    

diff --git a/common/servicemix-components/src/test/resources/log4j-tests.properties b/common/servicemix-components/src/test/resources/log4j-tests.properties
new file mode 100644
index 0000000..08847de
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/log4j-tests.properties
@@ -0,0 +1,38 @@
+#
+#    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.
+#
+
+#
+# The logging properties used during tests..
+#
+log4j.rootLogger=DEBUG, out
+
+log4j.logger.org.apache.activemq=INFO
+log4j.logger.org.apache.activemq.spring=WARN
+log4j.logger.org.apache.activemq.store.journal=INFO
+log4j.logger.org.activeio.journal=INFO
+
+# CONSOLE appender not used by default
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
+
+# File appender
+log4j.appender.out=org.apache.log4j.FileAppender
+log4j.appender.out.layout=org.apache.log4j.PatternLayout
+log4j.appender.out.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
+log4j.appender.out.file=target/servicemix-test.log
+log4j.appender.out.append=true
diff --git a/common/servicemix-components/src/test/resources/log4j.properties b/common/servicemix-components/src/test/resources/log4j.properties
new file mode 100644
index 0000000..c052902
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/log4j.properties
@@ -0,0 +1,39 @@
+#
+#    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.
+#
+
+#
+# The logging properties used during tests..
+#
+log4j.rootLogger=DEBUG, stdout
+
+log4j.logger.org.springframework=INFO
+log4j.logger.org.apache.activemq=INFO
+log4j.logger.org.apache.activemq.spring=WARN
+log4j.logger.org.apache.activemq.store.journal=INFO
+log4j.logger.org.activeio.journal=INFO
+
+# CONSOLE appender not used by default
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
+
+# File appender
+log4j.appender.out=org.apache.log4j.FileAppender
+log4j.appender.out.layout=org.apache.log4j.PatternLayout
+log4j.appender.out.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
+log4j.appender.out.file=target/servicemix-test.log
+log4j.appender.out.append=true
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/cache/example.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/cache/example.xml
new file mode 100644
index 0000000..ab2fd9c
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/cache/example.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- the JBI container -->
+  <container id="jbi" xmlns="http://servicemix.apache.org/config/1.0" embedded="true">
+    <activationSpecs>
+
+      <!-- START SNIPPET: cache -->
+      <activationSpec componentName="myService" service="foo:myService" destinationService="foo:myServiceImpl">
+      	<component><bean xmlns="" class="org.apache.servicemix.components.cache.CacheComponent">
+        <!-- we could use a JCache here if we want -->
+        <property name="cache">
+          <bean class="org.apache.servicemix.components.cache.LRUCache">
+            <constructor-arg value="100"/>
+          </bean>
+        </property>
+
+        <!-- lets define the cache key expression -->
+        <property name="keyExpression">
+          <bean class="org.apache.servicemix.expression.JaxenStringXPathExpression">
+            <constructor-arg value="/*/@id"/>
+          </bean>
+        </property></bean>
+      </component></activationSpec>
+      <!-- END SNIPPET: cache -->
+
+      <!-- START SNIPPET: groovy -->
+      <activationSpec componentName="myServiceImpl" service="foo:myServiceImpl">
+      <component>
+       <bean xmlns="" class="org.apache.servicemix.components.groovy.GroovyComponent">
+        <property name="scriptText">
+          <value>
+            <![CDATA[
+if (bindings.counter == null) {
+    bindings.counter = 1
+}
+else {
+    ++bindings.counter
+}
+
+def date = new Date()
+
+outMessage.bodyText = "<response counter='$bindings.counter' date='$date'></response>"
+            ]]>
+          </value>
+        </property>
+      </bean></component></activationSpec>
+      <!-- END SNIPPET: groovy -->
+
+    </activationSpecs>
+  </container>
+
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/drools/example.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/drools/example.xml
new file mode 100644
index 0000000..102fbe7
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/drools/example.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+
+      <!-- START SNIPPET: drools -->
+      <sm:activationSpec componentName="droolsRouter" 
+      					 service="foo:droolsRouter">
+      	<sm:component><bean class="org.apache.servicemix.components.drools.DroolsComponent">
+        	<property name="ruleBaseResource" value="classpath:org/apache/servicemix/components/drools/rulebase.xml" />
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: drools -->
+
+      <sm:activationSpec componentName="receiver" service="foo:receiver">
+      	<sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component> 
+      </sm:activationSpec>
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/drools/jbi-example-forward.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/drools/jbi-example-forward.xml
new file mode 100644
index 0000000..597325d
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/drools/jbi-example-forward.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+
+      <!-- START SNIPPET: drools -->
+      <sm:activationSpec componentName="droolsRouter" 
+      					 service="foo:droolsRouter">
+      	<sm:component><bean class="org.apache.servicemix.components.drools.DroolsComponent">
+          <property name="ruleBaseResource" value="classpath:org/apache/servicemix/components/drools/jbi-rules-forward.xml" />
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: drools -->
+
+      <sm:activationSpec componentName="receiver" 
+      					 service="foo:receiver">
+      	<sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+      </sm:activationSpec>
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/drools/jbi-example-route.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/drools/jbi-example-route.xml
new file mode 100644
index 0000000..9892172
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/drools/jbi-example-route.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+
+      <!-- START SNIPPET: drools -->
+      <sm:activationSpec componentName="droolsRouter" 
+      					 service="foo:droolsRouter">
+      	<sm:component><bean class="org.apache.servicemix.components.drools.DroolsComponent">
+          <property name="ruleBaseResource" value="classpath:org/apache/servicemix/components/drools/jbi-rules-route.xml" />
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: drools -->
+
+      <sm:activationSpec componentName="target1" 
+      					 service="foo:target1">
+      	<sm:component>
+      	  <bean class="org.apache.servicemix.components.util.MockServiceComponent">
+      	     <property name="responseXml" value="&lt;hello/&gt;" />
+      	  </bean>
+      	</sm:component>
+      </sm:activationSpec>
+
+      <sm:activationSpec componentName="target2" 
+      					 service="foo:target2">
+      	<sm:component>
+      	  <bean class="org.apache.servicemix.components.util.MockServiceComponent">
+      	     <property name="responseXml" value="&lt;world/&gt;" />
+      	  </bean>
+      	</sm:component>
+      </sm:activationSpec>
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/drools/jbi-example.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/drools/jbi-example.xml
new file mode 100644
index 0000000..c75ddc2
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/drools/jbi-example.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+
+      <!-- START SNIPPET: drools -->
+      <sm:activationSpec componentName="droolsRouter" 
+      					 service="foo:droolsRouter">
+      	<sm:component><bean class="org.apache.servicemix.components.drools.DroolsComponent">
+          <property name="ruleBaseResource" value="classpath:org/apache/servicemix/components/drools/jbi-rules.xml" />
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: drools -->
+
+      <sm:activationSpec componentName="receiver" 
+      					 service="foo:receiver">
+      	<sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+      </sm:activationSpec>
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/drools/jbi-rules-forward.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/drools/jbi-rules-forward.xml
new file mode 100644
index 0000000..0040618
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/drools/jbi-rules-forward.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<!-- START SNIPPET: drools -->
+<rule-set name="cheese rules"
+  xmlns="http://drools.org/rules"
+  xmlns:jbi="http://drools.org/semantics/servicemix"
+  xmlns:foo="http://servicemix.org/cheese/">
+
+  <application-data identifier="jbi">org.apache.servicemix.components.drools.JbiHelper</application-data>
+  <application-data identifier="context">javax.jbi.component.ComponentContext</application-data>
+  <application-data identifier="deliveryChannel">javax.jbi.messaging.DeliveryChannel</application-data>
+
+  <rule name="Ignore 2 message">
+    <parameter identifier="exchange">
+      <class>javax.jbi.messaging.MessageExchange</class>
+    </parameter>
+
+    <jbi:condition>/*/@id != 2</jbi:condition>
+    <jbi:forward service="foo:receiver,foo:receiver"/>
+  </rule>
+
+</rule-set>
+<!-- END SNIPPET: drools -->
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/drools/jbi-rules-route.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/drools/jbi-rules-route.xml
new file mode 100644
index 0000000..326df2a
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/drools/jbi-rules-route.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<!-- START SNIPPET: drools -->
+<rule-set name="cheese rules"
+  xmlns="http://drools.org/rules"
+  xmlns:jbi="http://drools.org/semantics/servicemix"
+  xmlns:foo="http://servicemix.org/cheese/">
+
+  <application-data identifier="jbi">org.apache.servicemix.components.drools.JbiHelper</application-data>
+  <application-data identifier="context">javax.jbi.component.ComponentContext</application-data>
+  <application-data identifier="deliveryChannel">javax.jbi.messaging.DeliveryChannel</application-data>
+
+  <rule name="Ignore 2 message">
+    <parameter identifier="exchange">
+      <class>javax.jbi.messaging.MessageExchange</class>
+    </parameter>
+
+    <jbi:condition>/*/@id != 2</jbi:condition>
+    <jbi:route service="foo:target1"/>
+  </rule>
+
+  <rule name="Default">
+    <parameter identifier="exchange">
+      <class>javax.jbi.messaging.MessageExchange</class>
+    </parameter>
+    <jbi:condition>/*/@id = 2</jbi:condition>
+    <jbi:route service="foo:target2"/>
+  </rule>
+
+</rule-set>
+<!-- END SNIPPET: drools -->
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/drools/jbi-rules.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/drools/jbi-rules.xml
new file mode 100644
index 0000000..aabad2d
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/drools/jbi-rules.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<!-- START SNIPPET: drools -->
+<rule-set name="cheese rules"
+  xmlns="http://drools.org/rules"
+  xmlns:jbi="http://drools.org/semantics/servicemix"
+  xmlns:foo="http://servicemix.org/cheese/">
+
+  <application-data identifier="jbi">org.apache.servicemix.components.drools.JbiHelper</application-data>
+  <application-data identifier="context">javax.jbi.component.ComponentContext</application-data>
+  <application-data identifier="deliveryChannel">javax.jbi.messaging.DeliveryChannel</application-data>
+
+  <rule name="Ignore 2 message">
+    <parameter identifier="exchange">
+      <class>javax.jbi.messaging.MessageExchange</class>
+    </parameter>
+
+    <jbi:condition>/*/@id != 2</jbi:condition>
+    <jbi:invoke service="foo:receiver"/>
+  </rule>
+
+</rule-set>
+<!-- END SNIPPET: drools -->
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/drools/rulebase.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/drools/rulebase.xml
new file mode 100644
index 0000000..e4470a8
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/drools/rulebase.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<!-- START SNIPPET: drools -->
+<rule-set name="cheese rules"
+  xmlns="http://drools.org/rules"
+  xmlns:java="http://drools.org/semantics/java">
+
+  <application-data identifier="jbi">org.apache.servicemix.components.drools.JbiHelper</application-data>
+  <application-data identifier="context">javax.jbi.component.ComponentContext</application-data>
+  <application-data identifier="deliveryChannel">javax.jbi.messaging.DeliveryChannel</application-data>
+
+  <rule name="Ignore 2 message">
+
+    <parameter identifier="exchange">
+      <class>javax.jbi.messaging.MessageExchange</class>
+    </parameter>
+    <java:condition>"2".equals(exchange.getMessage("in").getProperty("idText")) == false</java:condition>
+    <java:consequence>
+        // lets try send a message
+        jbi.forwardToService("http://servicemix.org/cheese/", "receiver");
+    </java:consequence>
+  </rule>
+
+</rule-set>
+<!-- END SNIPPET: drools -->
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/email/example.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/email/example.xml
new file mode 100644
index 0000000..da66c22
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/email/example.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+
+      <!-- START SNIPPET: mime -->
+      <sm:activationSpec componentName="mimeSender" service="foo:mimeSender">
+        <sm:component><bean class="org.apache.servicemix.components.email.MimeMailSender">
+          <property name="sender">
+            <bean class="org.springframework.mail.javamail.JavaMailSenderImpl">
+              <property name="host" value="localhost"/>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: mime -->
+
+      <!-- START SNIPPET: simple -->
+      <sm:activationSpec componentName="emailSender" service="foo:emailSender">
+        <sm:component><bean class="org.apache.servicemix.components.email.SimpleMailSender">
+          <property name="sender" ref="cosMailSender"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: simple -->
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+    <constructor-arg>
+      <!-- lets hardwire this client to talk to instances of a service by default -->
+      <sm:activationSpec destinationService="foo:emailSender"/>
+    </constructor-arg>
+  </bean>
+
+  <!-- TODO lets try with COS -->
+  <bean id="cosMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
+    <property name="host" value="localhost"/>
+  </bean>
+
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/email/mimeMail.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/email/mimeMail.xml
new file mode 100644
index 0000000..deb3b33
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/email/mimeMail.xml
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0"
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+
+      <!-- START SNIPPET: expr -->
+      <sm:activationSpec componentName="emailSender" service="foo:emailSender">
+        <sm:component><bean class="org.apache.servicemix.components.email.MimeMailSender">
+          <property name="sender" ref="javaMailSender"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: expr -->
+
+      <!-- START SNIPPET: simpleExpr -->
+      <sm:activationSpec componentName="emailSenderWithExpressions" service="foo:emailSenderWithExpressions">
+        <sm:component><bean class="org.apache.servicemix.components.email.MimeMailSender">
+          <property name="sender" ref="javaMailSender"/>
+
+          <property name="marshaler">
+            <bean class="org.apache.servicemix.components.email.MimeMailMarshaler">
+              <property name="from">
+                <bean class="org.apache.servicemix.expression.JaxenStringXPathExpression">
+                  <constructor-arg value="/person/email"/>
+                </bean>
+              </property>
+              <property name="to">
+                <bean class="org.apache.servicemix.expression.JaxenStringXPathExpression">
+                  <constructor-arg value="/person/accountant/email"/>
+                </bean>
+              </property>
+              <property name="subject">
+                <bean class="org.apache.servicemix.expression.JaxenStringXPathExpression">
+                  <constructor-arg value="concat('Drink a beer ', /person/name)"/>
+                </bean>
+              </property>
+              <property name="text">
+                <bean class="org.apache.servicemix.expression.JaxenStringXPathExpression">
+                  <constructor-arg value="concat('Hello there ', /person/name, ' how are you today?')"/>
+                </bean>
+              </property>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+
+      <sm:activationSpec componentName="emailSenderWithExpressionsAndAttachment" service="foo:emailSenderWithExpressionsAndAttachment">
+        <sm:component><bean class="org.apache.servicemix.components.email.MimeMailSender">
+          <property name="sender" ref="javaMailSender"/>
+
+          <property name="marshaler">
+            <bean class="org.apache.servicemix.components.email.MimeMailMarshaler">
+              <property name="from">
+                <bean class="org.apache.servicemix.expression.JaxenStringXPathExpression">
+                  <constructor-arg value="/person/email"/>
+                </bean>
+              </property>
+              <property name="to">
+                <bean class="org.apache.servicemix.expression.JaxenStringXPathExpression">
+                  <constructor-arg value="/person/accountant/email"/>
+                </bean>
+              </property>
+              <property name="subject">
+                <bean class="org.apache.servicemix.expression.JaxenStringXPathExpression">
+                  <constructor-arg value="concat('Drink a beer ', /person/name)"/>
+                </bean>
+              </property>
+              <property name="text">
+                <bean class="org.apache.servicemix.expression.JaxenStringXPathExpression">
+                  <constructor-arg value="concat('Hello there ', /person/name, ' how are you today?')"/>
+                </bean>
+              </property>
+              <property name="attachments">
+                <bean class="org.apache.servicemix.expression.JaxenStringXPathExpression">
+                  <constructor-arg value="/person/attachments"/>
+                </bean>
+              </property>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: simpleExpr -->
+
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+    <constructor-arg>
+      <!-- lets hardwire this client to talk to instances of a service by default -->
+      <sm:activationSpec destinationService="foo:emailSender"/>
+    </constructor-arg>
+  </bean>
+
+  <!-- a testing mail sender -->
+  <bean id="javaMailSender" class="org.apache.servicemix.components.email.StubJavaMailSender"/>
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/email/request.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/email/request.xml
new file mode 100644
index 0000000..74195d2
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/email/request.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<person>
+  <name>James</name>
+  <email>james@nowhere.com</email>
+  <accountant>
+    <email>foo@bar.com</email>
+  </accountant>
+  <attachments>example.xml</attachments>
+</person>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/email/simpleMail.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/email/simpleMail.xml
new file mode 100644
index 0000000..e80715b
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/email/simpleMail.xml
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+
+      <!-- START SNIPPET: xpath -->
+      <sm:activationSpec componentName="simpleMailSenderWithExpressions" service="foo:simpleMailSenderWithExpressions">
+        <sm:component><bean class="org.apache.servicemix.components.email.SimpleMailSender">
+          <property name="sender" ref="javaMailSender"/>
+
+          <property name="marshaler">
+            <bean class="org.apache.servicemix.components.email.SimpleMailMarshaler">
+              <property name="from">
+                <bean class="org.apache.servicemix.expression.JaxenStringXPathExpression">
+                  <constructor-arg value="/person/email"/>
+                </bean>
+              </property>
+              <property name="to">
+                <bean class="org.apache.servicemix.expression.JaxenStringXPathExpression">
+                  <constructor-arg value="/person/accountant/email"/>
+                </bean>
+              </property>
+              <property name="subject">
+                <bean class="org.apache.servicemix.expression.ConstantExpression">
+                  <constructor-arg value="Drink a beer"/>
+                </bean>
+              </property>
+              <property name="text">
+                <bean class="org.apache.servicemix.expression.JaxenStringXPathExpression">
+                  <constructor-arg value="concat('Hello there ', /person/name, ' how are you today?')"/>
+                </bean>
+              </property>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: xpath -->
+
+      <!-- START SNIPPET: simpleExpr -->
+      <sm:activationSpec componentName="simpleMailSenderWithPropertyExpressions" service="foo:simpleMailSenderWithPropertyExpressions">
+        <sm:component><bean class="org.apache.servicemix.components.email.SimpleMailSender">
+          <property name="sender" ref="javaMailSender"/>
+
+          <property name="marshaler">
+            <bean class="org.apache.servicemix.components.email.SimpleMailMarshaler">
+              <property name="from">
+                <bean class="org.apache.servicemix.expression.PropertyExpression">
+                  <constructor-arg value="from"/>
+                </bean>
+              </property>
+              <property name="to">
+                <bean class="org.apache.servicemix.expression.PropertyExpression">
+                  <constructor-arg value="to"/>
+                </bean>
+              </property>
+              <property name="subject">
+                <bean class="org.apache.servicemix.expression.ConstantExpression">
+                  <constructor-arg value="Subject came from expression"/>
+                </bean>
+              </property>
+              <property name="text">
+                <bean class="org.apache.servicemix.expression.PropertyExpression">
+                  <constructor-arg value="text"/>
+                </bean>
+              </property>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: simpleExpr -->
+
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+
+  <!-- a testing mail sender -->
+  <bean id="javaMailSender" class="org.apache.servicemix.components.email.StubJavaMailSender"/>
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/file/binary-example.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/file/binary-example.xml
new file mode 100644
index 0000000..1ac2ad5
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/file/binary-example.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+
+      <!-- START SNIPPET: poll -->
+      <sm:activationSpec componentName="filePoller" service="foo:filePoller" destinationService="foo:fileSender">
+        <sm:component><bean class="org.apache.servicemix.components.file.FilePoller">
+          <property name="file" value="target/test-data/in"/>
+          <property name="period" value="100"/>
+          <property name="marshaler">
+            <bean class="org.apache.servicemix.components.util.BinaryFileMarshaler" />
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: poll -->
+
+      <!-- START SNIPPET: send -->
+      <sm:activationSpec componentName="fileSender" service="foo:fileSender">
+        <sm:component><bean class="org.apache.servicemix.components.file.FileWriter">
+          <property name="directory" value="target/test-data/out"/>
+          <property name="marshaler">
+            <bean class="org.apache.servicemix.components.util.BinaryFileMarshaler" />
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: send -->
+
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/file/example.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/file/example.xml
new file mode 100644
index 0000000..68e65cb
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/file/example.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+
+      <!-- START SNIPPET: send -->
+      <sm:activationSpec componentName="fileSender" service="foo:fileSender">
+        <sm:component><bean class="org.apache.servicemix.components.file.FileWriter">
+          <property name="directory" value="target/test-data/file"/>
+
+          <property name="marshaler">
+            <bean class="org.apache.servicemix.components.util.DefaultFileMarshaler">
+              <property name="fileName">
+                <bean class="org.apache.servicemix.expression.JaxenStringXPathExpression">
+                  <constructor-arg value="concat('sample_', /sample/@id, '.xml')"/>
+                </bean>
+              </property>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: send -->
+
+
+
+      <!-- START SNIPPET: poll -->
+      <sm:activationSpec componentName="filePoller" service="foo:filePoller" destinationService="foo:receiver">
+        <sm:component><bean class="org.apache.servicemix.components.file.FilePoller">
+          <property name="workManager" ref="workManager"/>
+          <property name="file" value="target/test-data/file"/>
+          <!--
+          <property name="delete" value="false"/>
+          -->
+          <property name="period" value="1000"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: poll -->
+
+      <sm:activationSpec componentName="receiver" service="foo:receiver">
+        <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+      </sm:activationSpec>
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+
+  <bean id="workManager" class="org.jencks.factory.WorkManagerFactoryBean"/>
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/groovy/example.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/groovy/example.xml
new file mode 100644
index 0000000..fcaac79
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/groovy/example.xml
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+
+      <sm:activationSpec componentName="receiver" service="foo:receiver">
+      	<sm:component>
+        	<bean class="org.apache.servicemix.tck.ReceiverComponent" />
+        </sm:component>
+      </sm:activationSpec>
+
+      <!-- output using a POJO -->
+      <sm:activationSpec componentName="myService" service="foo:myService">
+      	<sm:component>
+	        <bean class="org.apache.servicemix.components.groovy.GroovyComponent">
+        		<property name="scriptText">
+          			<value><![CDATA[
+
+println "Called with inbound message $inMessage"
+
+// lets output some message properties
+outMessage.properties.foo = "hello"
+outMessage.properties.someList = [1, 2, 3]
+
+// lets output some non-xml body
+outMessage.body = [3, 2, 1]
+            		]]></value>
+            	</property>
+            </bean>
+        </sm:component>
+      </sm:activationSpec>
+
+      <!-- output using a String -->
+      <!-- START SNIPPET: xmlText -->
+      <sm:activationSpec componentName="myServiceUsingXMLText"
+        service="foo:myServiceUsingXMLText">
+        <sm:component>
+          <bean class="org.apache.servicemix.components.groovy.GroovyComponent">
+            <property name="scriptText">
+              <value>
+                <![CDATA[
+
+// lets output some message properties
+outMessage.properties = [foo:"hello", someList:[1, 2, 3]]
+
+// lets output some non-xml body
+outMessage.bodyText = """
+<hello>
+  <world person="$inMessage.properties.name" location="London"/>
+</hello>
+"""
+                ]]>
+              </value>
+            </property>
+          </bean>
+        </sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: xmlText -->
+
+      <!-- output using Groovy Markup -->
+      <sm:activationSpec componentName="myServiceWithBuilder" service="foo:myServiceWithBuilder">
+        <sm:component><bean class="org.apache.servicemix.components.groovy.GroovyComponent">
+          <property name="scriptText">
+            <value>
+              <![CDATA[
+
+// lets output some message properties
+def props = outMessage.properties
+props.foo = "hello"
+props.someList = [1, 2, 3]
+
+// lets output some XML using GroovyMarkup
+outMessage.body = builder.hello(version:1.2) {
+  world(person:inMessage.properties.name, location:'London')
+}
+              ]]>
+            </value>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+
+      <!-- output using a POJO reqeust and sends a POJO response  -->
+      <sm:activationSpec componentName="myServicePOJO" service="foo:myServicePOJO">
+        <sm:component><bean class="org.apache.servicemix.components.groovy.GroovyComponent">
+          <property name="scriptText">
+            <value>
+              <![CDATA[
+
+def body = inMessage.body
+
+println "Called with input $body"
+
+// lets output some message properties
+outMessage.properties.foo = "hello"
+outMessage.properties.someList = [1, 2, 3]
+
+// lets output some non-xml body
+outMessage.body = [body.name, body.length, body.addresses]
+              ]]>
+            </value>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+
+    </sm:activationSpecs>
+  </sm:container>
+
+
+  <!-- START SNIPPET: client -->
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi" />
+  </bean>
+  <!-- END SNIPPET: client -->
+
+  <!-- lets hardwire this client to talk to instances of a service by default -->
+  <!-- START SNIPPET: clientroute -->
+  <bean id="clientWithRouting" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi" />
+    <constructor-arg>
+      <sm:activationSpec destinationService="foo:receiver"/>
+    </constructor-arg>
+  </bean>
+  <!-- END SNIPPET: clientroute -->
+
+
+  <bean id="clientWithXStream" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi" />
+    <constructor-arg>
+      <!-- lets hardwire this client to talk to instances of a service by default -->
+      <sm:activationSpec>
+        <property name="marshaler">
+          <bean class="org.apache.servicemix.components.util.xstream.XStreamMarshaler" />
+        </property>
+      </sm:activationSpec>
+    </constructor-arg>
+  </bean>
+
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/groovy/groovy-chain.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/groovy/groovy-chain.xml
new file mode 100644
index 0000000..ef67bed
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/groovy/groovy-chain.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns="http://xbean.org/schemas/spring/1.0"
+	   xmlns:spring="http://xbean.org/schemas/spring/1.0"
+	   xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- the JBI container -->
+  <sm:container spring:id="jbi" flowName="st" embedded="true">
+    <sm:activationSpecs>
+
+      <!-- chaining router -->
+      <sm:activationSpec componentName="receiver" service="foo:receiver">
+      	<sm:component>
+	        <bean class="org.apache.servicemix.components.groovy.GroovyComponent">
+        		<property name="script" value="classpath:/org/apache/servicemix/components/groovy/script.groovy" />
+            </bean>
+        </sm:component>
+      </sm:activationSpec>
+
+      <sm:activationSpec componentName="service1"
+        service="foo:service1">
+        <sm:component>
+          <bean class="org.apache.servicemix.components.groovy.GroovyComponent">
+            <property name="scriptText">
+              <value>
+                <![CDATA[
+
+// lets output some message properties
+println "In Service1"
+def txt = inMessage.bodyText
+println "Content: " + txt
+
+// lets output some non-xml body
+outMessage.bodyText = txt.replace("world", "<service1>world</service1>")
+                ]]>
+              </value>
+            </property>
+          </bean>
+        </sm:component>
+      </sm:activationSpec>
+
+      <sm:activationSpec componentName="service2"
+        service="foo:service2">
+        <sm:component>
+          <bean class="org.apache.servicemix.components.groovy.GroovyComponent">
+            <property name="scriptText">
+              <value>
+                <![CDATA[
+
+// lets output some message properties
+println "In Service2"
+def txt = inMessage.bodyText
+println "Content: " + txt
+
+// lets output some non-xml body
+outMessage.bodyText = """
+<service2>
+  <![CDATA[
+     $txt
+  ]""" + """]>
+</service2>
+"""
+                ]]>
+              </value>
+            </property>
+          </bean>
+        </sm:component>
+      </sm:activationSpec>
+
+    </sm:activationSpecs>
+  </sm:container>
+
+
+  <!-- START SNIPPET: client -->
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi" />
+  </bean>
+  <!-- END SNIPPET: client -->
+
+  <!-- lets hardwire this client to talk to instances of a service by default -->
+  <!-- START SNIPPET: clientroute -->
+  <bean id="clientWithRouting" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi" />
+    <constructor-arg>
+      <sm:activationSpec destinationService="foo:receiver"/>
+    </constructor-arg>
+  </bean>
+  <!-- END SNIPPET: clientroute -->
+
+
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/groovy/script.groovy b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/groovy/script.groovy
new file mode 100644
index 0000000..0906ae3
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/groovy/script.groovy
@@ -0,0 +1,38 @@
+/*

+ * 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.

+ */

+

+println "Called with inbound message $inMessage"

+

+// lets output some message properties

+def me1 = deliveryChannel.createExchangeFactoryForService(new javax.xml.namespace.QName("http://servicemix.org/cheese/", "service1")).createInOutExchange()

+def in1 = me1.createMessage()

+in1.bodyText = inMessage.bodyText

+me1.setMessage(in1, "in")

+deliveryChannel.sendSync(me1)

+println "Received: " + me1.getMessage("out").bodyText

+

+// lets output some message properties

+def me2 = deliveryChannel.createExchangeFactoryForService(new javax.xml.namespace.QName("http://servicemix.org/cheese/", "service2")).createInOutExchange()

+def in2 = me2.createMessage()

+in2.bodyText = me1.getMessage("out").bodyText

+me2.setMessage(in2, "in")

+deliveryChannel.sendSync(me2)

+println "Received: " + me2.getMessage("out").bodyText

+

+// lets output some non-xml body

+outMessage.bodyText = me2.getMessage("out").bodyText

+

diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/groovy/spring-groovy.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/groovy/spring-groovy.xml
new file mode 100644
index 0000000..fa1f974
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/groovy/spring-groovy.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
+<beans>
+
+  <!-- the JBI container -->
+  <bean id="jbi" class="org.apache.servicemix.jbi.container.SpringJBIContainer">
+    <property name="componentNames">
+      <list>
+        <value>sender</value>
+        <value>receiver</value>
+      </list>
+    </property>
+    <property name="embedded" value="true" />
+  </bean>
+
+  <!-- components within the JBI container -->
+
+  <!-- these are more lightweight POJOs which don't implement the full JBI Component interface -->
+  <bean id="sender" class="org.apache.servicemix.tck.SenderPojo"/>
+
+  <bean id="receiver" class="org.apache.servicemix.components.groovy.GroovyComponent">
+    <property name="scriptText">
+      <value>
+System.out.println """
+Groovy script evaluated with the following variables
+message: $message
+message exchange: $messageExchange
+componentContext: $componentContext
+deliveryChannel: $deliveryChannel
+"""
+      </value>
+    </property>
+  </bean>
+
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/http/ServiceMix.jpg b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/http/ServiceMix.jpg
new file mode 100644
index 0000000..2e66503
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/http/ServiceMix.jpg
Binary files differ
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/http/client.keystore b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/http/client.keystore
new file mode 100644
index 0000000..8580672
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/http/client.keystore
Binary files differ
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/http/example.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/http/example.xml
new file mode 100644
index 0000000..25a4181
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/http/example.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+
+      <!-- START SNIPPET: send -->
+      <sm:activationSpec componentName="httpSender" service="foo:httpSender">
+        <sm:component><bean class="org.apache.servicemix.components.http.HttpInvoker">
+          <property name="url" value="http://localhost:8912"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: send -->
+
+      <!-- START SNIPPET: binding -->
+      <sm:activationSpec componentName="httpReceiver" service="foo:httpBinding" destinationService="foo:httpSender2">
+        <sm:component><bean class="org.apache.servicemix.components.http.HttpConnector">
+          <property name="host" value="localhost"/>
+          <property name="port" value="8912"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: binding -->
+
+      <sm:activationSpec componentName="httpSender2" service="foo:httpSender2">
+        <sm:component><bean class="org.apache.servicemix.components.http.HttpsInvoker">
+          <property name="url" value="https://localhost:8913"/>
+          <property name="keyStore" value="classpath:org/apache/servicemix/components/http/server.keystore" />
+          <property name="keyStorePassword" value="password" />
+          <property name="trustStore" value="classpath:org/apache/servicemix/components/http/client.keystore" />
+          <property name="trustStorePassword" value="password" />
+        </bean></sm:component>
+      </sm:activationSpec>
+      
+      <sm:activationSpec componentName="httpReceiver2" service="foo:httpBinding2" destinationService="foo:stockQuote">
+        <sm:component><bean class="org.apache.servicemix.components.http.HttpsConnector">
+          <property name="host" value="localhost"/>
+          <property name="port" value="8913"/>
+          <property name="keyStore" value="classpath:org/apache/servicemix/components/http/server.keystore" />
+          <property name="keyStorePassword" value="password" />
+        </bean></sm:component>
+      </sm:activationSpec>
+      
+      <sm:activationSpec componentName="stockQuote" service="foo:stockQuote">
+        <sm:component><bean class="org.apache.servicemix.components.saaj.SaajBinding">
+          <property name="soapEndpoint">
+            <bean class="javax.xml.messaging.URLEndpoint">
+              <constructor-arg value="http://64.124.140.30:9090/soap"/>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/http/request.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/http/request.xml
new file mode 100644
index 0000000..ecfcd94
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/http/request.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<!-- START SNIPPET: request -->
+<ns1:getQuote xmlns:ns1="urn:xmethods-delayed-quotes" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:se="http://schemas.xmlsoap.org/soap/envelope/" se:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
+
+  <symbol xsi:type="xsd:string">IBM</symbol>
+
+</ns1:getQuote>
+<!-- END SNIPPET: request -->
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/http/server.keystore b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/http/server.keystore
new file mode 100644
index 0000000..d9223d8
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/http/server.keystore
Binary files differ
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/http/soap-request.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/http/soap-request.xml
new file mode 100644
index 0000000..a63cbe2
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/http/soap-request.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
+			  xmlns:ns1="urn:xmethods-delayed-quotes"
+			  xmlns:se="http://schemas.xmlsoap.org/soap/envelope/">
+	<env:Body>
+	    <!-- Comment -->
+		<ns1:getQuote 
+			se:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
+
+			<ns1:symbol>IBM</ns1:symbol>
+
+		</ns1:getQuote>
+	</env:Body>
+</env:Envelope>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/http/soap-response.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/http/soap-response.xml
new file mode 100644
index 0000000..4a37d5d
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/http/soap-response.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<e:Envelope xmlns:e="http://schemas.xmlsoap.org/soap/envelope/"
+xmlns:d="http://www.w3.org/2001/XMLSchema"
+xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
+xmlns:wn0="http://systinet.com/xsd/SchemaTypes/"
+xmlns:wn1="http://systinet.com/wsdl/com/cexp/coe/bob/ws/customer/"
+xmlns:wn2="http://systinet.com/soap-jta/"
+xmlns:wn3="http://systinet.com/wsdl/com/cexp/coe/bob/services/order/pojo/">
+  <e:Body>
+    <wn1:getCustomerInfo>
+      <wn1:userId i:type="d:string">akayali</wn1:userId>
+    </wn1:getCustomerInfo>
+  </e:Body>
+</e:Envelope>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/http/ws-example.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/http/ws-example.xml
new file mode 100644
index 0000000..6627895
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/http/ws-example.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+
+      <!-- START SNIPPET: binding -->
+      <sm:activationSpec componentName="httpReceiver" service="foo:httpBinding" destinationService="foo:httpSender2">
+        <sm:component><bean class="org.apache.servicemix.components.http.HttpSoapConnector">
+          <property name="host" value="localhost"/>
+          <property name="port" value="8912"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: binding -->
+
+      <sm:activationSpec componentName="httpSender2" service="foo:httpSender2">
+        <sm:component><bean class="org.apache.servicemix.components.http.HttpSoapInvoker">
+          <property name="url" value="http://localhost:8913"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+      
+      <sm:activationSpec componentName="httpReceiver2" service="foo:httpBinding2" destinationService="foo:stockQuote">
+        <sm:component><bean class="org.apache.servicemix.components.http.HttpSoapConnector">
+          <property name="host" value="localhost"/>
+          <property name="port" value="8913"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+      
+      <sm:activationSpec componentName="stockQuote" service="foo:stockQuote">
+        <sm:component><bean class="org.apache.servicemix.components.util.EchoComponent">
+        </bean></sm:component>
+      </sm:activationSpec>
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jabber/activemqAsServer.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jabber/activemqAsServer.xml
new file mode 100644
index 0000000..5ffebfc
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jabber/activemqAsServer.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- lets run an embedded broker -->
+  <bean id="broker" class="org.apache.activemq.xbean.BrokerFactoryBean">
+    <property name="config" value="classpath:org/apache/servicemix/components/jabber/broker.xml"/>
+  </bean>
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" depends-on="broker" embedded="true">
+    <sm:activationSpecs>
+      <sm:activationSpec componentName="myJabberSender" service="foo:myJabberSender">
+        <sm:component><bean class="org.apache.servicemix.components.jabber.JabberChatSender">
+          <property name="host" value="localhost"/>
+          <property name="port" value="6222"/>
+          <property name="login" value="false"/>
+          <property name="participant" value="test2@servicemix.org"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+
+      <sm:activationSpec componentName="myJabberReceiver" service="foo:myJabberReceiver" destinationService="foo:receiver">
+        <sm:component><bean class="org.apache.servicemix.components.jabber.JabberReceiver">
+          <property name="host" value="localhost"/>
+          <property name="port" value="61626"/>
+          <property name="user" value="test2@servicemix.org"/>
+          <property name="password" value="rocks"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+
+      <sm:activationSpec componentName="receiver" service="foo:receiver">
+        <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+      </sm:activationSpec>
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jabber/broker.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jabber/broker.xml
new file mode 100644
index 0000000..c32a8ce
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jabber/broker.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns="http://activemq.apache.org/schema/core">
+
+  <broker persistent="false">
+
+    <transportConnectors>
+      <transportConnector uri="jabber://localhost:6222" />
+    </transportConnectors>
+
+  </broker>
+
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jabber/example.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jabber/example.xml
new file mode 100644
index 0000000..33558ce
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jabber/example.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- lets run an embedded broker -->
+  <bean id="broker" class="org.apache.activemq.xbean.BrokerFactoryBean">
+    <property name="config" value="classpath:org/apache/servicemix/components/jabber/broker.xml"/>
+  </bean>
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" depends-on="broker" embedded="true">
+    <sm:activationSpecs>
+
+      <!-- START SNIPPET: send -->
+      <sm:activationSpec componentName="myJabberSender" service="foo:myJabberSender" endpoint="myJabberSender">
+        <sm:component><bean class="org.apache.servicemix.components.jabber.JabberChatSender">
+          <property name="host" value="localhost"/>
+          <property name="port" value="6222"/>
+          <property name="user" value="test1@servicemix.org"/>
+          <property name="password" value="rocks"/>
+          <property name="participant" value="test2@servicemix.org"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: send -->
+
+      <!-- START SNIPPET: receive -->
+      <sm:activationSpec componentName="myJabberReceiver" service="foo:myJabberReceiver" endpoint="myJabberReceiver" destinationService="foo:receiver">
+        <sm:component><bean class="org.apache.servicemix.components.jabber.JabberReceiver">
+          <property name="host" value="localhost"/>
+          <property name="port" value="6222"/>
+          <property name="user" value="test2@servicemix.org"/>
+          <property name="password" value="rocks"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: receive -->
+
+      <sm:activationSpec componentName="receiver" service="foo:receiver">
+        <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+      </sm:activationSpec>
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jabber/group-example.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jabber/group-example.xml
new file mode 100644
index 0000000..0a4e05b
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jabber/group-example.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- lets run an embedded broker -->
+  <bean id="broker" class="org.apache.activemq.xbean.BrokerFactoryBean">
+    <property name="config" value="classpath:org/apache/servicemix/components/jabber/broker.xml"/>
+  </bean>
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" depends-on="broker" embedded="true">
+    <sm:activationSpecs>
+
+      <!-- START SNIPPET: send -->
+      <sm:activationSpec componentName="myJabberSender" service="foo:myJabberSender" endpoint="myJabberSender">
+        <sm:component><bean class="org.apache.servicemix.components.jabber.JabberGroupChatSender">
+          <property name="host" value="localhost"/>
+          <property name="port" value="6222"/>
+          <property name="user" value="test1@servicemix.org"/>
+          <property name="password" value="rocks"/>
+          <property name="room" value="servicemixroom"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: send -->
+
+      <!-- START SNIPPET: receive -->
+      <sm:activationSpec componentName="myJabberReceiver" service="foo:myJabberReceiver" endpoint="myJabberReceiver" destinationService="foo:receiver">
+        <sm:component><bean class="org.apache.servicemix.components.jabber.JabberReceiver">
+          <property name="host" value="localhost"/>
+          <property name="port" value="6222"/>
+          <property name="user" value="test2@servicemix.org"/>
+          <property name="password" value="rocks"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: receive -->
+
+      <sm:activationSpec componentName="receiver" service="foo:receiver">
+        <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+      </sm:activationSpec>
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jca/example.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jca/example.xml
new file mode 100644
index 0000000..747ba8b
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jca/example.xml
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<!-- START SNIPPET: config -->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	     xmlns:foo="http://servicemix.org/cheese/">
+
+  <!--
+  || ActiveMQ Broker
+  -->
+  <bean id="broker" class="org.apache.activemq.xbean.BrokerFactoryBean" singleton="true">
+    <property name="config" value="classpath:broker.xml"/>
+  </bean>
+
+  <!-- START SNIPPET: jca -->
+  <bean id="jencks" class="org.jencks.JCAContainer">
+
+    <!-- lets use the default configuration of work manager and transaction manager-->
+    <property name="bootstrapContext">
+      <bean class="org.jencks.factory.BootstrapContextFactoryBean">
+        <property name="threadPoolSize" value="25"/>
+        <property name="transactionManager" ref="transactionManager"/>
+      </bean>
+    </property>
+
+
+    <!-- the JCA Resource Adapter -->
+    <property name="resourceAdapter">
+      <bean id="activeMQResourceAdapter" class="org.apache.activemq.ra.ActiveMQResourceAdapter">
+        <property name="serverUrl" value="tcp://localhost:61626"/>
+      </bean>
+    </property>
+  </bean>
+  <!-- END SNIPPET: jca -->
+  
+  <bean id="transactionManager" class="org.jencks.factory.TransactionManagerFactoryBean">
+    <property name="transactionLogDir" value="target/txlog"/>
+  </bean>
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" depends-on="broker" embedded="true" transactionManager="#transactionManager">
+    <sm:activationSpecs>
+
+      <sm:activationSpec componentName="myJmsSender" service="foo:myJmsSender">
+        <sm:component><bean class="org.apache.servicemix.components.jms.JmsSenderComponent">
+          <property name="template">
+            <bean class="org.springframework.jms.core.JmsTemplate">
+              <property name="connectionFactory" ref="jmsFactory"/>
+              <property name="defaultDestinationName" value="test.org.apache.servicemix.example.jca"/>
+              <property name="pubSubDomain" value="true"/>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+
+      <!-- START SNIPPET: receive -->
+      <sm:activationSpec componentName="myJmsReceiver" service="foo:myJmsReceiver" destinationService="foo:receiver">
+        <sm:component><bean class="org.apache.servicemix.components.jms.JmsInUsingJCABinding">
+
+          <property name="jcaContainer" ref="jencks"/>
+
+          <property name="activationSpec">
+            <bean class="org.apache.activemq.ra.ActiveMQActivationSpec">
+              <property name="destination" value="test.org.apache.servicemix.example.jca"/>
+              <property name="destinationType" value="javax.jms.Topic"/>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: receive -->
+
+      <sm:activationSpec componentName="receiver" service="foo:receiver">
+        <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+      </sm:activationSpec>
+
+      <!-- just to test that we are sending messages, lets trace the messages we receive -->
+      <sm:activationSpec componentName="jmsTrace" service="foo:jmsTrace" destinationService="foo:trace">
+        <sm:component><bean class="org.apache.servicemix.components.jms.JmsInUsingJCABinding">
+
+          <property name="jcaContainer" ref="jencks"/>
+
+          <property name="activationSpec">
+            <bean class="org.apache.activemq.ra.ActiveMQActivationSpec">
+              <property name="destination" value="test.org.apache.servicemix.example.jca"/>
+              <property name="destinationType" value="javax.jms.Topic"/>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+
+      <sm:activationSpec componentName="trace" service="foo:trace">
+        <sm:component><bean class="org.apache.servicemix.components.groovy.GroovyComponent">
+          <property name="disableOutput" value="true"/>
+          <property name="scriptText">
+            <value>
+              <![CDATA[
+log.info "Received message $inMessage with content $inMessage.bodyText"
+              ]]>
+            </value>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+
+  <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory">
+    <property name="connectionFactory">
+      <bean class="org.apache.activemq.ActiveMQConnectionFactory">
+        <property name="brokerURL" value="tcp://localhost:61626"/>
+      </bean>
+    </property>
+  </bean>
+
+</beans>
+<!-- END SNIPPET: config -->
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jca/exampleWithXA.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jca/exampleWithXA.xml
new file mode 100644
index 0000000..c027d9f
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jca/exampleWithXA.xml
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!--
+  || ActiveMQ Broker
+  -->
+  <bean id="broker" class="org.apache.activemq.xbean.BrokerFactoryBean" singleton="true">
+    <property name="config" value="classpath:broker.xml"/>
+  </bean>
+
+  <!-- START SNIPPET: jca -->
+  <bean id="jencks" class="org.jencks.JCAContainer">
+
+    <!-- lets use the default configuration of work manager and transaction manager-->
+    <property name="bootstrapContext">
+      <bean class="org.jencks.factory.BootstrapContextFactoryBean">
+        <property name="threadPoolSize" value="25"/>
+        <property name="transactionManager" ref="transactionManager"/>
+      </bean>
+    </property>
+
+
+    <!-- the JCA Resource Adapter -->
+    <property name="resourceAdapter">
+      <bean id="activeMQResourceAdapter" class="org.apache.activemq.ra.ActiveMQResourceAdapter">
+        <property name="serverUrl" value="tcp://localhost:61626"/>
+      </bean>
+    </property>
+  </bean>
+  <!-- END SNIPPET: jca -->
+
+  <!-- START SNIPPET: tm -->
+  <bean id="transactionManager" class="org.jencks.factory.TransactionManagerFactoryBean">
+    <property name="transactionLogDir" value="target/txlog" />
+  </bean>
+  <!-- END SNIPPET: tm -->
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" depends-on="broker" embedded="true">
+    <sm:activationSpecs>
+
+      <sm:activationSpec componentName="myJmsSender" service="foo:myJmsSender">
+        <sm:component><bean class="org.apache.servicemix.components.jms.JmsSenderComponent">
+          <property name="template">
+            <bean class="org.springframework.jms.core.JmsTemplate">
+              <property name="connectionFactory" ref="jmsFactory"/>
+              <property name="defaultDestinationName" value="test.org.apache.servicemix.example.jca"/>
+              <property name="pubSubDomain" value="true"/>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+
+      <!-- START SNIPPET: receive -->
+      <sm:activationSpec componentName="myJmsReceiver" service="foo:myJmsReceiver" destinationService="foo:receiver">
+        <sm:component><bean class="org.apache.servicemix.components.jms.JmsInUsingJCABinding">
+
+          <property name="jcaContainer" ref="jencks"/>
+
+          <property name="activationSpec">
+            <bean class="org.apache.activemq.ra.ActiveMQActivationSpec">
+              <property name="destination" value="test.org.apache.servicemix.example.jca"/>
+              <property name="destinationType" value="javax.jms.Topic"/>
+            </bean>
+          </property>
+
+          <!-- use XA transactions -->
+          <property name="transactionManager" ref="transactionManager"/>
+          <property name="synchronous" value="true"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: receive -->
+
+      <sm:activationSpec componentName="receiver" service="foo:receiver">
+        <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+      </sm:activationSpec>
+
+
+      <!-- just to test that we are sending messages, lets trace the messages we receive -->
+      <sm:activationSpec componentName="jmsTrace" service="foo:jmsTrace" destinationService="foo:trace">
+        <sm:component><bean class="org.apache.servicemix.components.jms.JmsInUsingJCABinding">
+
+          <property name="jcaContainer" ref="jencks"/>
+
+          <property name="activationSpec">
+            <bean class="org.apache.activemq.ra.ActiveMQActivationSpec">
+              <property name="destination" value="test.org.apache.servicemix.example.jca"/>
+              <property name="destinationType" value="javax.jms.Topic"/>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+
+      <sm:activationSpec componentName="trace" service="foo:trace">
+        <sm:component><bean class="org.apache.servicemix.components.groovy.GroovyComponent">
+          <property name="disableOutput" value="true"/>
+          <property name="scriptText">
+            <value>
+              <![CDATA[
+log.info "Received message $inMessage with content $inMessage.bodyText"
+              ]]>
+            </value>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+      
+    </sm:activationSpecs>
+  </sm:container>
+
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+
+  <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory">
+    <property name="connectionFactory">
+      <bean class="org.apache.activemq.ActiveMQConnectionFactory">
+        <property name="brokerURL" value="tcp://localhost:61626"/>
+      </bean>
+    </property>
+  </bean>
+
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jca/xa-on-jca-flow.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jca/xa-on-jca-flow.xml
new file mode 100644
index 0000000..9b67998
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jca/xa-on-jca-flow.xml
@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!--
+  || ActiveMQ Broker
+  -->
+  <bean id="broker" class="org.apache.activemq.xbean.BrokerFactoryBean" singleton="true">
+    <property name="config" value="classpath:broker.xml"/>
+  </bean>
+
+  <!-- START SNIPPET: jca -->
+  <bean id="jencks" class="org.jencks.JCAContainer">
+
+    <!-- lets use the default configuration of work manager and transaction manager-->
+    <property name="bootstrapContext">
+      <bean class="org.jencks.factory.BootstrapContextFactoryBean">
+        <property name="threadPoolSize" value="25"/>
+        <property name="transactionManager" ref="transactionManager" />
+      </bean>
+    </property>
+
+
+    <!-- the JCA Resource Adapter -->
+    <property name="resourceAdapter">
+      <bean id="activeMQResourceAdapter" class="org.apache.activemq.ra.ActiveMQResourceAdapter">
+        <property name="serverUrl" value="tcp://localhost:61626"/>
+      </bean>
+    </property>
+  </bean>
+  <!-- END SNIPPET: jca -->
+
+  <!-- START SNIPPET: tm -->
+  <bean id="transactionManager" class="org.jencks.factory.TransactionManagerFactoryBean">
+    <property name="transactionLogDir" value="target/txlog" />
+  </bean>
+  <!-- END SNIPPET: tm -->
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" depends-on="broker">
+
+    <!-- use JCA flow -->
+  	<property name="flow">
+  		<bean class="org.apache.servicemix.jbi.nmr.flow.jca.JCAFlow">
+  			<property name="jmsURL" value="tcp://localhost:61626" />
+  		</bean>
+  	</property>
+    <!-- use XA transactions -->
+    <property name="transactionManager" ref="transactionManager"/>
+    <!--  use autoEnlistInTransaction -->
+    <property name="autoEnlistInTransaction" value="true"/>
+    <property name="embedded" value="true" />
+  
+    <sm:activationSpecs>
+
+      <sm:activationSpec componentName="myJmsSender" service="foo:myJmsSender">
+        <sm:component><bean class="org.apache.servicemix.components.jms.JmsSenderComponent">
+          <property name="template">
+            <bean class="org.springframework.jms.core.JmsTemplate">
+              <property name="connectionFactory" ref="jmsFactory"/>
+              <property name="defaultDestinationName" value="test.org.apache.servicemix.example.jca"/>
+              <property name="pubSubDomain" value="true"/>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+
+      <!-- START SNIPPET: receive -->
+      <sm:activationSpec componentName="myJmsReceiver" service="foo:myJmsReceiver" destinationService="foo:receiver">
+        <sm:component><bean class="org.apache.servicemix.components.jms.JmsInUsingJCABinding">
+
+          <property name="jcaContainer" ref="jencks"/>
+
+          <property name="activationSpec">
+            <bean class="org.apache.activemq.ra.ActiveMQActivationSpec">
+              <property name="destination" value="test.org.apache.servicemix.example.jca"/>
+              <property name="destinationType" value="javax.jms.Topic"/>
+            </bean>
+          </property>
+
+          <!-- use XA transactions -->
+          <property name="transactionManager" ref="transactionManager"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: receive -->
+
+      <sm:activationSpec componentName="receiver" service="foo:receiver">
+        <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+      </sm:activationSpec>
+
+
+      <!-- just to test that we are sending messages, lets trace the messages we receive -->
+      <sm:activationSpec componentName="jmsTrace" service="foo:jmsTrace" destinationService="foo:trace">
+        <sm:component><bean class="org.apache.servicemix.components.jms.JmsInUsingJCABinding">
+
+          <property name="jcaContainer" ref="jencks"/>
+
+          <property name="activationSpec">
+            <bean class="org.apache.activemq.ra.ActiveMQActivationSpec">
+              <property name="destination" value="test.org.apache.servicemix.example.jca"/>
+              <property name="destinationType" value="javax.jms.Topic"/>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+
+      <sm:activationSpec componentName="trace" service="foo:trace">
+        <sm:component><bean class="org.apache.servicemix.components.groovy.GroovyComponent">
+          <property name="disableOutput" value="true"/>
+          <property name="scriptText">
+            <value>
+              <![CDATA[
+log.info "Received message $inMessage with content $inMessage.bodyText"
+              ]]>
+            </value>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+      
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+
+  <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory">
+    <property name="connectionFactory">
+      <bean class="org.apache.activemq.ActiveMQConnectionFactory">
+        <property name="brokerURL" value="tcp://localhost:61626"/>
+      </bean>
+    </property>
+  </bean>
+
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jms/example-cluster.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jms/example-cluster.xml
new file mode 100644
index 0000000..799dc42
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jms/example-cluster.xml
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <bean id="broker" class="org.apache.activemq.xbean.BrokerFactoryBean" singleton="true">
+    <property name="config" value="classpath:broker.xml"/>
+  </bean>
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" depends-on="broker" embedded="true" 
+  				flowName="jms?brokerURL=tcp://localhost:61626">
+    <sm:activationSpecs>
+
+      <sm:activationSpec componentName="myJmsSender" service="foo:myJmsSender">
+        <sm:component><bean class="org.apache.servicemix.components.jms.JmsSenderComponent">
+          <property name="template">
+            <bean class="org.springframework.jms.core.JmsTemplate">
+              <property name="connectionFactory">
+                <ref local="jmsFactory"/>
+              </property>
+              <property name="defaultDestinationName" value="test.org.apache.servicemix.example.1"/>
+              <property name="pubSubDomain" value="true"/>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+
+      <sm:activationSpec componentName="myJmsReceiver" service="foo:myJmsReceiver" destinationService="foo:receiver">
+        <sm:component><bean class="org.apache.servicemix.components.jms.JmsReceiverComponent">
+          <property name="template">
+            <bean class="org.springframework.jms.core.JmsTemplate">
+              <property name="connectionFactory">
+                <ref local="jmsFactory"/>
+              </property>
+              <property name="defaultDestinationName" value="test.org.apache.servicemix.example.1"/>
+              <property name="pubSubDomain" value="true"/>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+
+      <sm:activationSpec componentName="receiver" service="foo:receiver">
+        <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+      </sm:activationSpec>
+
+
+      <!-- just to test that we are sending messages, lets trace the messages we receive -->
+      <sm:activationSpec componentName="jmsTrace" service="foo:jmsTrace" destinationService="foo:trace">
+        <sm:component><bean class="org.apache.servicemix.components.jms.JmsReceiverComponent">
+          <property name="template">
+            <bean class="org.springframework.jms.core.JmsTemplate">
+              <property name="connectionFactory">
+                <ref local="jmsFactory"/>
+              </property>
+              <property name="defaultDestinationName" value="test.org.apache.servicemix.example.1"/>
+              <property name="pubSubDomain" value="true"/>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+
+      <!--
+      <sm:activationSpec componentName="jmsTrace" service="foo:trace">
+        <sm:component><bean class="org.apache.servicemix.components.util.TraceComponent"/></sm:component>
+      </sm:activationSpec>
+      -->
+
+      <sm:activationSpec componentName="trace" service="foo:trace">
+        <sm:component><bean class="org.apache.servicemix.components.groovy.GroovyComponent">
+          <property name="disableOutput" value="true"/>
+          <property name="scriptText">
+            <value>
+              <![CDATA[
+log.info "Received message $inMessage with body: $inMessage.bodyText"
+              ]]>
+            </value>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+
+  <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory">
+    <property name="connectionFactory">
+      <bean class="org.apache.activemq.ActiveMQConnectionFactory">
+        <property name="brokerURL" value="tcp://localhost:61626" />
+      </bean>
+    </property>
+  </bean>
+
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jms/example-endpoint-subscription.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jms/example-endpoint-subscription.xml
new file mode 100644
index 0000000..6e942af
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jms/example-endpoint-subscription.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <bean id="broker" class="org.apache.activemq.xbean.BrokerFactoryBean" singleton="true">
+    <property name="config" value="classpath:broker.xml"/>
+  </bean>
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" depends-on="broker" embedded="true">
+    <sm:activationSpecs>
+
+      <sm:activationSpec componentName="jmsSender" service="foo:jmsSender">
+        <sm:component><bean class="org.apache.servicemix.components.jms.JmsSenderComponent">
+          <property name="template">
+            <bean class="org.springframework.jms.core.JmsTemplate">
+              <property name="connectionFactory" ref="jmsFactory" />
+              <property name="defaultDestinationName" value="test.org.apache.servicemix.example.1" />
+              <property name="pubSubDomain" value="true" />
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+
+      <!-- START SNIPPET: publish -->
+      <sm:activationSpec componentName="jmsReceiver" service="foo:jmsReceiver"
+                         failIfNoDestinationEndpoint="false">
+        <sm:component><bean class="org.apache.servicemix.components.jms.JmsReceiverComponent">
+          <!-- END SNIPPET: publish -->
+          <property name="template">
+            <bean class="org.springframework.jms.core.JmsTemplate">
+              <property name="connectionFactory" ref="jmsFactory" />
+              <property name="defaultDestinationName" value="test.org.apache.servicemix.example.1" />
+              <property name="pubSubDomain" value="true" />
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+
+
+      <!-- START SNIPPET: subscribe -->
+      <sm:activationSpec componentName="receiver" service="foo:receiver">
+        <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+
+        <!--  lets subscribe to the output of the foo:jmsReceiver component -->
+        <sm:subscriptions>
+          <sm:subscriptionSpec service="foo:jmsReceiver" />
+        </sm:subscriptions>
+      </sm:activationSpec>
+      <!-- END SNIPPET: subscribe -->
+
+
+      <sm:activationSpec componentName="trace" service="foo:trace">
+        <sm:component><bean class="org.apache.servicemix.components.groovy.GroovyComponent">
+          <property name="disableOutput" value="true" />
+          <property name="scriptText">
+            <value>
+              <![CDATA[
+log.info "Received message $inMessage with body: $inMessage.bodyText"
+              ]]>
+            </value>
+          </property>
+        </bean></sm:component>
+        <sm:subscriptions>
+          <sm:subscriptionSpec service="foo:jmsReceiver" />
+        </sm:subscriptions>
+      </sm:activationSpec>
+      
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client"
+    class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi" />
+  </bean>
+
+  <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory">
+    <property name="connectionFactory">
+      <bean class="org.apache.activemq.ActiveMQConnectionFactory">
+        <property name="brokerURL" value="tcp://localhost:61626" />
+      </bean>
+    </property>
+  </bean>
+
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jms/example.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jms/example.xml
new file mode 100644
index 0000000..0b10bc2
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jms/example.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <bean id="broker" class="org.apache.activemq.xbean.BrokerFactoryBean" singleton="true">
+    <property name="config" value="classpath:broker.xml"/>
+  </bean>
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" depends-on="broker" embedded="true">
+    <sm:activationSpecs>
+
+      <sm:activationSpec componentName="myJmsSender" service="foo:myJmsSender">
+        <sm:component><bean class="org.apache.servicemix.components.jms.JmsSenderComponent">
+          <property name="template">
+            <bean class="org.springframework.jms.core.JmsTemplate">
+              <property name="connectionFactory">
+                <ref local="jmsFactory"/>
+              </property>
+              <property name="defaultDestinationName" value="test.org.apache.servicemix.example.1"/>
+              <property name="pubSubDomain" value="true"/>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+
+      <sm:activationSpec componentName="myJmsReceiver" service="foo:myJmsReceiver" destinationService="foo:receiver">
+        <sm:component><bean class="org.apache.servicemix.components.jms.JmsReceiverComponent">
+          <property name="template">
+            <bean class="org.springframework.jms.core.JmsTemplate">
+              <property name="connectionFactory">
+                <ref local="jmsFactory"/>
+              </property>
+              <property name="defaultDestinationName" value="test.org.apache.servicemix.example.1"/>
+              <property name="pubSubDomain" value="true"/>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+
+      <sm:activationSpec componentName="receiver" service="foo:receiver">
+        <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+      </sm:activationSpec>
+
+
+      <!-- just to test that we are sending messages, lets trace the messages we receive -->
+      <sm:activationSpec componentName="jmsTrace" service="foo:jmsTrace" destinationService="foo:trace">
+        <sm:component><bean class="org.apache.servicemix.components.jms.JmsReceiverComponent">
+          <property name="template">
+            <bean class="org.springframework.jms.core.JmsTemplate">
+              <property name="connectionFactory">
+                <ref local="jmsFactory"/>
+              </property>
+              <property name="defaultDestinationName" value="test.org.apache.servicemix.example.1"/>
+              <property name="pubSubDomain" value="true"/>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+
+      <!--
+      <sm:activationSpec componentName="jmsTrace" service="foo:trace">
+        <sm:component><bean class="org.apache.servicemix.components.util.TraceComponent"/></sm:component>
+      </sm:activationSpec>
+      -->
+
+      <sm:activationSpec componentName="trace" service="foo:trace">
+        <sm:component><bean class="org.apache.servicemix.components.groovy.GroovyComponent">
+          <property name="disableOutput" value="true"/>
+          <property name="scriptText">
+            <value>
+              <![CDATA[
+log.info "Received message $inMessage with body: $inMessage.bodyText"
+              ]]>
+            </value>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+
+  <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory">
+    <property name="connectionFactory">
+      <bean class="org.apache.activemq.ActiveMQConnectionFactory">
+        <property name="brokerURL" value="tcp://localhost:61626" />
+      </bean>
+    </property>
+  </bean>
+
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jmx/example.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jmx/example.xml
new file mode 100644
index 0000000..3107849
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/jmx/example.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.apache.org/cheese/">
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" embedded="true" useMBeanServer="true" createMBeanServer="true">
+    <sm:activationSpecs>
+    
+      <sm:activationSpec componentName="trace"
+            			 endpoint="trace" 
+            			 service="foo:trace">
+        <sm:component>
+        	<bean class="org.apache.servicemix.components.util.TraceComponent"/>
+        </sm:component>
+      </sm:activationSpec>
+
+      <sm:activationSpec componentName="jmxMonitor"
+                 		 service="foo:jmxMonitor" 
+                 		 endpoint="jmxMonitor"
+                 		 destinationService="foo:receiver">
+        <sm:component>
+         	<bean class="org.apache.servicemix.components.jmx.CounterMonitorComponent">
+          		<property name="observedObjectName" value="org.apache.servicemix:ContainerName=ServiceMix,Type=Component,Name=trace,SubType=Statistics"/>
+          		<property name="attributeName" value="inboundExchangeCount" />
+          		<property name="threshold">
+          		  <bean class="java.lang.Long">
+    				<constructor-arg value="1"/>
+          		  </bean>
+          		</property>
+          		<property name="offset">
+          		  <bean class="java.lang.Long">
+    				<constructor-arg value="1"/>
+          		  </bean>
+          		</property>
+          		<property name="granularityPeriod" value="10" />
+	        </bean>
+	    </sm:component>
+      </sm:activationSpec>
+
+      <sm:activationSpec componentName="receiver"
+            			 endpoint="receiver" 
+            			 service="foo:receiver">
+        <sm:component>
+        	<bean class="org.apache.servicemix.tck.ReceiverComponent"/>
+        </sm:component>
+      </sm:activationSpec>
+
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+    <constructor-arg>
+      <sm:activationSpec destinationService="foo:trace" />
+    </constructor-arg>
+  </bean>
+
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/mps/sample-mps-config.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/mps/sample-mps-config.xml
new file mode 100644
index 0000000..1afe4d4
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/mps/sample-mps-config.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<mps>
+
+	 <property-set name="hello">
+	     
+	     <!-- set a static string value -->
+	     <property name="my-superdooper.property">
+	         <static-value><![CDATA[wishAusMadeItTotheFinals]]></static-value>
+	     </property>
+	 </property-set>
+	 
+	 
+	 <property-set name="propertySetOne">
+	     
+	     <!-- set a static string value -->
+	     <property name="property.1">
+	         <static-value><![CDATA[foobarAndCheese]]></static-value>
+	     </property>
+	     
+	     <!--
+	        xpath and a default string
+	     -->
+	     <property name="property.2">
+	         <xpath-expression>
+		 	      <![CDATA[/sample/@id]]>
+		 	 </xpath-expression>
+		 	 <static-value><![CDATA[sampleIdNotFound]]></static-value>
+	     </property>
+
+		<!-- 
+		   an xpath that doesn't work
+		 -->	     
+	     <property name="prop.xpath.or.keep.existing">
+	        <xpath-expression>
+		 	    <![CDATA[/someexpath/statement/that/wont/match]]>
+		 	</xpath-expression>
+		 	<existing-property/>
+	     </property>
+	     
+	     <property name="new.prop.name">
+		 	<existing-property name="other.property"/>
+	     </property>
+	     
+	     <property name="property.3">
+		 	<existing-property name="other.set.property"/>
+	     </property>
+	     	     
+	 </property-set>
+	 
+
+
+</mps>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/mps/servicemix-mps-test.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/mps/servicemix-mps-test.xml
new file mode 100644
index 0000000..fde7951
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/mps/servicemix-mps-test.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+
+      <!-- START SNIPPET: fixedPropertySet -->
+      <sm:activationSpec componentName="mpsFixed" service="foo:mpsFixed">
+        <sm:component><bean class="org.apache.servicemix.components.mps.MessagePropertySetterXML">
+        	<property name="xmlConfiguration" value="classpath:org/apache/servicemix/components/mps/sample-mps-config.xml"/>
+        	<property name="propertySet" value="propertySetOne"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET:  -->
+
+
+      <!-- START SNIPPET: fixedPropertySet -->
+      <sm:activationSpec componentName="mpsXpath" service="foo:mpsXpath">
+        <sm:component><bean class="org.apache.servicemix.components.mps.MessagePropertySetterXML">
+        	<property name="xmlConfiguration" value="classpath:org/apache/servicemix/components/mps/sample-mps-config.xml"/>
+        	<property name="xpathForPropertySet" value="substring-before(/sample[@id=400],' world')"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET:  -->
+      
+      <!-- START SNIPPET: propsLoadedFromProperty -->
+      <sm:activationSpec componentName="mpsJBIPropsPS" service="foo:mpsJBIPropsPS">
+        <sm:component><bean class="org.apache.servicemix.components.mps.MessagePropertySetterXML">
+        	<property name="xmlConfiguration" value="classpath:org/apache/servicemix/components/mps/sample-mps-config.xml"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET:  -->
+      
+            
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+
+  <bean id="workManager" class="org.jencks.factory.WorkManagerFactoryBean"/>
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/net/ftp.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/net/ftp.xml
new file mode 100644
index 0000000..2da71cd
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/net/ftp.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+
+      <!-- START SNIPPET: sender -->
+      <sm:activationSpec componentName="ftpSender" service="foo:ftpSender">
+      	<sm:component><bean class="org.apache.servicemix.components.net.FTPSender">
+	      <property name="clientPool">
+	        <bean id="ftpClientPool" class="org.apache.servicemix.components.net.FTPClientPool">
+	          <property name="host" value="localhost"/>
+	          <property name="username" value="servicemix"/>
+	          <property name="password" value="rocks"/>
+	        </bean>
+	      </property>
+	    </bean></sm:component>
+	  </sm:activationSpec>
+      <!-- END SNIPPET: sender -->
+
+      <!-- START SNIPPET: expression -->
+      <sm:activationSpec componentName="ftpSenderWithExpression" service="foo:ftpSenderWithExpression">
+        <sm:component><bean class="org.apache.servicemix.components.net.FTPSender">
+          <property name="clientPool">
+            <bean id="ftpClientPool" class="org.apache.servicemix.components.net.FTPClientPool">
+              <property name="host" value="localhost"/>
+              <property name="username" value="servicemix"/>
+              <property name="password" value="rocks"/>
+            </bean>
+          </property>
+
+          <property name="marshaler">
+            <bean class="org.apache.servicemix.components.util.DefaultFileMarshaler">
+              <property name="fileName">
+                <bean class="org.apache.servicemix.expression.JaxenStringXPathExpression">
+                  <constructor-arg value="concat('order_', order/@id, '.csv')"/>
+                </bean>
+              </property>
+              <property name="content">
+                <bean class="org.apache.servicemix.expression.JaxenStringXPathExpression">
+                  <constructor-arg value="concat(/order/customer, ',', /order/value, ',', /order/@id)"/>
+                </bean>
+              </property>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: expression -->
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+    <constructor-arg>
+      <!-- lets hardwire this client to talk to instances of a service by default -->
+      <sm:activationSpec destinationService="foo:ftpSender"/>
+    </constructor-arg>
+  </bean>
+
+
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/net/ftpPoll.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/net/ftpPoll.xml
new file mode 100644
index 0000000..ebb6469
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/net/ftpPoll.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+
+      <sm:activationSpec componentName="ftpSender" service="foo:ftpSender">
+        <sm:component><bean class="org.apache.servicemix.components.net.FTPSender">
+          <property name="clientPool" ref="ftpClientPool"/>
+          <property name="overwrite" value="true"/>
+          <!--
+          <property name="uniqueFileName" value="foo/TestFile"/>
+          -->
+
+          <property name="marshaler">
+            <bean class="org.apache.servicemix.components.util.DefaultFileMarshaler">
+              <property name="fileName">
+                <bean class="org.apache.servicemix.expression.JaxenStringXPathExpression">
+                  <constructor-arg value="concat('sample_', /sample/@id, '.xml')"/>
+                </bean>
+              </property>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+
+
+      <!-- START SNIPPET: poll -->
+      <sm:activationSpec componentName="ftpPoller" service="foo:ftpPoller" destinationService="foo:receiver">
+        <sm:component><bean class="org.apache.servicemix.components.net.FTPPoller">
+          <property name="clientPool" ref="ftpClientPool"/>
+          <property name="workManager" ref="workManager"/>
+          <!--
+          <property name="path" value="foo"/>
+          -->
+          <property name="period" value="1000"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: poll -->
+
+      <sm:activationSpec componentName="receiver" service="foo:receiver" endpoint="receiver">
+        <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+      </sm:activationSpec>
+      
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+
+  <bean id="ftpClientPool" class="org.apache.servicemix.components.net.FTPClientPool">
+    <property name="host" value="localhost"/>
+    <property name="username" value="servicemix"/>
+    <property name="password" value="rocks"/>
+  </bean>
+
+  <bean id="workManager" class="org.jencks.factory.WorkManagerFactoryBean" />
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/pojo/example-more-pojo.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/pojo/example-more-pojo.xml
new file mode 100644
index 0000000..cc6388e
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/pojo/example-more-pojo.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<!-- START SNIPPET: example -->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+
+      <sm:activationSpec componentName="receiver" service="foo:receiver">
+      	<sm:component><bean class="org.apache.servicemix.components.pojo.PojoReceiver"/></sm:component>
+     </sm:activationSpec>
+
+    </sm:activationSpecs>
+  </sm:container>
+
+
+  <bean id="sender" class="org.apache.servicemix.components.pojo.PojoSender">
+    <property name="client">
+
+      <!-- lets configure a ServiceMix client which is bound to the required service  -->
+      <bean class="org.apache.servicemix.client.DefaultServiceMixClient">
+        <constructor-arg ref="jbi"/>
+        <constructor-arg>
+          <sm:activationSpec destinationService="foo:receiver" />
+        </constructor-arg>
+      </bean>
+    </property>
+  </bean>
+
+</beans>
+<!-- END SNIPPET: example -->
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/pojo/example.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/pojo/example.xml
new file mode 100644
index 0000000..642970c
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/pojo/example.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<!-- START SNIPPET: example -->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+
+      <sm:activationSpec componentName="sender" service="foo:sender" destinationService="foo:receiver">
+      	<sm:component><bean class="org.apache.servicemix.components.pojo.MySender" /></sm:component>
+      </sm:activationSpec>
+
+      <sm:activationSpec id="receiver" service="foo:receiver">
+      	<sm:component><bean class="org.apache.servicemix.components.pojo.MyReceiver"/></sm:component>
+      </sm:activationSpec>
+
+    </sm:activationSpecs>
+  </sm:container>
+
+</beans>
+<!-- END SNIPPET: example -->
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/quartz/example-cluster.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/quartz/example-cluster.xml
new file mode 100644
index 0000000..e8d5307
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/quartz/example-cluster.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:my="http://servicemix.org/cheese/">
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" embedded="true" 
+  				flowName="jms?brokerURL=tcp://localhost:61626">
+    <sm:activationSpecs>
+
+      <!-- START SNIPPET: timer -->
+      <sm:activationSpec componentName="timer" service="my:timer" destinationService="my:receiver">
+        <sm:component><bean class="org.apache.servicemix.components.quartz.QuartzComponent">
+          <property name="triggers">
+            <map>
+              <entry>
+                <key>
+                  <bean class="org.quartz.SimpleTrigger">
+                    <property name="repeatInterval" value="200"/>
+                    <property name="repeatCount" value="20"/>
+                  </bean>
+                </key>
+                  <bean class="org.quartz.JobDetail">
+                    <property name="name" value="My Example Job"/>
+                    <property name="group" value="ServiceMix"/>
+                  </bean>
+              </entry>
+            </map>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: timer -->
+
+      <sm:activationSpec componentName="receiver" service="my:receiver">
+        <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+      </sm:activationSpec>
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+
+  <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory">
+    <property name="connectionFactory">
+      <bean class="org.apache.activemq.ActiveMQConnectionFactory">
+        <property name="brokerURL" value="vm://localhost"/>
+      </bean>
+    </property>
+  </bean>
+
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/quartz/example.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/quartz/example.xml
new file mode 100644
index 0000000..74e7f1b
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/quartz/example.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:my="http://servicemix.org/cheese/">
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+
+      <!-- START SNIPPET: timer -->
+      <sm:activationSpec componentName="timer" service="my:timer" destinationService="my:receiver">
+        <sm:component><bean class="org.apache.servicemix.components.quartz.QuartzComponent">
+          <property name="triggers">
+            <map>
+              <entry>
+                <key>
+                  <bean class="org.quartz.SimpleTrigger">
+                    <property name="repeatInterval" value="200"/>
+                    <property name="repeatCount" value="20"/>
+                  </bean>
+                </key>
+                  <bean class="org.quartz.JobDetail">
+                    <property name="name" value="My Example Job"/>
+                    <property name="group" value="ServiceMix"/>
+                  </bean>
+              </entry>
+            </map>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: timer -->
+
+      <sm:activationSpec componentName="receiver" service="my:receiver">
+        <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+      </sm:activationSpec>
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+
+  <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory">
+    <property name="connectionFactory">
+      <bean class="org.apache.activemq.ActiveMQConnectionFactory">
+        <property name="brokerURL" value="vm://localhost"/>
+      </bean>
+    </property>
+  </bean>
+
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/reflection/example.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/reflection/example.xml
new file mode 100644
index 0000000..633eb9b
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/reflection/example.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+    
+      <!-- START SNIPPET: inOnly -->
+      <sm:activationSpec componentName="proxyCounter"
+            endpoint="proxyCounter" 
+            service="foo:proxyCounter" 
+            destinationService="foo:reflectionCounter">
+        <sm:component><bean class="org.apache.servicemix.components.reflection.ProxyInOnlyBinding">
+          <property name="target" ref="counter"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: inOnly -->
+
+      <sm:activationSpec componentName="trace"
+                 service="foo:trace" 
+                 endpoint="trace">
+        <sm:component><bean class="org.apache.servicemix.components.groovy.GroovyComponent">
+          <property name="disableOutput" value="true"/>
+          <property name="scriptText">
+            <value>
+              <![CDATA[
+println "Received message $inMessage.properties.method"
+              ]]>
+            </value>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+
+      <!-- START SNIPPET: out -->
+      <sm:activationSpec componentName="reflectionCounter"
+                 service="foo:reflectionCounter" 
+                 endpoint="reflectionCounter">
+        <sm:component><bean class="org.apache.servicemix.components.reflection.ReflectionOutBinding">
+          <property name="target" ref="counter"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: out -->
+
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="counter" class="org.apache.servicemix.components.reflection.SimpleCounter"/>
+  
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/rss/example.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/rss/example.xml
new file mode 100644
index 0000000..04bf992
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/rss/example.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+
+      <!-- START SNIPPET: rss -->
+      <sm:activationSpec componentName="feedWriter" 
+      					 service="foo:feedWriter">
+      	<sm:component><bean class="org.apache.servicemix.components.rss.FeedWriter">
+
+	        <property name="feedFile" value="file:target/serviceMixFeed.xml" />
+	
+	        <!--  define expressions for the entry title and value -->
+	        <property name="entryTitle">
+	          <bean class="org.apache.servicemix.expression.JaxenStringXPathExpression">
+	            <constructor-arg value="concat('Message ', /sample/@id, ' - ', /sample/@sent)" />
+	          </bean>
+	        </property>
+	        <property name="entryValue">
+	          <bean class="org.apache.servicemix.expression.JaxenStringXPathExpression">
+	            <constructor-arg value="concat('This is an entry with ID ', /sample/@id, ' sent: ', /sample/@sent, '. There is not much else in the message to tell :)')" />
+	          </bean>
+	        </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: rss -->
+
+      <sm:activationSpec componentName="receiver" 
+      					 service="foo:receiver">
+      	<sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+      </sm:activationSpec>
+      
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi" />
+  </bean>
+
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/saaj/example.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/saaj/example.xml
new file mode 100644
index 0000000..e7188aa
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/saaj/example.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+      <!-- START SNIPPET: saaj -->
+      <sm:activationSpec componentName="stockQuote" service="foo:stockQuote" endpoint="stockQuote">
+        <sm:component><bean class="org.apache.servicemix.components.saaj.SaajBinding">
+          <property name="soapEndpoint">
+            <bean class="javax.xml.messaging.URLEndpoint">
+              <constructor-arg value="http://64.124.140.30:9090/soap"/>
+            </bean>
+          </property>
+        </bean></sm:component>
+       </sm:activationSpec>
+      <!-- END SNIPPET: saaj -->
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/saaj/request.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/saaj/request.xml
new file mode 100644
index 0000000..b20dbaa
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/saaj/request.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<!-- START SNIPPET: request -->
+<ns1:getQuote xmlns:ns1="urn:xmethods-delayed-quotes" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:se="http://schemas.xmlsoap.org/soap/envelope/" se:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
+
+  <symbol xsi:type="xsd:string">SUNW</symbol>
+
+</ns1:getQuote>
+<!-- END SNIPPET: request -->
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/saaj/response.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/saaj/response.xml
new file mode 100644
index 0000000..b6caf5d
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/saaj/response.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<!-- START SNIPPET: example -->
+<n:getQuoteResponse xmlns:n="urn:xmethods-delayed-quotes" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <Result xsi:type="xsd:float">3.67</Result>
+</n:getQuoteResponse>
+<!-- END SNIPPET: example -->
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/saaj/xml-request.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/saaj/xml-request.xml
new file mode 100644
index 0000000..0d542f5
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/saaj/xml-request.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<wn1:getCustomerInfo 
+	xmlns:d="http://www.w3.org/2001/XMLSchema"
+	xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:wn0="http://systinet.com/xsd/SchemaTypes/"
+	xmlns:wn1="http://systinet.com/wsdl/com/cexp/coe/bob/ws/customer/"
+	xmlns:wn2="http://systinet.com/soap-jta/"
+	xmlns:wn3="http://systinet.com/wsdl/com/cexp/coe/bob/services/order/pojo/">
+	
+	<wn1:userId i:type="d:string">akayali</wn1:userId>
+	
+</wn1:getCustomerInfo>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/script/groovy-transform.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/script/groovy-transform.xml
new file mode 100644
index 0000000..d01e12a
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/script/groovy-transform.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
+<beans>
+
+  <!-- the JBI container -->
+  <bean id="jbi" class="org.apache.servicemix.jbi.container.SpringJBIContainer">
+    <property name="componentNames">
+      <list>
+        <value>sender</value>
+        <value>pipeline</value>
+        <value>transformer</value>
+        <value>receiver</value>
+      </list>
+    </property>
+    <property name="embedded" value="true"/>
+  </bean>
+
+  <!-- components within the JBI container -->
+
+  <!-- these are more lightweight POJOs which don't implement the full JBI Component interface -->
+  <bean id="sender" class="org.apache.servicemix.tck.SenderComponent">
+    <property name="resolver">
+      <bean class="org.apache.servicemix.jbi.resolver.ServiceNameEndpointResolver">
+        <property name="serviceName" ref="pipelineServiceName"/>
+      </bean>
+    </property>
+ </bean>
+
+  <!-- pipelines the transformation script to the receiver -->
+  <bean id="pipeline" class="org.apache.servicemix.components.util.PipelineComponent">
+    <constructor-arg ref="pipelineServiceName"/>
+    <constructor-arg value="pipeline"/>
+
+    <property name="requestResponseServiceName" ref="transformerServiceName"/>
+    <property name="outputEndpointServiceName" ref="receiverServiceName"/>
+ </bean>
+
+
+  <!-- the groovy transformation -->
+  <bean id="transformer" class="org.apache.servicemix.components.script.ScriptComponent">
+    <constructor-arg ref="transformerServiceName"/>
+    <constructor-arg value="transformer"/>
+
+    <property name="scriptEngineName" value="groovy"/>
+    <property name="scriptText">
+      <value>
+outMessage.setProperty("foo", "hello")
+
+println "Received message $inMessage in Groovy script"
+        
+      </value>
+    </property>
+  </bean>
+
+  <bean id="receiver" class="org.apache.servicemix.tck.ReceiverPojo">
+    <constructor-arg ref="receiverServiceName"/>
+    <constructor-arg value="receiver"/>
+ </bean>
+
+
+  <!-- QNames - would be nice to have an easier way of doing this -->
+  <bean id="pipelineServiceName" class="javax.xml.namespace.QName">
+    <constructor-arg value="http://www.example.com/pipeline"/>
+    <constructor-arg value="pipeline"/>
+  </bean>
+
+  <bean id="transformerServiceName" class="javax.xml.namespace.QName">
+    <constructor-arg value="http://www.example.com/transformer"/>
+    <constructor-arg value="transformer"/>
+  </bean>
+
+  <bean id="receiverServiceName" class="javax.xml.namespace.QName">
+    <constructor-arg value="http://www.example.com/receiver"/>
+    <constructor-arg value="receiver"/>
+  </bean>
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/script/spring-groovy.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/script/spring-groovy.xml
new file mode 100644
index 0000000..bf8bc31
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/script/spring-groovy.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <sm:container id="jbi" flowName="st" embedded="true">
+    <sm:activationSpecs>
+
+      <sm:activationSpec componentName="sender" service="foo:sender" endpoint="sender" 
+      					 destinationService="foo:receiver" destinationEndpoint="receiver">
+        <sm:component><bean class="org.apache.servicemix.tck.SenderComponent"/></sm:component>
+      </sm:activationSpec>
+        
+
+      <sm:activationSpec componentName="receiver" service="foo:receiver" endpoint="receiver">
+        <sm:component><bean class="org.apache.servicemix.components.script.ScriptComponent">
+          <property name="scriptEngineName" value="groovy"/>
+          <property name="disableOutput" value="true"/>
+          <property name="scriptText">
+            <value>
+import org.apache.servicemix.components.script.ScriptTest
+
+System.out.println """
+Groovy script evaluated with the following variables
+context: $context
+deliveryChannel: $deliveryChannel
+exchange: $exchange
+inMessage: inMessage
+"""
+
+// lets output some values
+def result = [1, 2, 3]
+ScriptTest.setResult(result)
+            </value>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+    </sm:activationSpecs>
+  </sm:container>
+
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/validation/address/address.xsd b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/validation/address/address.xsd
new file mode 100644
index 0000000..1d2380f
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/validation/address/address.xsd
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>

+<!--

+

+    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.

+

+-->

+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

+

+  <xsd:complexType name="USAddress">

+    <xsd:sequence>

+      <xsd:element name="name" type="xsd:string"/>

+      <xsd:element name="street" type="xsd:string"/>

+      <xsd:element name="city" type="xsd:string"/>

+      <xsd:element name="state" type="xsd:string"/>

+      <xsd:element name="zip" type="xsd:decimal"/>

+    </xsd:sequence>

+    <xsd:attribute name="country" type="xsd:NMTOKEN" fixed="US"/>

+  </xsd:complexType>

+

+</xsd:schema>

diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/validation/example.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/validation/example.xml
new file mode 100644
index 0000000..c9e7732
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/validation/example.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+       xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+
+      <!-- START SNIPPET: example -->
+      <sm:activationSpec componentName="myDefaultErrorHandlerService" service="foo:myDefaultErrorHandlerService" endpoint="myDefaultErrorHandlerService" destinationService="foo:myServiceImpl">
+        <sm:component><bean class="org.apache.servicemix.components.validation.ValidateComponent">
+          <property name="schemaResource" value="classpath:org/apache/servicemix/components/validation/schema.xsd"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+
+      <sm:activationSpec componentName="myMessageAwareErrorHandlerService" service="foo:myMessageAwareErrorHandlerService" endpoint="myMessageAwareErrorHandlerService" destinationService="foo:myServiceImpl">
+        <sm:component>
+            <bean class="org.apache.servicemix.components.validation.ValidateComponent">
+                <property name="schemaResource" value="classpath:org/apache/servicemix/components/validation/schema.xsd"/>
+                <property name="errorHandlerFactory" ref="messageAggregatingErrorHandlerFactory"/>
+            </bean>
+        </sm:component>
+      </sm:activationSpec>
+
+      <!-- END SNIPPET: example -->
+
+      <!-- START SNIPPET: groovy -->
+      <sm:activationSpec componentName="myServiceImpl" service="foo:myServiceImpl" endpoint="myService">
+        <sm:component><bean class="org.apache.servicemix.components.groovy.GroovyComponent">
+          <property name="scriptText">
+            <value>
+              <![CDATA[
+if (bindings.counter == null) {
+    bindings.counter = 1
+}
+else {
+    ++bindings.counter
+}
+
+def date = new Date()
+
+outMessage.bodyText = "<response counter='$bindings.counter' date='$date'></response>"
+              ]]>
+            </value>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: groovy -->
+
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="messageAggregatingErrorHandlerFactory" class="org.apache.servicemix.components.validation.MessageAggregatingErrorHandlerFactory">
+    <property name="rootPath" value="Fault/payload/messages"/>
+    <property name="namespace" value="http://www.servicemix.org/fault"/>
+  </bean>
+
+  <bean id="defaultErrorHandlerClient" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+    <constructor-arg>
+      <!-- lets hardwire this client to talk to instances of a service by default -->
+      <sm:activationSpec destinationService="foo:myDefaultErrorHandlerService"/>
+    </constructor-arg>
+  </bean>
+
+  <bean id="messageAwareErrorHandlerClient" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+    <constructor-arg>
+      <!-- lets hardwire this client to talk to instances of a service by default -->
+      <sm:activationSpec destinationService="foo:myMessageAwareErrorHandlerService"/>
+    </constructor-arg>
+  </bean>
+
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/validation/requestInvalid.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/validation/requestInvalid.xml
new file mode 100644
index 0000000..e853959
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/validation/requestInvalid.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<wrongElement orderDate="1999-10-20">
+   <shipTo country="US">
+      <name>Alice Smith</name>
+      <street>123 Maple Street</street>
+      <city>Mill Valley</city>
+      <state>CA</state>
+      <zip>90952</zip>
+   </shipTo>
+   <billTo country="US">
+      <name>Robert Smith</name>
+      <street>8 Oak Avenue</street>
+      <city>Old Town</city>
+      <state>PA</state>
+      <zip>95819</zip>
+   </billTo>
+   <comment>Hurry, my lawn is going wild</comment>
+   <items>
+      <item partNum="872-AA">
+         <productName>Lawnmower</productName>
+         <quantity>1</quantity>
+         <USPrice>148.95</USPrice>
+         <comment>Confirm this is electric</comment>
+      </item>
+      <item partNum="926-AA">
+         <productName>Baby Monitor</productName>
+         <quantity>1</quantity>
+         <USPrice>39.98</USPrice>
+         <shipDate>1999-05-21</shipDate>
+      </item>
+   </items>
+</wrongElement>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/validation/requestValid.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/validation/requestValid.xml
new file mode 100644
index 0000000..abc29a6
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/validation/requestValid.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<purchaseOrder orderDate="1999-10-20">
+   <shipTo country="US">
+      <name>Alice Smith</name>
+      <street>123 Maple Street</street>
+      <city>Mill Valley</city>
+      <state>CA</state>
+      <zip>90952</zip>
+   </shipTo>
+   <billTo country="US">
+      <name>Robert Smith</name>
+      <street>8 Oak Avenue</street>
+      <city>Old Town</city>
+      <state>PA</state>
+      <zip>95819</zip>
+   </billTo>
+   <comment>Hurry, my lawn is going wild</comment>
+   <items>
+      <item partNum="872-AA">
+         <productName>Lawnmower</productName>
+         <quantity>1</quantity>
+         <USPrice>148.95</USPrice>
+         <comment>Confirm this is electric</comment>
+      </item>
+      <item partNum="926-AA">
+         <productName>Baby Monitor</productName>
+         <quantity>1</quantity>
+         <USPrice>39.98</USPrice>
+         <shipDate>1999-05-21</shipDate>
+      </item>
+   </items>
+</purchaseOrder>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/validation/schema.xsd b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/validation/schema.xsd
new file mode 100644
index 0000000..2fc2298
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/validation/schema.xsd
@@ -0,0 +1,75 @@
+<?xml version="1.0"?>
+<!--
+
+    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.
+
+-->
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+  <xsd:annotation>
+    <xsd:documentation xml:lang="en">
+     Purchase order schema for Example.com.
+     Copyright 2000 Example.com. All rights reserved.
+    </xsd:documentation>
+  </xsd:annotation>
+
+  <xsd:include schemaLocation="address/address.xsd"/>
+
+  <xsd:element name="purchaseOrder" type="PurchaseOrderType"/>
+
+  <xsd:element name="comment" type="xsd:string"/>
+
+  <xsd:complexType name="PurchaseOrderType">
+    <xsd:sequence>
+      <xsd:element name="shipTo" type="USAddress"/>
+      <xsd:element name="billTo" type="USAddress"/>
+      <xsd:element ref="comment" minOccurs="0"/>
+      <xsd:element name="items" type="Items"/>
+    </xsd:sequence>
+    <xsd:attribute name="orderDate" type="xsd:date"/>
+  </xsd:complexType>
+
+  <xsd:complexType name="Items">
+    <xsd:sequence>
+      <xsd:element name="item" minOccurs="0" maxOccurs="unbounded">
+        <xsd:complexType>
+          <xsd:sequence>
+            <xsd:element name="productName" type="xsd:string"/>
+            <xsd:element name="quantity">
+              <xsd:simpleType>
+                <xsd:restriction base="xsd:positiveInteger">
+                  <xsd:maxExclusive value="100"/>
+                </xsd:restriction>
+              </xsd:simpleType>
+            </xsd:element>
+            <xsd:element name="USPrice" type="xsd:decimal"/>
+            <xsd:element ref="comment" minOccurs="0"/>
+            <xsd:element name="shipDate" type="xsd:date" minOccurs="0"/>
+          </xsd:sequence>
+          <xsd:attribute name="partNum" type="SKU" use="required"/>
+        </xsd:complexType>
+      </xsd:element>
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <!-- Stock Keeping Unit, a code for identifying products -->
+  <xsd:simpleType name="SKU">
+    <xsd:restriction base="xsd:string">
+      <xsd:pattern value="\d{3}-[A-Z]{2}"/>
+    </xsd:restriction>
+  </xsd:simpleType>
+
+</xsd:schema>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/vfs/example.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/vfs/example.xml
new file mode 100644
index 0000000..de9ae6f
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/vfs/example.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+
+      <!-- START SNIPPET: send -->
+      <sm:activationSpec componentName="fileSender" service="foo:fileSender">
+        <sm:component><bean class="org.apache.servicemix.components.vfs.FileWriter">
+          <property name="path" value="file:/tmp/servicemix/vfs/test"/>
+
+          <property name="marshaler">
+            <bean class="org.apache.servicemix.components.util.DefaultFileMarshaler">
+              <property name="fileName">
+                <bean class="org.apache.servicemix.expression.JaxenStringXPathExpression">
+                  <constructor-arg value="concat('sample_', /sample/@id, '.xml')"/>
+                </bean>
+              </property>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: send -->
+
+
+
+      <!-- START SNIPPET: poll -->
+      <sm:activationSpec componentName="filePoller" service="foo:filePoller" destinationService="foo:receiver">
+        <sm:component><bean  class="org.apache.servicemix.components.vfs.FilePoller">
+          <property name="workManager" ref="workManager"/>
+          <property name="path" value="file:/tmp/servicemix/vfs/test"/>
+          <property name="period" value="1000"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: poll -->
+
+      <sm:activationSpec componentName="receiver" service="foo:receiver" endpoint="receiver">
+        <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+      </sm:activationSpec>
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+
+  <bean id="workManager" class="org.jencks.factory.WorkManagerFactoryBean"/>
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/vfs/example_win.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/vfs/example_win.xml
new file mode 100644
index 0000000..d1b9703
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/vfs/example_win.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+
+      <!-- START SNIPPET: send -->
+      <sm:activationSpec componentName="fileSender" service="foo:fileSender">
+        <sm:component><bean class="org.apache.servicemix.components.vfs.FileWriter">
+          <property name="path" value="file://c:/tmp/servicemix/vfs/test"/>
+
+          <property name="marshaler">
+            <bean class="org.apache.servicemix.components.util.DefaultFileMarshaler">
+              <property name="fileName">
+                <bean class="org.apache.servicemix.expression.JaxenStringXPathExpression">
+                  <constructor-arg value="concat('sample_', /sample/@id, '.xml')"/>
+                </bean>
+              </property>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: send -->
+
+
+
+      <!-- START SNIPPET: poll -->
+      <sm:activationSpec componentName="filePoller" service="foo:filePoller" destinationService="foo:receiver">
+        <sm:component><bean  class="org.apache.servicemix.components.vfs.FilePoller">
+          <property name="workManager" ref="workManager"/>
+          <property name="path" value="file://c:/tmp/servicemix/vfs/test"/>
+          <property name="period" value="1000"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: poll -->
+
+      <sm:activationSpec componentName="receiver" service="foo:receiver" endpoint="receiver">
+        <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+      </sm:activationSpec>
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+
+  <bean id="workManager" class="org.jencks.factory.WorkManagerFactoryBean"/>
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/wsif/example.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/wsif/example.xml
new file mode 100644
index 0000000..d403441
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/wsif/example.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- ActiveMQ message broker -->
+  <bean id="broker" class="org.apache.activemq.xbean.BrokerFactoryBean">
+    <property name="config" value="classpath:broker.xml"/>
+  </bean>
+
+  <!-- JCA container -->
+  <bean id="jencks" class="org.jencks.JCAContainer">
+
+    <!-- lets use the default configuration of work manager and transaction manager-->
+    <property name="bootstrapContext">
+      <bean class="org.jencks.factory.BootstrapContextFactoryBean">
+        <property name="threadPoolSize" value="25"/>
+      </bean>
+    </property>
+
+
+    <!-- the JCA Resource Adapter -->
+    <property name="resourceAdapter">
+      <bean id="activeMQResourceAdapter" class="org.apache.activemq.ra.ActiveMQResourceAdapter">
+        <property name="serverUrl" value="tcp://localhost:61626"/>
+      </bean>
+    </property>
+  </bean>
+
+  <!-- JBI container -->
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+      <!-- START SNIPPET: wsif -->
+      <sm:activationSpec componentName="checkAvailability" service="foo:checkAvailability">
+        <sm:component><bean class="org.apache.servicemix.components.wsif.WSIFBinding">
+          <property name="definitionResource" value="classpath:org/apache/servicemix/components/wsif/service.wsdl"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: wsif -->
+    </sm:activationSpecs>
+  </sm:container>
+
+
+  <!--
+    || an inbound message connector using a stateless, thread safe MessageListener
+    -->
+  <bean id="inboundMessageA" class="org.jencks.JCAConnector">
+
+	<property name="jcaContainer" ref="jencks" />
+
+    <!-- subscription details -->
+    <property name="activationSpec">
+      <bean class="org.apache.activemq.ra.ActiveMQActivationSpec">
+        <property name="destination" value="test.org.apache.servicemix.example.wsif"/>
+        <property name="destinationType" value="javax.jms.Queue"/>
+      </bean>
+    </property>
+
+    <property name="ref" value="jmsService"/>
+  </bean>
+
+  <bean id="jmsService" class="org.apache.servicemix.components.wsif.SampleServiceMessageListener">
+    <property name="template">
+      <bean class="org.springframework.jms.core.JmsTemplate">
+        <property name="connectionFactory">
+          <ref local="jmsFactory"/>
+        </property>
+        <property name="defaultDestinationName" value="test.org.apache.servicemix.example.wsif"/>
+        <property name="pubSubDomain" value="false"/>
+      </bean>
+    </property>
+  </bean>
+
+
+  <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory">
+    <property name="connectionFactory">
+      <bean class="org.apache.activemq.ActiveMQConnectionFactory">
+        <property name="brokerURL" value="tcp://localhost:61626"/>
+      </bean>
+    </property>
+  </bean>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+
+    <constructor-arg ref="jbi"/>
+    <constructor-arg>
+      <!-- lets hardwire this client to talk to instances of a service by default -->
+      <sm:activationSpec destinationService="foo:checkAvailability"/>
+    </constructor-arg>
+  </bean>
+
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/wsif/request.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/wsif/request.xml
new file mode 100644
index 0000000..477c83c
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/wsif/request.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<!-- START SNIPPET: request -->
+<ca:checkAvailabilityRequest xmlns:ca="http://xml.apache.org/axis/wsif/samples/jms/ServiceAvailability">
+10505
+</ca:checkAvailabilityRequest>
+<!-- END SNIPPET: request -->
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/wsif/service.wsdl b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/wsif/service.wsdl
new file mode 100644
index 0000000..c997331
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/wsif/service.wsdl
@@ -0,0 +1,76 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!--
+
+    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.
+
+-->
+<definitions name='ServiceAvailability'
+  targetNamespace='http://xml.apache.org/axis/wsif/samples/jms/ServiceAvailability'
+  xmlns:tns='http://xml.apache.org/axis/wsif/samples/jms/ServiceAvailability'
+  xmlns:format="http://schemas.xmlsoap.org/wsdl/formatbinding/"
+  xmlns:jms='http://schemas.xmlsoap.org/wsdl/jms/'
+  xmlns:xsd='http://www.w3.org/2001/XMLSchema'
+  xmlns='http://schemas.xmlsoap.org/wsdl/'>
+
+  <!-- START SNIPPET: wsdl -->
+  <message name='checkAvailabilityRequest'>
+    <part name='zipCode' type='xsd:string'/>
+  </message>
+
+  <message name='checkAvailabilityResponse'>
+    <part name='result' type='xsd:string'/>
+  </message>
+
+  <portType name='CheckAvailabilityPortType'>
+    <operation name='checkAvailability'>
+      <input message='tns:checkAvailabilityRequest'/>
+      <output message='tns:checkAvailabilityResponse'/>
+    </operation>
+  </portType>
+
+  <binding name='CheckAvailabilityJMSBinding' type='tns:CheckAvailabilityPortType'>
+    <jms:binding type="TextMessage"/>
+    <format:typeMapping encoding="XML" style="Java">
+      <format:typeMap typeName="xsd:string" formatType="java.lang.String"/>
+    </format:typeMapping>
+    <operation name='checkAvailability'>
+      <input>
+        <jms:input parts="zipCode"/>
+        <jms:property message="Request" part="myInt"/>
+        <jms:propertyValue name="myLiteralString" type="xsd:string" value="Hello World"/>
+      </input>
+      <output>
+        <jms:output parts="result"/>
+      </output>
+    </operation>
+  </binding>
+  <!-- END SNIPPET: wsdl -->
+
+  <!-- START SNIPPET: wsif -->
+  <service name='CheckServiceAvailability'>
+    <port name='CheckAvailabilityPort'  binding='tns:CheckAvailabilityJMSBinding'>
+
+      <!-- ActiveMQ configuration -->
+      <jms:address destinationStyle="queue"
+        jndiDestinationName="dynamicQueues/test.org.apache.servicemix.example.wsif"
+        jndiConnectionFactoryName="ConnectionFactory"
+        initialContextFactory="org.apache.activemq.jndi.ActiveMQInitialContextFactory"
+        jndiProviderURL="tcp://localhost:61626"/>
+    </port>
+  </service>
+  <!-- END SNIPPET: wsif -->
+</definitions>
+
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xfire/echo.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xfire/echo.xml
new file mode 100644
index 0000000..9b8fa53
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xfire/echo.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
+ <env:Body>
+  <m:echo xmlns:m="http://xfire.components.servicemix.org">
+   <m:in0>Yo Yo</m:in0>
+  </m:echo>
+ </env:Body>
+</env:Envelope>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xfire/oneway.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xfire/oneway.xml
new file mode 100644
index 0000000..ded2a04
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xfire/oneway.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
+ <env:Body>
+  <m:receive xmlns:m="http://xfire.components.servicemix.org">
+   <m:in0>Yo Yo</m:in0>
+  </m:receive>
+ </env:Body>
+</env:Envelope>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xfire/xfire-inout.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xfire/xfire-inout.xml
new file mode 100644
index 0000000..36ed789
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xfire/xfire-inout.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:xfire="http://xfire.components.servicemix.org">
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+      <sm:activationSpec componentName="sender" service="xfire:sender" destinationService="xfire:OneWayService">
+        <sm:component><bean class="org.apache.servicemix.tck.SenderComponent"/></sm:component>
+      </sm:activationSpec>
+
+      <!-- START SNIPPET: xfire -->
+      <sm:activationSpec componentName="binding" service="xfire:Echo">
+        <sm:component><bean class="org.apache.servicemix.components.xfire.XFireBinding">
+          <property name="xfire" ref="xfire"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: xfire -->
+    </sm:activationSpecs>
+  </sm:container>
+  
+  <!-- The Service Bean -->
+  <bean id="xfireReceiverService" class="org.apache.servicemix.components.xfire.Echo" singleton="true"/>
+  
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+ 
+  <bean name="Echo" class="org.codehaus.xfire.spring.ServiceBean">
+    <property name="serviceBean" ref="xfireReceiverService"/>
+    <property name="serviceFactory" ref="xfire.serviceFactory"/>
+    <property name="xfire" ref="xfire"/>
+  </bean>
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xfire/xfire-out.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xfire/xfire-out.xml
new file mode 100644
index 0000000..eda6cf0
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xfire/xfire-out.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:xfire="http://xfire.components.servicemix.org">
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+      <sm:activationSpec componentName="sender" endpoint="sender" service="xfire:sender" destinationService="xfire:OneWayService">
+        <sm:component><bean class="org.apache.servicemix.tck.SenderComponent"/></sm:component>
+      </sm:activationSpec>
+
+      <!-- START SNIPPET: xfire -->
+      <sm:activationSpec componentName="binding" service="xfire:OneWayService">
+        <sm:component><bean class="org.apache.servicemix.components.xfire.XFireOutBinding">
+          <property name="xfire" ref="xfire"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: xfire -->
+    </sm:activationSpecs>
+  </sm:container>
+
+  <!-- The Service Bean -->
+  <bean id="xfireReceiverService" class="org.apache.servicemix.components.xfire.OneWayService" singleton="true"/>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+  
+  <bean id="messageServiceFactory" 
+        class="org.codehaus.xfire.service.binding.ObjectServiceFactory"
+        singleton="true">
+    <constructor-arg index="0">
+        <ref bean="xfire.transportManager"/>
+    </constructor-arg>
+    <constructor-arg index="1">
+        <ref bean="xfire.aegisBindingProvider"/>
+    </constructor-arg>
+    <property name="voidOneWay" value="true"/>
+    <property name="style" value="message"/>
+  </bean>
+  
+  <bean name="OneWayService" class="org.codehaus.xfire.spring.ServiceBean">
+    <property name="serviceBean" ref="xfireReceiverService"/>
+    <property name="serviceFactory" ref="messageServiceFactory"/>
+    <property name="xfire" ref="xfire"/>
+  </bean>
+
+</beans>
+
+
+
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/example.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/example.xml
new file mode 100644
index 0000000..a9a57f5
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/example.xml
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <bean id="broker" class="org.apache.activemq.xbean.BrokerFactoryBean" singleton="true">
+    <property name="config" value="classpath:broker.xml"/>
+  </bean>
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" depends-on="broker" embedded="true">
+    <sm:activationSpecs>
+
+      <!-- START SNIPPET: send -->
+      <sm:activationSpec componentName="myJmsSender" service="foo:myJmsSender">
+        <sm:component><bean class="org.apache.servicemix.components.jms.JmsSenderComponent">
+          <property name="template">
+            <bean class="org.springframework.jms.core.JmsTemplate">
+              <property name="connectionFactory">
+                <ref local="jmsFactory"/>
+              </property>
+              <property name="defaultDestinationName" value="test.org.apache.servicemix.components.xslt.source"/>
+              <property name="pubSubDomain" value="true"/>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: send -->
+
+      <!-- lets subscribe, transform and republish -->
+      <!-- START SNIPPET: receive -->
+      <sm:activationSpec componentName="myJmsReceiver" service="foo:myJmsReceiver" destinationService="foo:transformer">
+        <sm:component><bean class="org.apache.servicemix.components.jms.JmsReceiverComponent">
+          <property name="template">
+            <bean class="org.springframework.jms.core.JmsTemplate">
+              <property name="connectionFactory">
+                <ref local="jmsFactory"/>
+              </property>
+              <property name="defaultDestinationName" value="test.org.apache.servicemix.components.xslt.source"/>
+              <property name="pubSubDomain" value="true"/>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: receive -->
+
+      <!-- START SNIPPET: xslt -->
+      <sm:activationSpec componentName="transformer" service="foo:transformer" destinationService="foo:transformedSender">
+        <sm:component><bean class="org.apache.servicemix.components.xslt.XsltComponent">
+          <property name="xsltResource" value="classpath:org/apache/servicemix/components/xslt/transform.xsl"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: xslt -->
+
+
+      <sm:activationSpec componentName="transformedSender" service="foo:transformedSender">
+        <sm:component><bean class="org.apache.servicemix.components.jms.JmsSenderComponent">
+          <property name="template">
+            <bean class="org.springframework.jms.core.JmsTemplate">
+              <property name="connectionFactory">
+                <ref local="jmsFactory"/>
+              </property>
+              <property name="defaultDestinationName" value="test.org.apache.servicemix.components.xslt.result"/>
+              <property name="pubSubDomain" value="true"/>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+
+
+      <!-- ultimate endpoint -->
+      <sm:activationSpec componentName="resultReader" service="foo:resultReader" destinationService="foo:receiver">
+        <sm:component><bean class="org.apache.servicemix.components.jms.JmsReceiverComponent">
+          <property name="template">
+            <bean class="org.springframework.jms.core.JmsTemplate">
+              <property name="connectionFactory">
+                <ref local="jmsFactory"/>
+              </property>
+              <property name="defaultDestinationName" value="test.org.apache.servicemix.components.xslt.result"/>
+              <property name="pubSubDomain" value="true"/>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+
+      <sm:activationSpec componentName="receiver" service="foo:receiver" endpoint="receiver">
+        <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+      </sm:activationSpec>
+
+
+      <!-- just to test that we are sending messages, lets trace the messages we receive -->
+      <!-- START SNIPPET: log -->
+      <sm:activationSpec componentName="jmsTrace" service="foo:jmsTrace" destinationService="foo:trace">
+        <sm:component><bean class="org.apache.servicemix.components.jms.JmsReceiverComponent">
+          <property name="template">
+            <bean class="org.springframework.jms.core.JmsTemplate">
+              <property name="connectionFactory">
+                <ref local="jmsFactory"/>
+              </property>
+              <property name="defaultDestinationName" value="test.org.apache.servicemix.components.xslt.result"/>
+              <property name="pubSubDomain" value="true"/>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+
+      <sm:activationSpec componentName="trace" service="foo:trace">
+        <sm:component><bean class="org.apache.servicemix.components.util.TraceComponent"/></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: log -->
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+
+  <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory">
+    <property name="connectionFactory">
+      <bean class="org.apache.activemq.ActiveMQConnectionFactory">
+        <property name="brokerURL" value="tcp://localhost:61626"/>
+      </bean>
+    </property>
+  </bean>
+
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/optional-axis-example.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/optional-axis-example.xml
new file mode 100644
index 0000000..7be4288
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/optional-axis-example.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0"
+    xmlns:foo="http://servicemix.org/cheese/">
+
+    <sm:container id="jbi" embedded="true">
+        <sm:activationSpecs>
+
+            <sm:activationSpec componentName="transformer" service="foo:transformer">
+                <sm:component>
+                    <bean class="org.apache.servicemix.components.xslt.XsltComponent">
+                        <property name="xsltResource" value="classpath:org/apache/servicemix/components/xslt/optional-axis.xsl"/>
+
+                        <!-- lets disable automatic output of the result of the transform; only if we perform
+                            an invoke in the XSLT will we invoke another endpoint -->
+                        <property name="disableOutput" value="true"/>
+                    </bean>
+                </sm:component>
+            </sm:activationSpec>
+
+
+            <sm:activationSpec componentName="service1" service="foo:service1">
+                <sm:component>
+                    <bean class="org.apache.servicemix.tck.ReceiverComponent"/>
+                </sm:component>
+            </sm:activationSpec>
+
+            <sm:activationSpec componentName="service2" service="foo:service2">
+               <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+            </sm:activationSpec>
+
+            <sm:activationSpec componentName="service3" service="foo:service3">
+               <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+            </sm:activationSpec>
+
+            <sm:activationSpec componentName="service4" service="foo:service4">
+               <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+            </sm:activationSpec>
+
+            <sm:activationSpec componentName="service5" service="foo:service5">
+               <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+            </sm:activationSpec>
+
+            <sm:activationSpec componentName="service6" service="foo:service6">
+               <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+            </sm:activationSpec>
+
+            <sm:activationSpec componentName="receiver" service="foo:receiver">
+                <sm:component>
+                    <bean class="org.apache.servicemix.tck.ReceiverComponent"/>
+                </sm:component>
+            </sm:activationSpec>
+
+
+            <sm:activationSpec componentName="trace" service="foo:trace">
+                <sm:component>
+                    <bean class="org.apache.servicemix.components.util.TraceComponent"/>
+                </sm:component>
+            </sm:activationSpec>
+
+        </sm:activationSpecs>
+    </sm:container>
+
+    <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+        <constructor-arg ref="jbi"/>
+    </bean>
+
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/optional-axis.xsl b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/optional-axis.xsl
new file mode 100644
index 0000000..de749ea
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/optional-axis.xsl
@@ -0,0 +1,79 @@
+<?xml version="1.0"?>

+<!--

+

+    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.

+

+-->

+<!-- START SNIPPET: route -->

+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

+    xmlns:jbi="xalan://org.apache.servicemix.components.xslt.XalanExtension"

+    extension-element-prefixes="jbi"

+

+    xmlns:foo="http://servicemix.org/cheese/"

+

+    xmlns:prod="http://foo.org/prod" xmlns:ms="http://foo.org/ms" xmlns:xsi="http://foo.org/msi"

+

+    version="1.0">

+

+    <!--xsl:strip-space elements="*"/-->

+    <xsl:template match="/">

+

+        <jbi:invoke service="foo:service1">

+            <jbi:copyProperties/>

+            <jbi:setOutProperty name="foo" select="prod:resolveItemXrefResponse/prod:response/ms:Values/ms:Item[position() = 1]"/>

+            <xsl:copy-of select="/"/>

+        </jbi:invoke>

+

+        <jbi:invoke service="foo:service2">

+            <jbi:copyProperties/>

+            <jbi:setOutProperty name="foo" select="prod:resolveItemXrefResponse/prod:response/ms:Values/ms:Item[position() = 2]"/>

+            <xsl:copy-of select="/"/>

+        </jbi:invoke>

+

+        <jbi:invoke service="foo:service3">

+            <jbi:copyProperties/>

+            <jbi:setOutProperty name="foo" select="prod:resolveItemXrefResponse/prod:response/ms:Values/ms:Item[position() = 3]"/>

+            <xsl:copy-of select="/"/>

+        </jbi:invoke>

+

+        <jbi:invoke service="foo:service4">

+            <jbi:copyProperties/>

+            <jbi:setOutProperty name="foo" select="prod:resolveItemXrefResponse/prod:response/ms:Values/ms:Item[position() = 4]"/>

+            <xsl:copy-of select="/"/>

+        </jbi:invoke>

+

+        <jbi:invoke service="foo:service5">

+            <jbi:copyProperties/>

+            <jbi:setOutProperty name="foo" select="count(prod:resolveItemXrefResponse/prod:response/ms:Keys/ms:Item[text()='MSTR']/preceding-sibling::*) + 1"/>

+            <xsl:copy-of select="/"/>

+        </jbi:invoke>

+

+        <jbi:invoke service="foo:service6">

+            <jbi:copyProperties/>

+            <jbi:setOutProperty name="foo" select="prod:resolveItemXrefResponse/prod:response/ms:Values/ms:Item[position() = count(prod:resolveItemXrefResponse/prod:response/ms:Keys/ms:Item[text()='MSTR']/preceding-sibling::*) + 1]"/>

+            <xsl:copy-of select="/"/>

+        </jbi:invoke>

+

+        <jbi:invoke service="foo:receiver">

+            <jbi:copyProperties/>

+            <jbi:setOutProperty name="bar" select="/"/>

+            <xsl:copy-of select="/"/>

+        </jbi:invoke>

+

+    </xsl:template>

+    <!-- /prod:resolveItemXrefResponse/prod:response/ms:Values/ms:Item[position()=count(/prod:resolveItemXrefResponse/prod:response/ms:Keys/ms:Item[text()='MSTR']/preceding-sibling::*) + 1])-->

+</xsl:stylesheet>

+<!-- END SNIPPET: route -->

diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/parameter-test.xsl b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/parameter-test.xsl
new file mode 100644
index 0000000..4a2d6fb
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/parameter-test.xsl
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>

+<!--

+

+    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.

+

+-->

+<xsl:stylesheet

+  xmlns:xsl='http://www.w3.org/1999/XSL/Transform'

+  version='1.0'>

+

+  <xsl:output method="xml" indent="yes" encoding="ISO-8859-1"/>

+

+  <xsl:param name="stringParam"/>

+  <xsl:param name="integerParam"/>

+

+  <xsl:template match="*">

+  <rootNode>

+     <param><xsl:value-of select="$stringParam"/></param>

+     <integer><xsl:value-of select="$integerParam"/></integer>

+    </rootNode>

+  </xsl:template>

+

+</xsl:stylesheet>

diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/pipeline.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/pipeline.xml
new file mode 100644
index 0000000..fd258c8
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/pipeline.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<!-- START SNIPPET: pipeline -->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/demo/pipeline/">
+
+  <!-- the JBI container and its components -->
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+
+      <sm:activationSpec componentName="myJmsReceiver" service="foo:myJmsReceiver" destinationService="foo:transformer">
+        <sm:component><bean class="org.apache.servicemix.components.jms.JmsReceiverComponent">
+          <property name="template">
+            <bean class="org.springframework.jms.core.JmsTemplate">
+              <property name="connectionFactory">
+                <ref local="jmsFactory"/>
+              </property>
+              <property name="defaultDestinationName" value="demo.cheese.source"/>
+              <property name="pubSubDomain" value="true"/>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+
+      <sm:activationSpec componentName="transformer" service="foo:transformer" destinationService="foo:transformedSender">
+        <sm:component><bean class="org.apache.servicemix.components.xslt.XsltComponent">
+          <property name="xsltResource" value="classpath:org/apache/servicemix/components/xslt/transform.xsl"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+
+      <sm:activationSpec componentName="transformedSender" service="foo:transformedSender">
+        <sm:component><bean class="org.apache.servicemix.components.jms.JmsSenderComponent">
+          <property name="template">
+            <bean class="org.springframework.jms.core.JmsTemplate">
+              <property name="connectionFactory">
+                <ref local="jmsFactory"/>
+              </property>
+              <property name="defaultDestinationName" value="demo.cheese.result"/>
+              <property name="pubSubDomain" value="true"/>
+            </bean>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory">
+    <property name="connectionFactory">
+      <bean class="org.apache.activemq.ActiveMQConnectionFactory">
+        <property name="brokerURL" value="vm://localhost?broker.persistent=false"/>
+      </bean>
+    </property>
+  </bean>
+
+</beans>
+
+<!-- END SNIPPET: pipeline -->
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/publish.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/publish.xml
new file mode 100644
index 0000000..9dd1e98
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/publish.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+
+      <!-- START SNIPPET: xslt -->
+      <sm:activationSpec componentName="transformer" service="foo:transformer">
+        <sm:component><bean class="org.apache.servicemix.components.xslt.XsltComponent">
+          <property name="xsltResource" value="classpath:org/apache/servicemix/components/xslt/publish.xsl"/>
+
+          <!-- lets disable automatic output of the result of the transform; only if we perform
+              an invoke in the XSLT will we invoke another endpoint -->
+          <property name="disableOutput" value="true"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: xslt -->
+
+
+      <sm:activationSpec componentName="service1" service="foo:service1">
+        <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+      </sm:activationSpec>
+      <sm:activationSpec componentName="service2" service="foo:service2">
+        <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+      </sm:activationSpec>
+      <sm:activationSpec componentName="service3" service="foo:service3">
+        <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+      </sm:activationSpec>
+
+      <sm:activationSpec componentName="receiver" service="foo:receiver">
+        <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+      </sm:activationSpec>
+
+      <sm:activationSpec componentName="trace" service="foo:trace">
+        <sm:component><bean class="org.apache.servicemix.components.util.TraceComponent"/></sm:component>
+      </sm:activationSpec>
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/publish.xsl b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/publish.xsl
new file mode 100644
index 0000000..29a1d5b
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/publish.xsl
@@ -0,0 +1,61 @@
+<?xml version="1.0"?>
+<!--
+
+    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.
+
+-->
+<!-- START SNIPPET: route -->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:jbi="xalan://org.apache.servicemix.components.xslt.XalanExtension"
+                extension-element-prefixes="jbi"
+
+                xmlns:foo="http://servicemix.org/cheese/"
+                version="1.0">
+
+  <xsl:strip-space elements="*"/>
+
+  <xsl:template match="/">
+
+    <!-- lets invoke a number of services one after the other -->
+    <jbi:invoke service="foo:service1">
+      <jbi:copyProperties/>
+      <jbi:setOutProperty name="foo" select="/sample"/>
+      <xsl:copy-of select="/"/>
+    </jbi:invoke>
+
+    <jbi:invoke service="foo:service2">
+      <jbi:copyProperties/>
+      <jbi:setOutProperty name="bar" select="/sample/@id"/>
+      <xsl:copy-of select="/"/>
+    </jbi:invoke>
+
+    <jbi:invoke service="foo:service3">
+      <jbi:copyProperties/>
+      <jbi:setOutProperty name="foo" select="string(/sample)"/>
+      <jbi:setOutProperty name="bar" select="string(/sample/@id)"/>
+      <xsl:copy-of select="/"/>
+    </jbi:invoke>
+
+    <jbi:invoke service="foo:receiver">
+      <jbi:copyProperties/>
+      <jbi:setOutProperty name="bar" select="/sample/@id"/>
+      <xsl:copy-of select="/"/>
+    </jbi:invoke>
+
+  </xsl:template>
+
+</xsl:stylesheet>
+<!-- END SNIPPET: route -->
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/router-example.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/router-example.xml
new file mode 100644
index 0000000..28821ff
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/router-example.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" embedded="true">
+    <sm:activationSpecs>
+
+      <!-- START SNIPPET: xslt -->
+      <sm:activationSpec componentName="transformer" service="foo:transformer">
+        <sm:component><bean class="org.apache.servicemix.components.xslt.XsltComponent">
+          <property name="xsltResource" value="classpath:org/apache/servicemix/components/xslt/router.xsl"/>
+
+          <!-- lets disable automatic output of the result of the transform; only if we perform
+              an invoke in the XSLT will we invoke another endpoint -->
+          <property name="disableOutput" value="true"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: xslt -->
+
+
+      <sm:activationSpec componentName="receiver" service="foo:receiver">
+        <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+      </sm:activationSpec>
+
+      <sm:activationSpec componentName="trace" service="foo:trace">
+        <sm:component><bean class="org.apache.servicemix.components.util.TraceComponent"/></sm:component>
+      </sm:activationSpec>
+
+      <sm:activationSpec componentName="script" service="foo:script">
+        <sm:component><bean class="org.apache.servicemix.components.groovy.GroovyComponent">
+          <property name="disableOutput" value="true"/>
+
+          <property name="scriptText">
+            <value>
+              <![CDATA[
+
+println """
+
+########################################
+## script called with message: $inMessage
+## properties:                 $inMessage.properties
+## XML content:                $inMessage.bodyText
+########################################
+
+"""
+              ]]>
+            </value>
+          </property>
+        </bean></sm:component>
+      </sm:activationSpec>
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/router.xsl b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/router.xsl
new file mode 100644
index 0000000..7470916
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/router.xsl
@@ -0,0 +1,58 @@
+<?xml version="1.0"?>
+<!--
+
+    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.
+
+-->
+<!-- START SNIPPET: route -->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+  xmlns:jbi="xalan://org.apache.servicemix.components.xslt.XalanExtension"
+  extension-element-prefixes="jbi"
+
+  xmlns:foo="http://servicemix.org/cheese/"
+  version="1.0">
+
+  <xsl:template match="/*">
+    <xsl:choose>
+
+      <!-- lets forward the inbound message to a service -->
+      <xsl:when test="@id = '4'">
+        <jbi:forward service="foo:trace"/>
+      </xsl:when>
+
+      <!-- lets generate the output XML to use as input, copy the input properties and define some new propertes -->
+      <xsl:when test="@id = '12'">
+        <jbi:invoke service="foo:script">
+          <jbi:copyProperties/>
+          <jbi:setOutProperty name="foo" select="@sent"/>
+          <cheese code="{@id}">
+            <description>This is some content generated from the routing XSL</description>
+          </cheese>
+        </jbi:invoke>
+      </xsl:when>
+
+      <xsl:when test="@id != '2'">
+        <jbi:forward service="foo:receiver"/>
+      </xsl:when>
+
+      <xsl:otherwise>
+        <jbi:forward service="foo:trace"/>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+
+</xsl:stylesheet>
+<!-- END SNIPPET: route -->
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/servicemix-parameter-test.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/servicemix-parameter-test.xml
new file mode 100644
index 0000000..6c9a2de
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/servicemix-parameter-test.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<!--

+

+    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.

+

+-->

+<beans xmlns:sm="http://servicemix.apache.org/config/1.0"

+          xmlns:foo="http://servicemix.org/cheese/">

+

+  <!-- the JBI container -->

+  <sm:container id="jbi" embedded="true">

+    <sm:activationSpecs>

+

+      <!-- START SNIPPET: xslt -->

+      <sm:activationSpec componentName="transformer" service="foo:transformer">

+        <sm:component><bean class="org.apache.servicemix.components.xslt.XsltComponent">

+          <property name="xsltResource" value="classpath:org/apache/servicemix/components/xslt/parameter-test.xsl"/>

+          <property name="xsltParameters">

+              <map>

+                  <entry key="stringParam" value="cheeseyCheese"/>

+                  <entry key="integerParam" value-ref="javaIntegerObject"/>

+              </map>

+          </property>

+        </bean></sm:component>

+      </sm:activationSpec>

+      <!-- END SNIPPET: xslt -->

+

+    </sm:activationSpecs>

+  </sm:container>

+

+  <bean id="javaIntegerObject" class="java.lang.Integer">

+      <constructor-arg index="0" value="4002"/>

+  </bean>

+

+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">

+    <constructor-arg ref="jbi"/>

+  </bean>

+

+

+</beans>

diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/split.xml b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/split.xml
new file mode 100644
index 0000000..4195927
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/split.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:sm="http://servicemix.apache.org/config/1.0" 
+	   xmlns:foo="http://servicemix.org/cheese/">
+
+  <!-- the JBI container -->
+  <sm:container id="jbi" flowName="st">
+    <sm:activationSpecs>
+
+      <!-- START SNIPPET: xslt -->
+      <sm:activationSpec componentName="transformer" service="foo:transformer">
+        <sm:component><bean class="org.apache.servicemix.components.xslt.XsltComponent">
+          <property name="xsltResource" value="classpath:org/apache/servicemix/components/xslt/split.xsl"/>
+
+          <!-- lets disable automatic output of the result of the transform; only if we perform
+              an invoke in the XSLT will we invoke another endpoint -->
+          <property name="disableOutput" value="true"/>
+        </bean></sm:component>
+      </sm:activationSpec>
+      <!-- END SNIPPET: xslt -->
+
+
+      <sm:activationSpec componentName="service1" service="foo:service1">
+        <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+      </sm:activationSpec>
+      <sm:activationSpec componentName="service2" service="foo:service2">
+        <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+      </sm:activationSpec>
+      <sm:activationSpec componentName="service3" service="foo:service3">
+        <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+      </sm:activationSpec>
+
+      <sm:activationSpec componentName="receiver" service="foo:receiver">
+        <sm:component><bean class="org.apache.servicemix.tck.ReceiverComponent"/></sm:component>
+      </sm:activationSpec>
+
+      <sm:activationSpec componentName="trace" service="foo:trace">
+        <sm:component><bean class="org.apache.servicemix.components.util.TraceComponent"/></sm:component>
+      </sm:activationSpec>
+    </sm:activationSpecs>
+  </sm:container>
+
+  <bean id="client" class="org.apache.servicemix.client.DefaultServiceMixClient">
+    <constructor-arg ref="jbi"/>
+  </bean>
+</beans>
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/split.xsl b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/split.xsl
new file mode 100644
index 0000000..d369bd5
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/split.xsl
@@ -0,0 +1,54 @@
+<?xml version="1.0"?>
+<!--
+
+    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.
+
+-->
+<!-- START SNIPPET: example -->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:jbi="xalan://org.apache.servicemix.components.xslt.XalanExtension"
+                extension-element-prefixes="jbi"
+                xmlns:foo="http://servicemix.org/cheese/" version="1.0">
+
+  <xsl:template match="/">
+
+    <!-- lets pass a new message body -->
+    <jbi:invoke service="foo:service1">
+      <cheese id="{/foo/@id}">Edam</cheese>
+    </jbi:invoke>
+
+    <!--  lets split the message  -->
+    <jbi:invoke service="foo:service2">
+      <xsl:copy-of select="/foo/beer"/>
+    </jbi:invoke>
+
+    <!-- 1-many split -->
+    <xsl:for-each select="/foo/lineitem">
+      <jbi:invoke service="foo:service3">
+        <xsl:copy-of select="."/>
+      </jbi:invoke>
+    </xsl:for-each>
+
+    <!--  pass the  entire message to the final endpoint  -->
+    <jbi:invoke service="foo:receiver">
+      <jbi:copyProperties/>
+      <jbi:setOutProperty name="bar" select="/sample/@id"/>
+      <xsl:copy-of select="/"/>
+    </jbi:invoke>
+
+  </xsl:template>
+</xsl:stylesheet>
+<!-- END SNIPPET: example -->
diff --git a/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/transform.xsl b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/transform.xsl
new file mode 100644
index 0000000..127dc07
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/org/apache/servicemix/components/xslt/transform.xsl
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+
+    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.
+
+-->
+<xsl:stylesheet
+  xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
+  version='1.0'>
+
+  <xsl:output method="xml" indent="yes" encoding="ISO-8859-1"/>
+
+  <xsl:template match="*">
+    <xsl:copy>
+      <xsl:copy-of select="attribute::*"/>
+      <xsl:apply-templates/>
+    </xsl:copy>
+  </xsl:template>
+
+  <xsl:template match="sample">
+    <transformed>
+      <cheese>
+        <xsl:apply-templates select="*|@*"/>
+      </cheese>
+    </transformed>
+  </xsl:template>
+
+</xsl:stylesheet>
diff --git a/common/servicemix-components/src/test/resources/xbean/xbean.xml b/common/servicemix-components/src/test/resources/xbean/xbean.xml
new file mode 100644
index 0000000..7f9b860
--- /dev/null
+++ b/common/servicemix-components/src/test/resources/xbean/xbean.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns:x="java://org.apache.servicemix.components.xbean">
+
+  <classpath>
+    <location>SpringLoaderTest.jar</location>
+  </classpath>
+
+  <x:EndpointSpec
+  				xmlns:foo="http://foo.bar.com"
+  				serviceName="foo:myService"
+  				endpointName="myEndpoint">
+  	<pojo>
+  		<bean class="TestClass"/>
+  	</pojo>
+  </x:EndpointSpec>
+
+</beans>
diff --git a/distributions/apache-servicemix/pom.xml b/distributions/apache-servicemix/pom.xml
index 93df0da..6ebb1b4 100644
--- a/distributions/apache-servicemix/pom.xml
+++ b/distributions/apache-servicemix/pom.xml
@@ -59,6 +59,10 @@
         </dependency>
         <dependency>
             <groupId>org.apache.servicemix</groupId>
+            <artifactId>servicemix-components</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.servicemix</groupId>
             <artifactId>servicemix-common</artifactId>
         </dependency>
         <dependency>
diff --git a/distributions/apache-servicemix/src/main/assembly/unix-bin.xml b/distributions/apache-servicemix/src/main/assembly/unix-bin.xml
index 7591969..d0de665 100644
--- a/distributions/apache-servicemix/src/main/assembly/unix-bin.xml
+++ b/distributions/apache-servicemix/src/main/assembly/unix-bin.xml
@@ -112,6 +112,7 @@
         <dependencySet>
             <outputDirectory>extras</outputDirectory>
             <includes>
+                <include>org.apache.servicemix:servicemix-components</include>
                 <include>org.apache.servicemix:servicemix-beanflow</include>
             </includes>
         </dependencySet>
diff --git a/distributions/apache-servicemix/src/main/assembly/windows-bin.xml b/distributions/apache-servicemix/src/main/assembly/windows-bin.xml
index b3e850d..952856d 100644
--- a/distributions/apache-servicemix/src/main/assembly/windows-bin.xml
+++ b/distributions/apache-servicemix/src/main/assembly/windows-bin.xml
@@ -104,6 +104,7 @@
         <dependencySet>
             <outputDirectory>extras</outputDirectory>
             <includes>
+                <include>org.apache.servicemix:servicemix-components</include>
                 <include>org.apache.servicemix:servicemix-beanflow</include>
             </includes>
         </dependencySet>
diff --git a/pom.xml b/pom.xml
index 46525db..621e5dc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -81,7 +81,7 @@
         <servicemix-mail-version>2011.01</servicemix-mail-version>
         <servicemix-osworkflow-version>2011.01</servicemix-osworkflow-version>
         <servicemix-wsn2005-version>2011.01</servicemix-wsn2005-version>
-        <servicemix-lwcontainer-version>3.4-SNAPSHOT</servicemix-lwcontainer-version>
+        <servicemix-lwcontainer-version>${project.version}</servicemix-lwcontainer-version>
         <servicemix-bean-version>2011.01</servicemix-bean-version>
         <servicemix-eip-version>2011.01</servicemix-eip-version>
         <servicemix-script-version>2011.01</servicemix-script-version>
@@ -150,6 +150,7 @@
             <modules>
                 <module>parent</module>
                 <module>core</module>
+                <module>common</module>
                 <module>deployables</module>
                 <module>servicemix-itests</module>
                 <module>samples</module>
@@ -193,6 +194,7 @@
             <id>deploy</id>
             <modules>
                 <module>core</module>
+                <module>common</module>
                 <module>servicemix-itests</module>
                 <module>samples</module>
                 <module>web</module>
@@ -239,6 +241,7 @@
             <modules>
                 <module>parent</module>
                 <module>core</module>
+                <module>common</module>
                 <module>servicemix-itests</module>
                 <module>samples</module>
                 <module>web</module>
@@ -464,6 +467,11 @@
                 <version>${project.version}</version>
             </dependency>
             <dependency>
+                <groupId>org.apache.servicemix</groupId>
+                <artifactId>servicemix-components</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
                 <groupId>org.apache.servicemix.geronimo</groupId>
                 <artifactId>deployer-service</artifactId>
                 <version>${project.version}</version>
@@ -988,6 +996,11 @@
                 <version>${derby-version}</version>
             </dependency>
             <dependency>
+                <groupId>drools</groupId>
+                <artifactId>drools-all-jdk1.4</artifactId>
+                <version>2.1</version>
+            </dependency>
+            <dependency>
                 <groupId>org.drools</groupId>
                 <artifactId>drools-core</artifactId>
                 <version>5.1.1</version>
@@ -1137,6 +1150,11 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.geronimo.specs</groupId>
+                <artifactId>geronimo-servlet_2.4_spec</artifactId>
+                <version>1.1</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.geronimo.specs</groupId>
                 <artifactId>geronimo-servlet_3.0_spec</artifactId>
                 <version>1.0</version>
             </dependency>
@@ -1364,6 +1382,11 @@
                 <version>1.0</version>
             </dependency>
             <dependency>
+                <groupId>quartz</groupId>
+                <artifactId>quartz</artifactId>
+                <version>1.5.2</version>
+            </dependency>
+            <dependency>
                 <groupId>org.quartz-scheduler</groupId>
                 <artifactId>quartz</artifactId>
                 <version>1.8.3</version>