diff --git a/bundles/cxf/pom.xml b/bundles/cxf/pom.xml
deleted file mode 100644
index 13b01a4..0000000
--- a/bundles/cxf/pom.xml
+++ /dev/null
@@ -1,131 +0,0 @@
-<?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.ejb3.bundles</groupId>
-        <artifactId>bundles</artifactId>
-        <version>1.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.bundles</groupId>
-    <artifactId>org.apache.servicemix.bundles.cxf-2.0.5</artifactId>
-    <version>1.0-SNAPSHOT</version>
-    <packaging>bundle</packaging>
-    <name>ServiceMix OSGI Common Bundles: cxf</name>
-    <description>
-        This bundle simply wraps cxf ${pkgVersion}.
-    </description>
-
-    <properties>
-        <pkgVersion>2.0.5.incubator</pkgVersion>
-		<servicemix.osgi.export>
-            org.apache.cxf*;version=${pkgVersion};-split-package:=merge-first,
-            org.xmlsoap.schemas*;version=${pkgVersion};-split-package:=merge-first,
-            '=META-INF.cxf'
-        </servicemix.osgi.export>
-        <servicemix.osgi.import.pkg>
-            com.ibm*;resolution:=optional,
-            com.sun*;resolution:=optional,
-            javanet.staxutils*;resolution:=optional,
-            javax.jms*;resolution:=optional,
-            javax.xml.soap,
-            junit.framework*;resolution:=optional,
-            org.apache.commons.lang*;resolution:=optional,
-            org.apache.log4j*;resolution:=optional,
-            org.apache.tools.ant*;resolution:=optional,
-            org.apache.velocity*;resolution:=optional,
-            org.apache.xmlbeans*;resolution:=optional,
-            org.apache.ws.security*;resolution:=optional,
-            org.codehaus.jra*;resolution:=optional,
-            org.jdom*;resolution:=optional,
-            org.junit*;resolution:=optional,
-            org.mortbay*;resolution:=optional,
-            org.mozilla.javascript*;resolution:=optional,
-            org.springframework*;resolution:=optional,
-            *
-        </servicemix.osgi.import.pkg>
-        <servicemix.osgi.private.pkg>
-            META-INF*;-split-package:=merge-first,
-            schemas*;-split-package:=merge-first
-        </servicemix.osgi.private.pkg>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.cxf</groupId>
-            <artifactId>cxf-bundle</artifactId>
-            <version>2.0.5-incubator</version>
-            <optional>true</optional>
-        </dependency>
-
-        <!-- Dependency on other bundles -->
-        <dependency>
-            <groupId>org.apache.ws.commons.schema</groupId>
-            <artifactId>XmlSchema</artifactId>
-            <version>1.3.2</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>junit</groupId>
-                    <artifactId>junit</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>xmlunit</groupId>
-                    <artifactId>xmlunit</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.apache.ws.commons</groupId>
-                    <artifactId>ws-commons-java5</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>bundle</goal>
-                        </goals>
-                    </execution>
-                </executions>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
-                        <Export-Package>${servicemix.osgi.export}</Export-Package>
-                        <Import-Package>${servicemix.osgi.import.pkg}*</Import-Package>
-                        <Private-Package>${servicemix.osgi.private.pkg}</Private-Package>
-                        <_exportcontents>META-INF.cxf</_exportcontents>
-                        <_failok>true</_failok>
-                    </instructions>
-                    <unpackBundle>true</unpackBundle>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/bundles/jaxws-api/pom.xml b/bundles/jaxws-api/pom.xml
deleted file mode 100644
index fcaeb64..0000000
--- a/bundles/jaxws-api/pom.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?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.ejb3.bundles</groupId>
-        <artifactId>bundles</artifactId>
-        <version>1.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.bundles</groupId>
-    <artifactId>org.apache.servicemix.bundles.jaxws-api-2.0</artifactId>
-    <version>1.0-SNAPSHOT</version>
-    <packaging>bundle</packaging>
-    <name>ServiceMix OSGI Common Bundles: ${pkgArtifactId}</name>
-    <description>
-        This bundle simply wraps ${pkgArtifactId}-${pkgVersion}.jar.
-    </description>
-
-    <properties>
-        <pkgArtifactId>jaxws-api</pkgArtifactId>
-        <pkgVersion>${jaxws.api.version}</pkgVersion>
-        <servicemix.osgi.export.pkg>javax.xml.ws*</servicemix.osgi.export.pkg>
-        <servicemix.osgi.import.pkg>
-            javax.xml.soap*;resolution:=optional,
-            *
-        </servicemix.osgi.import.pkg>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>javax.xml.ws</groupId>
-            <artifactId>${pkgArtifactId}</artifactId>
-            <version>${pkgVersion}</version>
-            <optional>true</optional>
-            <exclusions>
-                <groupId>javax.xml.bind</groupId>
-                <artifactId>jaxb-api</artifactId>
-            </exclusions>
-        </dependency>
-        <dependency>
-		    <groupId>org.apache.servicemix.bundles</groupId>
-            <artifactId>org.apache.servicemix.bundles.jaxb-api-2.0</artifactId>
-            <version>1.0-SNAPSHOT</version>
-        </dependency>
-        <dependency>
-		    <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-saaj_1.3_spec</artifactId>
-            <version>${geronimo.saaj.version}</version>
-        </dependency>
-    </dependencies>
-</project>
diff --git a/bundles/neethi/pom.xml b/bundles/neethi/pom.xml
deleted file mode 100644
index 3518992..0000000
--- a/bundles/neethi/pom.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-<?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.ejb3.bundles</groupId>
-        <artifactId>bundles</artifactId>
-        <version>1.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.bundles</groupId>
-    <artifactId>org.apache.servicemix.bundles.neethi-2.0.2</artifactId>
-    <version>1.0-SNAPSHOT</version>
-    <packaging>bundle</packaging>
-    <name>ServiceMix OSGI Common Bundles: ${pkgArtifactId}</name>
-    <description>
-        This bundle simply wraps ${pkgArtifactId}-${pkgVersion}.jar.
-    </description>
-
-    <properties>
-        <pkgArtifactId>neethi</pkgArtifactId>
-        <pkgVersion>2.0.2</pkgVersion>
-        <servicemix.osgi.import.pkg>
-            org.apache.axiom*;resolution:=optional,
-            sun.misc*;resolution:=optional,
-            *
-        </servicemix.osgi.import.pkg>
-        <servicemix.osgi.export.pkg>
-            org.apache.neethi
-		</servicemix.osgi.export.pkg>
-        <servicemix.osgi.private.pkg></servicemix.osgi.private.pkg>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.neethi</groupId>
-            <artifactId>neethi</artifactId>
-            <version>${pkgVersion}</version>
-            <optional>true</optional>
-            <exclusions>
-                <exclusion>
-                    <groupId>log4j</groupId>
-                    <artifactId>log4j</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>javax.servlet</groupId>
-                    <artifactId>servlet-api</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.apache.ws.commons.axiom</groupId>
-                    <artifactId>axiom-impl</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.apache.ws.commons.axiom</groupId>
-                    <artifactId>axiom-parent</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.apache.ws.commons.axiom</groupId>
-                    <artifactId>axiom-api</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>woodstox</groupId>
-                    <artifactId>wstx-asl</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-    </dependencies>
-
-</project>
diff --git a/bundles/pom.xml b/bundles/pom.xml
index b9e8b70..a66adaf 100644
--- a/bundles/pom.xml
+++ b/bundles/pom.xml
@@ -34,15 +34,8 @@
 
     <modules>
         <module>commons-cli</module>
-        <module>cxf</module>
-        <module>jaxws-api</module>
-        <module>neethi</module>
         <module>openjpa</module>
-        <module>saaj-impl</module>
         <module>swizzle</module>
-        <module>wsdl4j</module>
-        <module>xmlresolver</module>
-        <module>xmlschema</module>
     </modules>
 
     <properties>
diff --git a/bundles/saaj-impl/pom.xml b/bundles/saaj-impl/pom.xml
deleted file mode 100644
index 958a186..0000000
--- a/bundles/saaj-impl/pom.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?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.ejb3.bundles</groupId>
-        <artifactId>bundles</artifactId>
-        <version>1.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.bundles</groupId>
-    <artifactId>org.apache.servicemix.bundles.saaj-impl-1.3</artifactId>
-    <version>1.0-SNAPSHOT</version>
-    <packaging>bundle</packaging>
-    <name>ServiceMix OSGI Common Bundles: ${pkgArtifactId}</name>
-    <description>
-        This bundle simply wraps ${pkgArtifactId}-${pkgVersion}.jar.
-    </description>
-
-    <properties>
-        <pkgArtifactId>saaj-impl</pkgArtifactId>
-        <pkgVersion>1.3</pkgVersion>
-        <servicemix.osgi.export.pkg>com.sun.xml.messaging.saaj</servicemix.osgi.export.pkg>
-        <servicemix.osgi.import.pkg>
-            com.sun.image.codec.jpeg*;resolution:=optional,
-            com.sun.xml.fastinfoset*;resolution:=optional,
-            javax.xml.soap,
-            org.jvnet.fastinfoset*;resolution:=optional,
-            *
-        </servicemix.osgi.import.pkg>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>com.sun.xml.messaging.saaj</groupId>
-            <artifactId>${pkgArtifactId}</artifactId>
-            <version>${pkgVersion}</version>
-            <optional>true</optional>
-            <exclusions>
-                <exclusion>
-                    <groupId>javax.xml.soap</groupId>
-                    <artifactId>saaj-api</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-		    <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-saaj_1.3_spec</artifactId>
-            <version>${geronimo.saaj.version}</version>
-            <optional>true</optional>
-        </dependency>
-    </dependencies>
-</project>
diff --git a/bundles/wsdl4j/pom.xml b/bundles/wsdl4j/pom.xml
deleted file mode 100644
index f6a5670..0000000
--- a/bundles/wsdl4j/pom.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?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.ejb3.bundles</groupId>
-        <artifactId>bundles</artifactId>
-        <version>1.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.bundles</groupId>
-    <artifactId>org.apache.servicemix.bundles.wsdl4j-1.6.1</artifactId>
-    <version>1.0-SNAPSHOT</version>
-    <packaging>bundle</packaging>
-    <name>ServiceMix OSGI Common Bundles: ${pkgArtifactId}</name>
-    <description>
-        This bundle simply wraps ${pkgArtifactId}-${pkgVersion}.jar.
-    </description>
-
-    <properties>
-        <pkgArtifactId>wsdl4j</pkgArtifactId>
-        <pkgVersion>1.6.1</pkgVersion>
-        <servicemix.osgi.export>
-            javax.wsdl*;version=1.2,
-            com.ibm.wsdl*;version=${pkgVersion}
-        </servicemix.osgi.export>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>wsdl4j</groupId>
-            <artifactId>wsdl4j</artifactId>
-            <version>${pkgVersion}</version>
-            <optional>true</optional>
-        </dependency>
-    </dependencies>
-
-</project>
diff --git a/bundles/xmlresolver/pom.xml b/bundles/xmlresolver/pom.xml
deleted file mode 100644
index 78fc21f..0000000
--- a/bundles/xmlresolver/pom.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?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.ejb3.bundles</groupId>
-        <artifactId>bundles</artifactId>
-        <version>1.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.bundles</groupId>
-    <artifactId>org.apache.servicemix.bundles.xmlresolver-1.2</artifactId>
-    <version>1.0-SNAPSHOT</version>
-    <packaging>bundle</packaging>
-    <name>ServiceMix OSGI Common Bundles: ${pkgArtifactId}</name>
-    <description>
-        This bundle simply wraps ${pkgArtifactId}-${pkgVersion}.jar.
-    </description>
-
-    <properties>
-        <pkgArtifactId>xmlresolver</pkgArtifactId>
-        <pkgVersion>1.2</pkgVersion>
-        <servicemix.osgi.export.pkg>org.apache.xml.resolver</servicemix.osgi.export.pkg>
-        <servicemix.osgi.private.pkg></servicemix.osgi.private.pkg>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>xml-resolver</groupId>
-            <artifactId>xml-resolver</artifactId>
-            <version>${pkgVersion}</version>
-            <optional>true</optional>
-        </dependency>
-    </dependencies>
-
-</project>
diff --git a/bundles/xmlschema/pom.xml b/bundles/xmlschema/pom.xml
deleted file mode 100644
index f4523de..0000000
--- a/bundles/xmlschema/pom.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?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.ejb3.bundles</groupId>
-        <artifactId>bundles</artifactId>
-        <version>1.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.bundles</groupId>
-    <artifactId>org.apache.servicemix.bundles.xmlschema-1.3.2</artifactId>
-    <version>1.0-SNAPSHOT</version>
-    <packaging>bundle</packaging>
-    <name>ServiceMix OSGI Common Bundles: ${pkgArtifactId}</name>
-    <description>
-        This bundle simply wraps ${pkgArtifactId}-${pkgVersion}.jar.
-    </description>
-
-    <properties>
-        <pkgArtifactId>xmlschema</pkgArtifactId>
-        <pkgVersion>1.3.2</pkgVersion>
-        <servicemix.osgi.export.pkg>org.apache.ws.commons.schema</servicemix.osgi.export.pkg>
-        <servicemix.osgi.private.pkg></servicemix.osgi.private.pkg>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.ws.commons.schema</groupId>
-            <artifactId>XmlSchema</artifactId>
-            <version>${pkgVersion}</version>
-            <optional>true</optional>
-        </dependency>
-    </dependencies>
-
-</project>
diff --git a/cxf-binding-nmr/pom.xml b/cxf-binding-nmr/pom.xml
deleted file mode 100644
index e016b8a..0000000
--- a/cxf-binding-nmr/pom.xml
+++ /dev/null
@@ -1,120 +0,0 @@
-<?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.ejb3</groupId>
-	    <artifactId>ejb3</artifactId>
-        <version>1.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.ejb3</groupId>
-    <artifactId>org.apache.servicemix.cxf.binding.nmr</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.0-SNAPSHOT</version>
-    <name>ServiceMix CXF Binding for NMR</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.servicemix.nmr</groupId>
-            <artifactId>org.apache.servicemix.nmr.api</artifactId>
-            <version>${servicemix.nmr.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.cxf</groupId>
-            <artifactId>cxf-bundle</artifactId>
-            <version>${cxf.version}</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <!-- Bundle generation -->
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
-                        <Import-Package>
-                            javax.xml.rpc*;resolution:=optional,
-                            javax.xml.soap,
-                            com.ctc.wstx.stax;resolution:=optional,
-                            org.apache.axis.soap;resolution:=optional,
-                            org.apache.axis2.saaj;resolution:=optional,
-                            com.sun.xml.messaging.saaj.soap.ver1_1;resolution:=optional,
-                            com.sun.xml.messaging.saaj.client.p2p;resolution:=optional,
-                            com.sun.xml.messaging.saaj.soap;resolution:=optional,
-                            *
-                        </Import-Package>
-                        <!-- Needed for jaxb annotations classes -->
-                        <DynamicImport-Package>*</DynamicImport-Package>
-                        <Export-Package>
-                            ${pom.artifactId}*,
-                            '=META-INF.cxf.binding.nmr'
-                        </Export-Package>
-                        <Private-Package></Private-Package>
-                        <_failok>true</_failok>
-                        <Spring-Context>*;publish-context:=false</Spring-Context>
-                    </instructions>
-                </configuration>
-            </plugin>
-            <!-- generate dependencies versions -->
-            <plugin>
-		        <groupId>org.apache.servicemix.kernel.testing</groupId>
-		        <artifactId>depends-maven-plugin</artifactId>
-                <version>${servicemix.kernel.version}</version>
-                <executions>
-                    <execution>
-                        <id>generate-depends-file</id>
-                        <goals>
-                            <goal>generate-depends-file</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-surefire-plugin</artifactId>
-                <configuration>
-                    <forkMode>pertest</forkMode>
-                    <systemProperties>
-                        <property>
-                            <name>javax.xml.parsers.DocumentBuilderFactory</name>
-                            <value>com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl</value>
-                        </property>
-                        <property>
-                            <name>javax.xml.datatype.DatatypeFactory</name>
-                            <value>com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl</value>
-                        </property>
-                        <property>
-                            <name>javax.xml.parsers.SAXParserFactory</name>
-                            <value>com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl</value>
-                        </property>
-                    </systemProperties>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/NMRBinding.java b/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/NMRBinding.java
deleted file mode 100644
index 33e4c7a..0000000
--- a/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/NMRBinding.java
+++ /dev/null
@@ -1,50 +0,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.
- */
-package org.apache.servicemix.cxf.binding.nmr;
-
-import org.apache.cxf.binding.Binding;
-import org.apache.cxf.interceptor.AbstractBasicInterceptorProvider;
-import org.apache.cxf.message.Message;
-import org.apache.cxf.message.MessageImpl;
-import org.apache.cxf.service.model.BindingInfo;
-
-public class NMRBinding extends AbstractBasicInterceptorProvider implements Binding {
-
-    private NMRBindingInfo bindingInfo;
-    
-    public NMRBinding(NMRBindingInfo bindingInfo) {
-        this.bindingInfo = bindingInfo;
-    }
-    
-    public Message createMessage() {
-        return createMessage(new MessageImpl());
-    }
-
-    public Message createMessage(Message m) {
-        if (!m.containsKey(Message.CONTENT_TYPE)) {
-            m.put(Message.CONTENT_TYPE, "text/xml");
-        }
-        return new NMRMessage(m);
-    }
-
-    public BindingInfo getBindingInfo() {
-        return bindingInfo;
-    }
-
-}
diff --git a/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/NMRBindingFactory.java b/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/NMRBindingFactory.java
deleted file mode 100644
index d2e3b49..0000000
--- a/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/NMRBindingFactory.java
+++ /dev/null
@@ -1,67 +0,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.
- */
-package org.apache.servicemix.cxf.binding.nmr;
-
-import javax.xml.namespace.QName;
-
-import org.apache.cxf.binding.AbstractBindingFactory;
-import org.apache.cxf.binding.Binding;
-import org.apache.cxf.interceptor.StaxInInterceptor;
-import org.apache.cxf.interceptor.StaxOutInterceptor;
-import org.apache.cxf.service.model.BindingInfo;
-import org.apache.cxf.service.model.BindingOperationInfo;
-import org.apache.cxf.service.model.OperationInfo;
-import org.apache.cxf.service.model.ServiceInfo;
-import org.apache.servicemix.cxf.binding.nmr.interceptors.NMRFaultInInterceptor;
-import org.apache.servicemix.cxf.binding.nmr.interceptors.NMRFaultOutInterceptor;
-import org.apache.servicemix.cxf.binding.nmr.interceptors.NMROperationInInterceptor;
-import org.apache.servicemix.cxf.binding.nmr.interceptors.NMRWrapperInInterceptor;
-import org.apache.servicemix.cxf.binding.nmr.interceptors.NMRWrapperOutInterceptor;
-
-public class NMRBindingFactory extends AbstractBindingFactory {
-
-    public Binding createBinding(BindingInfo binding) {
-        NMRBinding jb = new NMRBinding((NMRBindingInfo) binding);
-        jb.getInInterceptors().add(new StaxInInterceptor());
-        jb.getInInterceptors().add(new NMROperationInInterceptor());
-        jb.getInInterceptors().add(new NMRWrapperInInterceptor());
-        jb.getOutInterceptors().add(new StaxOutInterceptor());
-        jb.getOutInterceptors().add(new NMRWrapperOutInterceptor());
-        jb.getOutFaultInterceptors().add(new StaxOutInterceptor());
-        jb.getOutFaultInterceptors().add(new NMRFaultOutInterceptor());
-        
-        jb.getInFaultInterceptors().add(new NMRFaultInInterceptor());
-        return jb;
-    }
-
-    public BindingInfo createBindingInfo(ServiceInfo service, String namespace, Object config) {
-        NMRBindingInfo info = new NMRBindingInfo(service, NMRConstants.NS_NMR_BINDING);
-        info.setName(new QName(service.getName().getNamespaceURI(), 
-                               service.getName().getLocalPart() + "NMRBinding"));
-
-        for (OperationInfo op : service.getInterface().getOperations()) {                       
-            BindingOperationInfo bop = 
-                info.buildOperation(op.getName(), op.getInputName(), op.getOutputName());
-            info.addOperation(bop);
-        }
-        
-        return info;
-    }
-
-}
diff --git a/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/NMRBindingInfo.java b/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/NMRBindingInfo.java
deleted file mode 100644
index 60fbe4e..0000000
--- a/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/NMRBindingInfo.java
+++ /dev/null
@@ -1,30 +0,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.
- */
-package org.apache.servicemix.cxf.binding.nmr;
-
-import org.apache.cxf.service.model.BindingInfo;
-import org.apache.cxf.service.model.ServiceInfo;
-
-public class NMRBindingInfo extends BindingInfo {
-
-    public NMRBindingInfo(ServiceInfo service, String bindingId) {
-        super(service, bindingId);
-    }
-
-}
diff --git a/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/NMRConstants.java b/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/NMRConstants.java
deleted file mode 100644
index 32db927..0000000
--- a/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/NMRConstants.java
+++ /dev/null
@@ -1,37 +0,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.
- */
-package org.apache.servicemix.cxf.binding.nmr;
-
-import javax.xml.namespace.QName;
-
-
-public final class NMRConstants {
-
-    public static final String NS_NMR_BINDING = "http://cxf.apache.org/bindings/nmr";
-
-    public static final String NS_JBI_WRAPPER = "http://java.sun.com/xml/ns/jbi/wsdl-11-wrapper";
-    
-    public static final QName JBI_WRAPPER_MESSAGE = new QName(NS_JBI_WRAPPER, "message");
-
-    public static final QName JBI_WRAPPER_PART = new QName(NS_JBI_WRAPPER, "part");
-
-    private NMRConstants() {
-        //utility class
-    }
-}
\ No newline at end of file
diff --git a/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/NMRFault.java b/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/NMRFault.java
deleted file mode 100644
index edf29d7..0000000
--- a/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/NMRFault.java
+++ /dev/null
@@ -1,64 +0,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.
- */
-
-package org.apache.servicemix.cxf.binding.nmr;
-
-import java.util.ResourceBundle;
-
-import org.apache.cxf.common.i18n.Message;
-import org.apache.cxf.interceptor.Fault;
-
-public class NMRFault extends Fault {
-    public static final String NMR_FAULT_PREFIX = "jfns";
-
-    public static final String NMR_FAULT_ROOT = "NMRFault";
-    public static final String NMR_FAULT_STRING = "faultstring";
-
-    public static final String NMR_FAULT_DETAIL = "detail";
-
-    public static final String NMR_FAULT_CODE_SERVER = "SERVER";
-
-    public static final String NMR_FAULT_CODE_CLIENT = "CLIENT";
-
-    
-    static final long serialVersionUID = 100000;
-
-    public NMRFault(Message message, Throwable throwable) {
-        super(message, throwable);        
-    }
-
-    public NMRFault(Message message) {
-        super(message);        
-    }
-
-    public NMRFault(String message) {
-        super(new Message(message, (ResourceBundle) null));        
-    }
-
-    public static NMRFault createFault(Fault f) {
-        if (f instanceof NMRFault) {
-            return (NMRFault) f;
-        }
-        Throwable th = f.getCause();
-        NMRFault jbiFault = new NMRFault(new Message(f.getMessage(), (ResourceBundle) null), th);
-        jbiFault.setDetail(f.getDetail());
-        return jbiFault;
-    }
-
-}
diff --git a/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/NMRMessage.java b/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/NMRMessage.java
deleted file mode 100644
index 465bc62..0000000
--- a/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/NMRMessage.java
+++ /dev/null
@@ -1,35 +0,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.
- */
-package org.apache.servicemix.cxf.binding.nmr;
-
-import org.apache.cxf.message.AbstractWrappedMessage;
-import org.apache.cxf.message.Message;
-import org.apache.servicemix.nmr.api.Exchange;
-
-public class NMRMessage extends AbstractWrappedMessage {
-
-    public NMRMessage(Message msg) {
-        super(msg);
-    }
-    
-    public Exchange getNmrExchange() {
-        return get(Exchange.class);
-    }
-
-}
diff --git a/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/interceptors/NMRFaultInInterceptor.java b/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/interceptors/NMRFaultInInterceptor.java
deleted file mode 100644
index 0ed3167..0000000
--- a/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/interceptors/NMRFaultInInterceptor.java
+++ /dev/null
@@ -1,71 +0,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.
- */
-
-package org.apache.servicemix.cxf.binding.nmr.interceptors;
-
-import java.util.ResourceBundle;
-
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamReader;
-
-import org.w3c.dom.Element;
-
-import org.apache.cxf.common.i18n.BundleUtils;
-import org.apache.cxf.interceptor.Fault;
-import org.apache.cxf.phase.AbstractPhaseInterceptor;
-import org.apache.cxf.phase.Phase;
-import org.apache.cxf.staxutils.DepthXMLStreamReader;
-import org.apache.cxf.staxutils.FragmentStreamReader;
-import org.apache.cxf.staxutils.StaxUtils;
-import org.apache.servicemix.cxf.binding.nmr.NMRFault;
-import org.apache.servicemix.cxf.binding.nmr.NMRMessage;
-
-
-public class NMRFaultInInterceptor extends AbstractPhaseInterceptor<NMRMessage> {
-    
-    private static final ResourceBundle BUNDLE = BundleUtils.getBundle(NMRFaultInInterceptor.class);
-    public NMRFaultInInterceptor() {
-        super(Phase.UNMARSHAL);
-        addBefore("*");
-    }
-    
-    public void handleMessage(NMRMessage message) throws Fault {
-        XMLStreamReader xsr = message.getContent(XMLStreamReader.class);
-        DepthXMLStreamReader reader = new DepthXMLStreamReader(xsr);
-
-        try {            
-            
-            if (!StaxUtils.toNextElement(reader)) {
-                throw new Fault(new org.apache.cxf.common.i18n.Message("ILLEGAL_JBIFAULT_FORMAT", BUNDLE));
-            }
-            Fault fault = new NMRFault(new org.apache.cxf.common.i18n.Message(NMRFault.NMR_FAULT_STRING,
-                                                                              (ResourceBundle) null));
-            
-            if (StaxUtils.toNextElement(reader)) {
-                // handling detail
-                Element detail = StaxUtils.read(new FragmentStreamReader(reader)).getDocumentElement();
-                fault.setDetail(detail);
-            }
-            message.setContent(Exception.class, fault);
-        } catch (XMLStreamException xse) {
-            throw new Fault(new org.apache.cxf.common.i18n.Message("STAX_READ_EXC", BUNDLE));
-        }
-
-    }
-}
diff --git a/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/interceptors/NMRFaultOutInterceptor.java b/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/interceptors/NMRFaultOutInterceptor.java
deleted file mode 100644
index 30642af..0000000
--- a/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/interceptors/NMRFaultOutInterceptor.java
+++ /dev/null
@@ -1,103 +0,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.
- */
-package org.apache.servicemix.cxf.binding.nmr.interceptors;
-
-import java.util.ResourceBundle;
-
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamWriter;
-
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-
-import org.apache.cxf.common.i18n.BundleUtils;
-import org.apache.cxf.common.i18n.Message;
-import org.apache.cxf.helpers.NSStack;
-import org.apache.cxf.interceptor.Fault;
-import org.apache.cxf.phase.AbstractPhaseInterceptor;
-import org.apache.cxf.phase.Phase;
-import org.apache.cxf.staxutils.StaxUtils;
-import org.apache.servicemix.cxf.binding.nmr.NMRConstants;
-import org.apache.servicemix.cxf.binding.nmr.NMRFault;
-import org.apache.servicemix.cxf.binding.nmr.NMRMessage;
-
-public class NMRFaultOutInterceptor extends AbstractPhaseInterceptor<NMRMessage> {
-
-    private static final ResourceBundle BUNDLE = BundleUtils.getBundle(NMRFaultOutInterceptor.class);
-
-    public NMRFaultOutInterceptor() {
-        super(Phase.MARSHAL);
-    }
-
-    public void handleMessage(NMRMessage message) throws Fault {
-        message.put(org.apache.cxf.message.Message.RESPONSE_CODE, new Integer(500));
-        NSStack nsStack = new NSStack();
-        nsStack.push();
-
-        
-        
-        try {
-            XMLStreamWriter writer = getWriter(message);
-            Fault fault = getFault(message);
-            NMRFault jbiFault = NMRFault.createFault(fault);
-            nsStack.add(NMRConstants.NS_NMR_BINDING);
-            String prefix = nsStack.getPrefix(NMRConstants.NS_NMR_BINDING);
-            StaxUtils.writeStartElement(writer, prefix, NMRFault.NMR_FAULT_ROOT,
-                                        NMRConstants.NS_NMR_BINDING);
-            if (!jbiFault.hasDetails()) {
-                writer.writeEmptyElement("fault");
-            } else {
-                Element detail = jbiFault.getDetail();
-                NodeList details = detail.getChildNodes();
-                for (int i = 0; i < details.getLength(); i++) {
-                    if (details.item(i) instanceof Element) {
-                        StaxUtils.writeNode(details.item(i), writer, true);
-                        break;
-                    }
-                }
-            }
-            writer.writeEndElement();
-            writer.flush();
-            
-        } catch (XMLStreamException xe) {
-            throw new Fault(new Message("XML_WRITE_EXC", BUNDLE), xe);
-        }
-    }
-
-    protected Fault getFault(NMRMessage message) {
-        Exception e = message.getContent(Exception.class);
-        Fault fault;
-        if (e == null) {
-            throw new IllegalStateException(new Message("NO_EXCEPTION", BUNDLE).toString());
-        } else if (e instanceof Fault) {
-            fault = (Fault) e;
-        } else {
-            fault = new Fault(e);
-        }
-        return fault;
-    }
-    
-    protected XMLStreamWriter getWriter(NMRMessage message) {
-        XMLStreamWriter writer = message.getContent(XMLStreamWriter.class);
-        if (writer == null) {
-            throw new IllegalStateException(new Message("NO_XML_STREAM_WRITER", BUNDLE).toString());
-        }
-        return writer;
-    }
-}
diff --git a/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/interceptors/NMROperationInInterceptor.java b/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/interceptors/NMROperationInInterceptor.java
deleted file mode 100644
index a0ef77e..0000000
--- a/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/interceptors/NMROperationInInterceptor.java
+++ /dev/null
@@ -1,71 +0,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.
- */
-package org.apache.servicemix.cxf.binding.nmr.interceptors;
-
-import java.util.ResourceBundle;
-import java.util.logging.Logger;
-
-import javax.xml.namespace.QName;
-
-import org.apache.cxf.common.i18n.Message;
-import org.apache.cxf.common.logging.LogUtils;
-import org.apache.cxf.endpoint.Endpoint;
-import org.apache.cxf.interceptor.Fault;
-import org.apache.cxf.message.Exchange;
-import org.apache.cxf.phase.AbstractPhaseInterceptor;
-import org.apache.cxf.phase.Phase;
-import org.apache.cxf.service.model.BindingInfo;
-import org.apache.cxf.service.model.BindingOperationInfo;
-import org.apache.cxf.service.model.MessageInfo;
-import org.apache.cxf.service.model.OperationInfo;
-import org.apache.servicemix.cxf.binding.nmr.NMRMessage;
-
-public class NMROperationInInterceptor extends AbstractPhaseInterceptor<NMRMessage> {
-
-    private static final Logger LOG = LogUtils.getL7dLogger(NMROperationInInterceptor.class);
-
-    private static final ResourceBundle BUNDLE = LOG.getResourceBundle();
-
-    public NMROperationInInterceptor() {
-        super(Phase.PRE_PROTOCOL);
-    }
-
-    public void handleMessage(NMRMessage message) throws Fault {
-        Exchange ex = message.getExchange();
-        Endpoint ep = ex.get(Endpoint.class);
-        BindingOperationInfo boi = ex.get(BindingOperationInfo.class);
-        if (boi == null && message.getNmrExchange().getOperation() != null) {
-            BindingInfo service = ep.getEndpointInfo().getBinding();
-            boi = getBindingOperationInfo(service, message.getNmrExchange().getOperation());
-            if (boi == null) {
-                throw new Fault(new Message("UNKNOWN_OPERATION", BUNDLE, 
-                        message.getNmrExchange().getOperation().toString()));
-            }
-            ex.put(BindingOperationInfo.class, boi);
-            ex.put(OperationInfo.class, boi.getOperationInfo());
-            ex.setOneWay(boi.getOperationInfo().isOneWay());
-            message.put(MessageInfo.class, boi.getInput().getMessageInfo());
-        }
-    }
-
-    protected BindingOperationInfo getBindingOperationInfo(BindingInfo service, QName operation) {
-        return service.getOperation(operation);
-    }
-
-}
diff --git a/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/interceptors/NMRWrapperInInterceptor.java b/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/interceptors/NMRWrapperInInterceptor.java
deleted file mode 100644
index 8169fec..0000000
--- a/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/interceptors/NMRWrapperInInterceptor.java
+++ /dev/null
@@ -1,139 +0,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.
- */
-package org.apache.servicemix.cxf.binding.nmr.interceptors;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.ResourceBundle;
-import java.util.logging.Logger;
-
-import javax.xml.namespace.QName;
-import javax.xml.stream.XMLStreamConstants;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamReader;
-
-import org.apache.servicemix.cxf.binding.nmr.NMRBindingInfo;
-import org.apache.servicemix.cxf.binding.nmr.NMRConstants;
-import org.apache.servicemix.cxf.binding.nmr.NMRFault;
-import org.apache.cxf.common.logging.LogUtils;
-import org.apache.cxf.databinding.DataReader;
-import org.apache.cxf.endpoint.Endpoint;
-import org.apache.cxf.interceptor.AbstractInDatabindingInterceptor;
-import org.apache.cxf.interceptor.Fault;
-import org.apache.cxf.message.Exchange;
-import org.apache.cxf.message.Message;
-import org.apache.cxf.phase.Phase;
-import org.apache.cxf.service.model.BindingInfo;
-import org.apache.cxf.service.model.BindingMessageInfo;
-import org.apache.cxf.service.model.BindingOperationInfo;
-import org.apache.cxf.service.model.MessageInfo;
-import org.apache.cxf.service.model.MessagePartInfo;
-import org.apache.cxf.staxutils.DepthXMLStreamReader;
-import org.apache.cxf.staxutils.StaxUtils;
-
-public class NMRWrapperInInterceptor extends AbstractInDatabindingInterceptor {
-
-    private static final Logger LOG = LogUtils.getL7dLogger(NMRWrapperInInterceptor.class);
-
-    private static final ResourceBundle BUNDLE = LOG.getResourceBundle();
-
-    public NMRWrapperInInterceptor() {
-        super(Phase.UNMARSHAL);
-    }
-
-    public void handleMessage(Message message) throws Fault {
-        if (isGET(message)) {
-            LOG.info("JbiMessageInInterceptor skipped in HTTP GET method");
-            return;
-        }
-        XMLStreamReader xsr = message.getContent(XMLStreamReader.class);
-
-        DepthXMLStreamReader reader = new DepthXMLStreamReader(xsr);
-
-        Endpoint ep = message.getExchange().get(Endpoint.class);
-        BindingInfo binding = ep.getEndpointInfo().getBinding();
-        if (!(binding instanceof NMRBindingInfo)) {
-            throw new IllegalStateException(
-                  new org.apache.cxf.common.i18n.Message("NEED_JBIBINDING", BUNDLE).toString());
-        }
-
-        if (!StaxUtils.toNextElement(reader)) {
-            throw new Fault(new org.apache.cxf.common.i18n.Message("NO_OPERATION_ELEMENT", BUNDLE));
-        }
-
-        Exchange ex = message.getExchange();
-        QName startQName = reader.getName();
-
-        // handling jbi fault message
-        if (startQName.getLocalPart().equals(NMRFault.NMR_FAULT_ROOT)) {
-            message.getInterceptorChain().abort();
-
-            if (ep.getInFaultObserver() != null) {
-                ep.getInFaultObserver().onMessage(message);
-                return;
-            }
-        }
-
-
-        // handling xml normal inbound message
-        if (!startQName.equals(NMRConstants.JBI_WRAPPER_MESSAGE)) {
-            throw new Fault(new org.apache.cxf.common.i18n.Message(
-                    "NO_JBI_MESSAGE_ELEMENT", BUNDLE));
-        }
-
-        try {
-            BindingOperationInfo bop = ex.get(BindingOperationInfo.class);
-            DataReader<XMLStreamReader> dr = getDataReader(message);
-            List<Object> parameters = new ArrayList<Object>();
-            reader.next();
-            BindingMessageInfo messageInfo = !isRequestor(message) ? bop.getInput() : bop.getOutput();
-            message.put(MessageInfo.class, messageInfo.getMessageInfo());
-            for (MessagePartInfo part : messageInfo.getMessageParts()) {
-                if (!StaxUtils.skipToStartOfElement(reader)) {
-                    throw new Fault(new org.apache.cxf.common.i18n.Message("NOT_ENOUGH_PARTS", BUNDLE));
-                }
-                startQName = reader.getName();
-                if (!startQName.equals(NMRConstants.JBI_WRAPPER_PART)) {
-                    throw new Fault(new org.apache.cxf.common.i18n.Message("NO_JBI_PART_ELEMENT", BUNDLE));
-                }
-                if (part.isElement()) {
-                    reader.next();
-                    if (!StaxUtils.toNextElement(reader)) {
-                        throw new Fault(new org.apache.cxf.common.i18n.Message("EXPECTED_ELEMENT_IN_PART", BUNDLE));
-                    }
-                }
-                parameters.add(dr.read(part, reader));
-                // skip end element
-                if (part.isElement()) {
-                    reader.next();
-                }
-            }
-            int ev = reader.getEventType();
-            while (ev != XMLStreamConstants.END_ELEMENT 
-                    && ev != XMLStreamConstants.START_ELEMENT
-                    && ev != XMLStreamConstants.END_DOCUMENT) {
-                ev = reader.next();
-            }
-            message.setContent(List.class, parameters);
-        } catch (XMLStreamException e) {
-            throw new Fault(new org.apache.cxf.common.i18n.Message("STAX_READ_EXC", BUNDLE), e);
-        }
-    }
-
-}
diff --git a/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/interceptors/NMRWrapperOutInterceptor.java b/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/interceptors/NMRWrapperOutInterceptor.java
deleted file mode 100644
index 35d5305..0000000
--- a/cxf-binding-nmr/src/main/java/org/apache/servicemix/cxf/binding/nmr/interceptors/NMRWrapperOutInterceptor.java
+++ /dev/null
@@ -1,102 +0,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.
- */
-package org.apache.servicemix.cxf.binding.nmr.interceptors;
-
-import java.util.List;
-import java.util.ResourceBundle;
-import java.util.logging.Logger;
-
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamWriter;
-
-import org.apache.cxf.common.logging.LogUtils;
-import org.apache.cxf.databinding.DataWriter;
-import org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor;
-import org.apache.cxf.interceptor.Fault;
-import org.apache.cxf.message.Message;
-import org.apache.cxf.phase.Phase;
-import org.apache.cxf.service.Service;
-import org.apache.cxf.service.model.BindingOperationInfo;
-import org.apache.cxf.service.model.MessagePartInfo;
-import org.apache.servicemix.cxf.binding.nmr.NMRConstants;
-
-public class NMRWrapperOutInterceptor extends AbstractOutDatabindingInterceptor {
-
-    private static final Logger LOG = LogUtils.getL7dLogger(NMRWrapperOutInterceptor.class);
-
-    private static final ResourceBundle BUNDLE = LOG.getResourceBundle();
-
-    public NMRWrapperOutInterceptor() {
-        super(Phase.MARSHAL);
-    }
-
-    public void handleMessage(Message message) throws Fault {
-        BindingOperationInfo bop = message.getExchange().get(BindingOperationInfo.class);
-        XMLStreamWriter xmlWriter = getXMLStreamWriter(message);
-        Service service = message.getExchange().get(Service.class);
-        
-        DataWriter<XMLStreamWriter> dataWriter = getDataWriter(message, service, XMLStreamWriter.class);
-
-        try {
-            xmlWriter.setPrefix("jbi", NMRConstants.NS_JBI_WRAPPER);
-            xmlWriter.writeStartElement(NMRConstants.NS_JBI_WRAPPER,
-                                        NMRConstants.JBI_WRAPPER_MESSAGE.getLocalPart());
-            xmlWriter.writeNamespace("jbi", NMRConstants.NS_JBI_WRAPPER);
-            
-            List<MessagePartInfo> parts = null;
-            if (!isRequestor(message)) {
-                parts = bop.getOutput().getMessageParts();
-            } else {
-                parts = bop.getInput().getMessageParts();
-            }
-            List<?> objs = (List<?>) message.getContent(List.class);                
-            if (objs.size() < parts.size()) {
-                throw new Fault(new org.apache.cxf.common.i18n.Message(
-                        "NOT_EQUAL_ARG_NUM", BUNDLE));
-            }
-            for (int idx = 0; idx < parts.size(); idx++) {
-                MessagePartInfo part = parts.get(idx);
-                Object obj = objs.get(idx);
-                if (!part.isElement()) {
-                    if (part.getTypeClass() == String.class) {
-                        xmlWriter.writeStartElement(NMRConstants.NS_JBI_WRAPPER,
-                                                    NMRConstants.JBI_WRAPPER_PART.getLocalPart());
-                        xmlWriter.writeCharacters(obj.toString());
-                        xmlWriter.writeEndElement();
-                    } else {
-                        part = new MessagePartInfo(part.getName(), part.getMessageInfo());
-                        part.setElement(false);
-                        part.setConcreteName(NMRConstants.JBI_WRAPPER_PART);
-                        dataWriter.write(obj, part, xmlWriter);
-                    }
-                } else {
-                    xmlWriter.writeStartElement(NMRConstants.NS_JBI_WRAPPER,
-                                                NMRConstants.JBI_WRAPPER_PART.getLocalPart());
-                    dataWriter.write(obj, part, xmlWriter);                    
-                    xmlWriter.writeEndElement();
-                }
-            }
-            xmlWriter.writeEndElement();
-        
-        } catch (XMLStreamException e) {
-            throw new Fault(new org.apache.cxf.common.i18n.Message("STAX_WRITE_EXC", BUNDLE), e);
-        }
-    }
-
-}
diff --git a/cxf-binding-nmr/src/main/resources/META-INF/cxf/binding/nmr/cxf-binding-nmr.xml b/cxf-binding-nmr/src/main/resources/META-INF/cxf/binding/nmr/cxf-binding-nmr.xml
deleted file mode 100644
index e949118..0000000
--- a/cxf-binding-nmr/src/main/resources/META-INF/cxf/binding/nmr/cxf-binding-nmr.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?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://www.springframework.org/schema/beans"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xsi:schemaLocation="
-http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
-
-    <bean class="org.apache.servicemix.cxf.binding.nmr.NMRBindingFactory"
-	      id="org.apache.servicemix.cxf.binding.nmr.NMRBindingFactory"
-	      lazy-init="true">
-        <property name="bus" ref="cxf"/>
-        <property name="activationNamespaces">
-            <set>
-                <value>http://cxf.apache.org/bindings/nmr</value>
-            </set>
-        </property>
-    </bean>
-
-</beans>
diff --git a/cxf-binding-nmr/src/main/resources/org/apache/servicemix/cxf/binding/nmr/interceptors/Messages.properties b/cxf-binding-nmr/src/main/resources/org/apache/servicemix/cxf/binding/nmr/interceptors/Messages.properties
deleted file mode 100644
index 9daa3bc..0000000
--- a/cxf-binding-nmr/src/main/resources/org/apache/servicemix/cxf/binding/nmr/interceptors/Messages.properties
+++ /dev/null
@@ -1,61 +0,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.
-#
-NOT.IMPLEMENTED=not yet implemented
-INVOKE.SERVICE=invoking service\t
-CREATE.MESSAGE.EXCHANGE=create message exchange svc:\t
-EXCHANGE.ENDPOINT=exchange endpoint:\t
-NO.MESSAGE=no message yet
-UNABLE.RETRIEVE.MESSAGE=unable to retrieve message
-CONTEXT.MUST.BE=context must be of type JBIOutputStreamMessageContext
-RECEIVED.MESSAGE=received message:\t
-ACTIVE.JBI.SERVER.TRANSPORT=activating JBI server transport
-BUILDING.DOCUMENT=building document from bytes
-CREATE.NORMALIZED.MESSAGE=creating NormalizedMessage
-POST.DISPATCH=postDispatch sending out message to NWR
-ERROR.SEND.MESSAGE=error sending Out message
-DISPATCH.MESSAGE.ON.CALLBACK=dispatching message on callback:\t
-ERROR.PREPARE.MESSAGE=error preparing message
-RECEIVE.THREAD.START=JBIServerTransport message receiving thread started
-DISPATCH.TO.SU=dispatching to CXF service unit
-NO.SU.FOUND=no CXFServiceUnit found
-ERROR.DISPATCH.THREAD=error running dispatch thread
-JBI.SERVER.TRANSPORT.MESSAGE.PROCESS.THREAD.EXIT=JBIServerTransport message processing thread exiting
-CONFIG.DELIVERY.CHANNEL=configuring DeliveryChannel:\t
-CONFIG.SU.MANAGER=configuring ServiceUnitManager:\t
-JBI.TRANSPORT.FACTORY.NOT.INITIALIZED=JBITransportFactory is not properly initialized
-SU.MANAGER=CXFServiceUnitManager:\t
-DELIVERY.CHANNEL=DeliveryChannel:\t
-JBI.TRANSPORT.FACTORY.NOT.FULLY.INITIALIZED=JBITransport factory not fully initialized
-CREATE.SERVER.TRANSPORT=creating JBI server transport
-CREATE.CLIENT.TRANSPORT=creating JBI client transport
-UNKNOWN_OPERATION=unknown operation {0}
-NO_OPERATION_ELEMENT=no operation element
-NO_JBI_MESSAGE_ELEMENT=no jbi message element
-NOT_ENOUGH_PARTS=not enough parts
-NO_JBI_PART_ELEMENT=no jbi part element
-EXPECTED_ELEMENT_IN_PART=expected element in part
-TOO_MANY_PARTS=too many parts
-ILLEGAL_JBIFAULT_FORMAT=illegal jbi fault format
-STAX_READ_EXC=stax read exception
-XML_WRITE_EXC=xml write exception
-STAX_WRITE_EXC=stax write exception
-NOT_EQUAL_ARG_NUM=The number of arguments is not equal
-NEED_JBIBINDING=BindingInfo should be a JbiBindingInfo
-NO_EXCEPTION=No exception on this message
-NO_XML_STREAM_WRITER=No XMLStreamWriter on this message
\ No newline at end of file
diff --git a/cxf-transport-nmr/pom.xml b/cxf-transport-nmr/pom.xml
deleted file mode 100644
index 50405fb..0000000
--- a/cxf-transport-nmr/pom.xml
+++ /dev/null
@@ -1,120 +0,0 @@
-<?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.ejb3</groupId>
-	    <artifactId>ejb3</artifactId>
-        <version>1.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.ejb3</groupId>
-    <artifactId>org.apache.servicemix.cxf.transport.nmr</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.0-SNAPSHOT</version>
-    <name>ServiceMix CXF Transport for NMR</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.servicemix.nmr</groupId>
-            <artifactId>org.apache.servicemix.nmr.api</artifactId>
-            <version>${servicemix.nmr.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.cxf</groupId>
-            <artifactId>cxf-bundle</artifactId>
-            <version>${cxf.version}</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <!-- Bundle generation -->
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
-                        <Import-Package>
-                            javax.xml.rpc*;resolution:=optional,
-                            javax.xml.soap,
-                            com.ctc.wstx.stax;resolution:=optional,
-                            org.apache.axis.soap;resolution:=optional,
-                            org.apache.axis2.saaj;resolution:=optional,
-                            com.sun.xml.messaging.saaj.soap.ver1_1;resolution:=optional,
-                            com.sun.xml.messaging.saaj.client.p2p;resolution:=optional,
-                            com.sun.xml.messaging.saaj.soap;resolution:=optional,
-                            *
-                        </Import-Package>
-                        <!-- Needed for jaxb annotations classes -->
-                        <DynamicImport-Package>*</DynamicImport-Package>
-                        <Export-Package>
-                            ${pom.artifactId}*,
-                            '=META-INF.cxf.transport.nmr'
-                        </Export-Package>
-                        <Private-Package></Private-Package>
-                        <_failok>true</_failok>
-                        <Spring-Context>*;publish-context:=false</Spring-Context>
-                    </instructions>
-                </configuration>
-            </plugin>
-            <!-- generate dependencies versions -->
-            <plugin>
-		        <groupId>org.apache.servicemix.kernel.testing</groupId>
-		        <artifactId>depends-maven-plugin</artifactId>
-                <version>${servicemix.kernel.version}</version>
-                <executions>
-                    <execution>
-                        <id>generate-depends-file</id>
-                        <goals>
-                            <goal>generate-depends-file</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-surefire-plugin</artifactId>
-                <configuration>
-                    <forkMode>pertest</forkMode>
-                    <systemProperties>
-                        <property>
-                            <name>javax.xml.parsers.DocumentBuilderFactory</name>
-                            <value>com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl</value>
-                        </property>
-                        <property>
-                            <name>javax.xml.datatype.DatatypeFactory</name>
-                            <value>com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl</value>
-                        </property>
-                        <property>
-                            <name>javax.xml.parsers.SAXParserFactory</name>
-                            <value>com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl</value>
-                        </property>
-                    </systemProperties>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/cxf-transport-nmr/src/main/java/org/apache/servicemix/cxf/transport/nmr/NMRConduit.java b/cxf-transport-nmr/src/main/java/org/apache/servicemix/cxf/transport/nmr/NMRConduit.java
deleted file mode 100644
index 272509b..0000000
--- a/cxf-transport-nmr/src/main/java/org/apache/servicemix/cxf/transport/nmr/NMRConduit.java
+++ /dev/null
@@ -1,71 +0,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.
- */
-
-package org.apache.servicemix.cxf.transport.nmr;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.cxf.Bus;
-import org.apache.cxf.common.logging.LogUtils;
-import org.apache.cxf.message.Message;
-import org.apache.cxf.transport.AbstractConduit;
-import org.apache.cxf.ws.addressing.EndpointReferenceType;
-import org.apache.servicemix.nmr.api.Channel;
-import org.apache.servicemix.nmr.api.NMR;
-
-
-public class NMRConduit extends AbstractConduit {
-
-    private static final Logger LOG = LogUtils.getL7dLogger(NMRConduit.class);
-
-    private NMR nmr;
-    private Bus bus;
-           
-    public NMRConduit(EndpointReferenceType target, NMR nmr) {
-        this(null, target, nmr);
-    }
-    
-    public NMRConduit(Bus bus, EndpointReferenceType target, NMR nmr) {
-        super(target);
-        this.nmr = nmr;
-        this.bus = bus;
-    }
-
-    public Bus getBus() {
-        return bus;
-    }
-
-    public NMR getNmr() {
-        return nmr;
-    }
-
-    protected Logger getLogger() {
-        return LOG;
-    }
-    
-    public void prepare(Message message) throws IOException {
-        getLogger().log(Level.FINE, "JBIConduit send message");
-                
-        message.setContent(OutputStream.class,
-                           new NMRConduitOutputStream(message, nmr, target, this));
-    }    
-}
diff --git a/cxf-transport-nmr/src/main/java/org/apache/servicemix/cxf/transport/nmr/NMRConduitOutputStream.java b/cxf-transport-nmr/src/main/java/org/apache/servicemix/cxf/transport/nmr/NMRConduitOutputStream.java
deleted file mode 100644
index 0646d1c..0000000
--- a/cxf-transport-nmr/src/main/java/org/apache/servicemix/cxf/transport/nmr/NMRConduitOutputStream.java
+++ /dev/null
@@ -1,166 +0,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.
- */
-
-package org.apache.servicemix.cxf.transport.nmr;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Member;
-import java.lang.reflect.Method;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.logging.Logger;
-
-import javax.jws.WebService;
-import javax.xml.namespace.QName;
-import javax.xml.transform.Source;
-import javax.xml.transform.stream.StreamSource;
-
-import org.apache.cxf.common.logging.LogUtils;
-import org.apache.cxf.io.CachedOutputStream;
-import org.apache.cxf.message.Exchange;
-import org.apache.cxf.message.Message;
-import org.apache.cxf.message.MessageImpl;
-import org.apache.cxf.service.model.BindingOperationInfo;
-import org.apache.cxf.ws.addressing.EndpointReferenceType;
-import org.apache.cxf.wsdl.EndpointReferenceUtils;
-import org.apache.servicemix.nmr.api.Channel;
-import org.apache.servicemix.nmr.api.Endpoint;
-import org.apache.servicemix.nmr.api.NMR;
-import org.apache.servicemix.nmr.api.Pattern;
-import org.apache.servicemix.nmr.api.Reference;
-import org.apache.servicemix.nmr.api.Status;
-
-public class NMRConduitOutputStream extends CachedOutputStream {
-
-    private static final Logger LOG = LogUtils.getL7dLogger(NMRConduitOutputStream.class);
-
-    private Message message;
-    private boolean isOneWay;
-    private Channel channel;
-    private NMRConduit conduit;
-    private EndpointReferenceType target;
-
-    public NMRConduitOutputStream(Message m, NMR nmr, EndpointReferenceType target,
-                                  NMRConduit conduit) {
-        message = m;
-        this.channel = nmr.createChannel();
-        this.conduit = conduit;
-        this.target = target;
-        
-    }
-
-    @Override
-    protected void doFlush() throws IOException {
-
-    }
-
-    @Override
-    protected void doClose() throws IOException {
-        isOneWay = message.getExchange().isOneWay();
-        commitOutputMessage();
-        if (target != null) {
-            target.getClass();
-        }
-        channel.close();
-    }
-
-    private void commitOutputMessage() throws IOException {
-        try {
-            Member member = (Member) message.get(Method.class.getName());
-            Class<?> clz = member.getDeclaringClass();
-            Exchange exchange = message.getExchange();
-            BindingOperationInfo bop = exchange.get(BindingOperationInfo.class);
-
-            LOG.info(new org.apache.cxf.common.i18n.Message("INVOKE.SERVICE", LOG).toString() + clz);
-
-            WebService ws = clz.getAnnotation(WebService.class);
-            assert ws != null;
-            QName interfaceName = new QName(ws.targetNamespace(), ws.name());
-            QName serviceName;
-            if (target != null) {
-                serviceName = EndpointReferenceUtils.getServiceName(target);
-            } else {
-                serviceName = message.getExchange().get(org.apache.cxf.service.Service.class).getName();
-            }
-          
-            LOG.info(new org.apache.cxf.common.i18n.Message("CREATE.MESSAGE.EXCHANGE", LOG).toString() + serviceName);
-            org.apache.servicemix.nmr.api.Exchange xchng;
-            if (isOneWay) {
-                xchng = channel.createExchange(Pattern.InOnly);
-            } else if (bop.getOutput() == null) {
-                xchng = channel.createExchange(Pattern.RobustInOnly);
-            } else {
-                xchng = channel.createExchange(Pattern.InOut);
-            }
-
-            org.apache.servicemix.nmr.api.Message inMsg = xchng.getIn();
-            LOG.info(new org.apache.cxf.common.i18n.Message("EXCHANGE.ENDPOINT", LOG).toString() + serviceName);
-            LOG.info("setup message contents on " + inMsg);
-            inMsg.setBody(getMessageContent(message));
-            LOG.info("service for exchange " + serviceName);
-
-            Map<String,Object> refProps = new HashMap<String,Object>();
-            refProps.put(Endpoint.INTERFACE_NAME, interfaceName);
-            refProps.put(Endpoint.SERVICE_NAME, serviceName);
-            Reference ref = channel.getNMR().getEndpointRegistry().lookup(refProps);
-            xchng.setTarget(ref);
-            xchng.setOperation(bop.getName());
-            LOG.info("sending message");
-            if (!isOneWay) {
-                channel.sendSync(xchng);
-                Source content = null;
-                if (xchng.getFault(false) != null) {
-                    content = xchng.getFault().getBody(Source.class);
-                } else {
-                    content = xchng.getOut().getBody(Source.class);
-                }
-                Message inMessage = new MessageImpl();
-                message.getExchange().setInMessage(inMessage);
-                InputStream ins = NMRMessageHelper.convertMessageToInputStream(content);
-                if (ins == null) {
-                    throw new IOException(new org.apache.cxf.common.i18n.Message("UNABLE.RETRIEVE.MESSAGE", LOG).toString());
-                }
-                inMessage.setContent(InputStream.class, ins);
-                conduit.getMessageObserver().onMessage(inMessage);
-
-                xchng.setStatus(Status.Done);
-                channel.send(xchng);
-            } else {
-                channel.sendSync(xchng);
-            }
-        } catch (IOException e) {
-            throw e;
-        } catch (Exception e) {
-            e.printStackTrace();
-            new IOException(e.toString());
-        }
-    }
-
-    private Source getMessageContent(Message message2) throws IOException {
-        return new StreamSource(this.getInputStream());
-        
-    }
-
-    @Override
-    protected void onWrite() throws IOException {
-
-    }
-
-}
diff --git a/cxf-transport-nmr/src/main/java/org/apache/servicemix/cxf/transport/nmr/NMRDestination.java b/cxf-transport-nmr/src/main/java/org/apache/servicemix/cxf/transport/nmr/NMRDestination.java
deleted file mode 100644
index 67c575a..0000000
--- a/cxf-transport-nmr/src/main/java/org/apache/servicemix/cxf/transport/nmr/NMRDestination.java
+++ /dev/null
@@ -1,157 +0,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.
- */
-
-package org.apache.servicemix.cxf.transport.nmr;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import javax.xml.namespace.QName;
-import javax.xml.transform.Source;
-
-import org.apache.cxf.common.logging.LogUtils;
-import org.apache.cxf.message.Message;
-import org.apache.cxf.message.MessageImpl;
-import org.apache.cxf.service.model.EndpointInfo;
-import org.apache.cxf.transport.AbstractConduit;
-import org.apache.cxf.transport.AbstractDestination;
-import org.apache.cxf.transport.Conduit;
-import org.apache.cxf.transport.MessageObserver;
-import org.apache.cxf.ws.addressing.EndpointReferenceType;
-import org.apache.cxf.wsdl.EndpointReferenceUtils;
-import org.apache.servicemix.nmr.api.Channel;
-import org.apache.servicemix.nmr.api.Endpoint;
-import org.apache.servicemix.nmr.api.Exchange;
-import org.apache.servicemix.nmr.api.NMR;
-import org.apache.servicemix.nmr.api.ServiceMixException;
-
-public class NMRDestination extends AbstractDestination implements Endpoint {
-    
-    private static final Logger LOG = LogUtils.getL7dLogger(NMRDestination.class);
-    private NMR nmr;
-    private Channel channel;
-    private Map<String, Object> properties;
-
-    public NMRDestination(EndpointInfo info, NMR nmr) {
-        super(getTargetReference(info, null), info);
-        this.nmr = nmr;
-        this.properties = new HashMap<String, Object>();
-        this.properties.put(Endpoint.NAME, info.getName().toString());
-        this.properties.put(Endpoint.SERVICE_NAME, info.getService().getName());
-        this.properties.put(Endpoint.INTERFACE_NAME, info.getInterface().getName());
-    }
-
-    public void setChannel(Channel dc) {
-        this.channel = dc;
-    }
-    
-    public Channel getChannel() {
-        return this.channel;
-    }
-    
-    protected Logger getLogger() {
-        return LOG;
-    }
-    
-    /**
-     * @param inMessage the incoming message
-     * @return the inbuilt backchannel
-     */
-    protected Conduit getInbuiltBackChannel(Message inMessage) {
-        return new BackChannelConduit(EndpointReferenceUtils.getAnonymousEndpointReference(),
-                                      inMessage);
-    }
-    
-    public void shutdown() {
-        nmr.getEndpointRegistry().unregister(this, properties);
-    }
-
-    public void deactivate() {
-        nmr.getEndpointRegistry().unregister(this, properties);
-    }
-
-    public void activate()  {
-        nmr.getEndpointRegistry().register(this, properties);
-    }
-
-    public void process(Exchange exchange) {
-        QName opName = exchange.getOperation();
-        getLogger().fine("dispatch method: " + opName);
-
-        org.apache.servicemix.nmr.api.Message nm = exchange.getIn();
-        try {
-
-            MessageImpl inMessage = new MessageImpl();
-            inMessage.put(Exchange.class, exchange);
-
-            final InputStream in = NMRMessageHelper.convertMessageToInputStream(nm.getBody(Source.class));
-            inMessage.setContent(InputStream.class, in);
-            inMessage.setDestination(this);
-            getMessageObserver().onMessage(inMessage);
-
-        } catch (Exception ex) {
-            getLogger().log(Level.SEVERE, new org.apache.cxf.common.i18n.Message("ERROR.PREPARE.MESSAGE", getLogger()).toString(), ex);
-            throw new ServiceMixException(ex);
-        }
-    }
-
-
-    protected class BackChannelConduit extends AbstractConduit {
-        
-        protected Message inMessage;
-        protected NMRDestination nmrDestination;
-                
-        BackChannelConduit(EndpointReferenceType ref, Message message) {
-            super(ref);
-            inMessage = message;
-        }
-        
-        /**
-         * Register a message observer for incoming messages.
-         * 
-         * @param observer the observer to notify on receipt of incoming
-         */
-        public void setMessageObserver(MessageObserver observer) {
-            // shouldn't be called for a back channel conduit
-        }
-
-        /**
-         * Send an outbound message, assumed to contain all the name-value
-         * mappings of the corresponding input message (if any). 
-         * 
-         * @param message the message to be sent.
-         */
-        public void prepare(Message message) throws IOException {
-            // setup the message to be send back
-            Channel dc = channel;
-            message.put(Exchange.class, inMessage.get(Exchange.class));
-            message.setContent(OutputStream.class, new NMRDestinationOutputStream(inMessage, dc));
-        }        
-
-        protected Logger getLogger() {
-            return LOG;
-        }
-    }
-    
-}
diff --git a/cxf-transport-nmr/src/main/java/org/apache/servicemix/cxf/transport/nmr/NMRDestinationOutputStream.java b/cxf-transport-nmr/src/main/java/org/apache/servicemix/cxf/transport/nmr/NMRDestinationOutputStream.java
deleted file mode 100644
index 2461c93..0000000
--- a/cxf-transport-nmr/src/main/java/org/apache/servicemix/cxf/transport/nmr/NMRDestinationOutputStream.java
+++ /dev/null
@@ -1,99 +0,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.
- */
-
-package org.apache.servicemix.cxf.transport.nmr;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.transform.dom.DOMSource;
-
-import org.w3c.dom.Document;
-
-import org.apache.cxf.common.logging.LogUtils;
-import org.apache.cxf.io.CachedOutputStream;
-import org.apache.cxf.message.Message;
-import org.apache.servicemix.nmr.api.Channel;
-import org.apache.servicemix.nmr.api.Exchange;
-
-public class NMRDestinationOutputStream extends CachedOutputStream {
-
-    private static final Logger LOG = LogUtils.getL7dLogger(NMRDestinationOutputStream.class);
-    private Message inMessage;
-    private Channel channel;
-    
-    public NMRDestinationOutputStream(Message m,
-                               Channel dc) {
-        super();
-        inMessage = m;
-        channel = dc;
-    }
-    
-    @Override
-    protected void doFlush() throws IOException {
-        // so far do nothing
-    }
-
-    @Override
-    protected void doClose() throws IOException {
-        commitOutputMessage();
-    }
-
-    @Override
-    protected void onWrite() throws IOException {
-        // so far do nothing
-    }
-
-    private void commitOutputMessage() throws IOException {
-        try { 
-            if (inMessage.getExchange().isOneWay()) {
-                return;
-            } else {
-                InputStream bais = getInputStream();
-                LOG.finest(new org.apache.cxf.common.i18n.Message("BUILDING.DOCUMENT", LOG).toString());
-                DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
-                docBuilderFactory.setNamespaceAware(true);
-                DocumentBuilder builder = docBuilderFactory.newDocumentBuilder();
-                Document doc = builder.parse(bais);
-            
-                Exchange xchng = inMessage.get(Exchange.class);
-                LOG.fine(new org.apache.cxf.common.i18n.Message("CREATE.NORMALIZED.MESSAGE", LOG).toString());
-                if (inMessage.getExchange().getOutFaultMessage() != null) {
-                    org.apache.cxf.interceptor.Fault f = (org.apache.cxf.interceptor.Fault) inMessage.getContent(Exception.class);
-                    if (f.hasDetails()) {
-                        xchng.getFault().setBody(new DOMSource(doc));
-                    } else {
-                        xchng.setError(f);
-                    }
-                } else {
-                    xchng.getOut().setBody(new DOMSource(doc));
-                }
-                LOG.fine(new org.apache.cxf.common.i18n.Message("POST.DISPATCH", LOG).toString());
-                channel.send(xchng);
-            }
-        } catch (Exception ex) { 
-            LOG.log(Level.SEVERE, new org.apache.cxf.common.i18n.Message("ERROR.SEND.MESSAGE", LOG).toString(), ex);
-        }
-    }
-    
-}
diff --git a/cxf-transport-nmr/src/main/java/org/apache/servicemix/cxf/transport/nmr/NMRMessageHelper.java b/cxf-transport-nmr/src/main/java/org/apache/servicemix/cxf/transport/nmr/NMRMessageHelper.java
deleted file mode 100644
index 033ee2f..0000000
--- a/cxf-transport-nmr/src/main/java/org/apache/servicemix/cxf/transport/nmr/NMRMessageHelper.java
+++ /dev/null
@@ -1,55 +0,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.
- */
-
-package org.apache.servicemix.cxf.transport.nmr;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import javax.xml.transform.Source;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.stream.StreamResult;
-
-
-
-public final class NMRMessageHelper {
-
-
-    private static final TransformerFactory TRANSFORMER_FACTORY = TransformerFactory.newInstance();
-
-    private NMRMessageHelper() {
-        // complete
-    }
-
-    public static InputStream convertMessageToInputStream(Source src) throws IOException,
-        TransformerConfigurationException, TransformerException {
-
-        final Transformer transformer = TRANSFORMER_FACTORY.newTransformer();
-
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        StreamResult result = new StreamResult(baos);
-        transformer.transform(src, result);
-        
-        return new ByteArrayInputStream(baos.toByteArray());
-    }
-}
diff --git a/cxf-transport-nmr/src/main/java/org/apache/servicemix/cxf/transport/nmr/NMRTransportFactory.java b/cxf-transport-nmr/src/main/java/org/apache/servicemix/cxf/transport/nmr/NMRTransportFactory.java
deleted file mode 100644
index 995da2e..0000000
--- a/cxf-transport-nmr/src/main/java/org/apache/servicemix/cxf/transport/nmr/NMRTransportFactory.java
+++ /dev/null
@@ -1,155 +0,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.
- */
-package org.apache.servicemix.cxf.transport.nmr;
-
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.Logger;
-
-import javax.annotation.PostConstruct;
-import javax.annotation.Resource;
-
-import org.apache.cxf.Bus;
-import org.apache.cxf.common.logging.LogUtils;
-import org.apache.cxf.configuration.Configurer;
-import org.apache.cxf.service.model.EndpointInfo;
-import org.apache.cxf.transport.AbstractTransportFactory;
-import org.apache.cxf.transport.Conduit;
-import org.apache.cxf.transport.ConduitInitiator;
-import org.apache.cxf.transport.ConduitInitiatorManager;
-import org.apache.cxf.transport.Destination;
-import org.apache.cxf.transport.DestinationFactory;
-import org.apache.cxf.transport.DestinationFactoryManager;
-import org.apache.cxf.ws.addressing.EndpointReferenceType;
-import org.apache.servicemix.nmr.api.NMR;
-import org.apache.servicemix.nmr.api.ServiceMixException;
-
-public class NMRTransportFactory extends AbstractTransportFactory implements ConduitInitiator,
-    DestinationFactory {
-    
-    public static final String TRANSPORT_ID = "http://cxf.apache.org/transports/nmr";
-    
-    private static final Logger LOG = LogUtils.getL7dLogger(NMRTransportFactory.class);
-
-
-    private NMR nmr;
-    private Bus bus;
-    private final Map<String, NMRDestination> destinationMap =  new HashMap<String, NMRDestination>();
-    
-
-    private Collection<String> activationNamespaces;
-
-    @Resource
-    public void setBus(Bus b) {
-        bus = b;
-    }
-    
-    public Bus getBus() {
-        return bus;
-    }
-    
-    public Set<String> getUriPrefixes() {
-        return Collections.singleton("nmr");
-    }
-
-    @Resource
-    public void setActivationNamespaces(Collection<String> ans) {
-        activationNamespaces = ans;
-    }
-
-    public NMR getNmr() {
-        return nmr;
-    }
-
-    public void setNmr(NMR nmr) {
-        this.nmr = nmr;
-    }
-
-    @PostConstruct
-    void registerWithBindingManager() {
-        if (null == bus) {
-            return;
-        }
-        ConduitInitiatorManager cim = bus.getExtension(ConduitInitiatorManager.class);
-        if (null != cim && null != activationNamespaces) {
-            for (String ns : activationNamespaces) {
-                cim.registerConduitInitiator(ns, this);
-            }
-        }
-        DestinationFactoryManager dfm = bus.getExtension(DestinationFactoryManager.class);
-        if (null != dfm && null != activationNamespaces) {
-            for (String ns : activationNamespaces) {
-                dfm.registerDestinationFactory(ns, this);
-            }
-        }
-    }
-
-    
-
-    
-    public Conduit getConduit(EndpointInfo targetInfo) throws IOException {
-        return getConduit(targetInfo, null);
-    }
-
-    public Conduit getConduit(EndpointInfo endpointInfo, EndpointReferenceType target) throws IOException {
-        Conduit conduit = new NMRConduit(target, nmr);
-        Configurer configurer = bus.getExtension(Configurer.class);
-        if (null != configurer) {
-            configurer.configureBean(conduit);
-        }
-        return conduit;
-    }
-
-    public Destination getDestination(EndpointInfo ei) throws IOException {
-        NMRDestination destination = new NMRDestination(ei, nmr);
-        Configurer configurer = bus.getExtension(Configurer.class);
-        if (null != configurer) {
-            configurer.configureBean(destination);
-        }
-        try {
-            putDestination(ei.getService().getName().toString()
-                + ei.getInterface().getName().toString(), destination);
-        } catch (ServiceMixException e) {
-            throw new IOException(e.getMessage());
-        }
-        return destination;
-    }
-    
-    public void putDestination(String epName, NMRDestination destination) throws ServiceMixException {
-        if (destinationMap.containsKey(epName)) {
-            throw new ServiceMixException("JBIDestination for Endpoint "
-                                   + epName + " already be created");
-        } else {
-            destinationMap.put(epName, destination);
-        }
-    }
-
-    public NMRDestination getDestination(String epName) {
-        return destinationMap.get(epName);
-    }
-    
-    public void removeDestination(String epName) {
-        destinationMap.remove(epName);
-    }
-    
-}
diff --git a/cxf-transport-nmr/src/main/resources/META-INF/cxf/transport/nmr/cxf-transport-nmr.xml b/cxf-transport-nmr/src/main/resources/META-INF/cxf/transport/nmr/cxf-transport-nmr.xml
deleted file mode 100644
index 108a740..0000000
--- a/cxf-transport-nmr/src/main/resources/META-INF/cxf/transport/nmr/cxf-transport-nmr.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?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://www.springframework.org/schema/beans"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xmlns:osgi="http://www.springframework.org/schema/osgi"
-       xsi:schemaLocation="
-http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-http://www.springframework.org/schema/osgi  http://www.springframework.org/schema/osgi/spring-osgi.xsd">
-
-    <bean class="org.apache.servicemix.cxf.transport.nmr.NMRTransportFactory"
-	      id="org.apache.servicemix.cxf.transport.nmr.NMRTransportFactory"
-	      lazy-init="true">
-        <property name="bus" ref="cxf"/>
-        <property name="nmr">
-            <osgi:reference interface="org.apache.servicemix.nmr.api.NMR"/>
-        </property>
-        <property name="transportIds">
-            <list>
-                <value>http://cxf.apache.org/transports/nmr</value>
-                <value>http://cxf.apache.org/transports/nmr/configuration</value>
-            </list>
-        </property>
-    </bean>
-
-</beans>
diff --git a/cxf-transport-nmr/src/main/resources/org/apache/servicemix/cxf/transport/nmr/Messages.properties b/cxf-transport-nmr/src/main/resources/org/apache/servicemix/cxf/transport/nmr/Messages.properties
deleted file mode 100644
index a976b16..0000000
--- a/cxf-transport-nmr/src/main/resources/org/apache/servicemix/cxf/transport/nmr/Messages.properties
+++ /dev/null
@@ -1,46 +0,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.
-#
-NOT.IMPLEMENTED=not yet implemented
-INVOKE.SERVICE=invoking service\t
-CREATE.MESSAGE.EXCHANGE=create message exchange svc:\t
-EXCHANGE.ENDPOINT=exchange endpoint:\t
-NO.MESSAGE=no message yet
-UNABLE.RETRIEVE.MESSAGE=unable to retrieve message
-CONTEXT.MUST.BE=context must be of type JBIOutputStreamMessageContext
-RECEIVED.MESSAGE=received message:\t
-ACTIVE.JBI.SERVER.TRANSPORT=activating JBI server transport
-BUILDING.DOCUMENT=building document from bytes
-CREATE.NORMALIZED.MESSAGE=creating NormalizedMessage
-POST.DISPATCH=postDispatch sending out message to NWR
-ERROR.SEND.MESSAGE=error sending Out message
-DISPATCH.MESSAGE.ON.CALLBACK=dispatching message on callback:\t
-ERROR.PREPARE.MESSAGE=error preparing message
-RECEIVE.THREAD.START=JBIServerTransport message receiving thread started
-DISPATCH.TO.SU=dispatching to CXF service unit
-NO.SU.FOUND=no CXFServiceUnit found
-ERROR.DISPATCH.THREAD=error running dispatch thread
-JBI.SERVER.TRANSPORT.MESSAGE.PROCESS.THREAD.EXIT=JBIServerTransport message processing thread exiting
-CONFIG.DELIVERY.CHANNEL=configuring DeliveryChannel:\t
-CONFIG.SU.MANAGER=configuring ServiceUnitManager:\t
-JBI.TRANSPORT.FACTORY.NOT.INITIALIZED=JBITransportFactory is not properly initialized
-SU.MANAGER=CXFServiceUnitManager:\t
-DELIVERY.CHANNEL=DeliveryChannel:\t
-JBI.TRANSPORT.FACTORY.NOT.FULLY.INITIALIZED=JBITransport factory not fully initialized
-CREATE.SERVER.TRANSPORT=creating JBI server transport
-CREATE.CLIENT.TRANSPORT=creating JBI client transport
diff --git a/cxf-transport-osgi/pom.xml b/cxf-transport-osgi/pom.xml
deleted file mode 100644
index 445ba47..0000000
--- a/cxf-transport-osgi/pom.xml
+++ /dev/null
@@ -1,123 +0,0 @@
-<?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.ejb3</groupId>
-	    <artifactId>ejb3</artifactId>
-        <version>1.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.ejb3</groupId>
-    <artifactId>org.apache.servicemix.cxf.transport.osgi</artifactId>
-    <packaging>bundle</packaging>
-    <version>1.0-SNAPSHOT</version>
-    <name>ServiceMix CXF Transport for OSGi</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.compendium</artifactId>
-            <version>${felix.compendium.version}</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.cxf</groupId>
-            <artifactId>cxf-bundle</artifactId>
-            <version>${cxf.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-core</artifactId>
-            <version>${spring.version}</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <!-- Bundle generation -->
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
-                        <Import-Package>
-                            javax.xml.rpc*;resolution:=optional,
-                            javax.xml.soap,
-                            com.ctc.wstx.stax;resolution:=optional,
-                            org.apache.axis.soap;resolution:=optional,
-                            org.apache.axis2.saaj;resolution:=optional,
-                            com.sun.xml.messaging.saaj.soap.ver1_1;resolution:=optional,
-                            com.sun.xml.messaging.saaj.client.p2p;resolution:=optional,
-                            com.sun.xml.messaging.saaj.soap;resolution:=optional,
-                            *
-                        </Import-Package>
-                        <Export-Package>
-                            org.apache.servicemix.cxf.transport.http_osgi,
-                            '=META-INF.cxf.osgi'
-                        </Export-Package>
-                        <_failok>true</_failok>
-                        <Spring-Context>*;publish-context:=false</Spring-Context>
-                    </instructions>
-                </configuration>
-            </plugin>
-            <!-- generate dependencies versions -->
-            <plugin>
-		        <groupId>org.apache.servicemix.kernel.testing</groupId>
-		        <artifactId>depends-maven-plugin</artifactId>
-                <version>${servicemix.kernel.version}</version>
-                <executions>
-                    <execution>
-                        <id>generate-depends-file</id>
-                        <goals>
-                            <goal>generate-depends-file</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-surefire-plugin</artifactId>
-                <configuration>
-                    <forkMode>pertest</forkMode>
-                    <systemProperties>
-                        <property>
-                            <name>javax.xml.parsers.DocumentBuilderFactory</name>
-                            <value>com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl</value>
-                        </property>
-                        <property>
-                            <name>javax.xml.datatype.DatatypeFactory</name>
-                            <value>com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl</value>
-                        </property>
-                        <property>
-                            <name>javax.xml.parsers.SAXParserFactory</name>
-                            <value>com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl</value>
-                        </property>
-                    </systemProperties>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/cxf-transport-osgi/src/main/java/org/apache/servicemix/cxf/transport/http_osgi/OsgiDestination.java b/cxf-transport-osgi/src/main/java/org/apache/servicemix/cxf/transport/http_osgi/OsgiDestination.java
deleted file mode 100644
index 1175272..0000000
--- a/cxf-transport-osgi/src/main/java/org/apache/servicemix/cxf/transport/http_osgi/OsgiDestination.java
+++ /dev/null
@@ -1,105 +0,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.
- */
-package org.apache.servicemix.cxf.transport.http_osgi;
-
-import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-
-import org.apache.cxf.Bus;
-import org.apache.cxf.common.logging.LogUtils;
-import org.apache.cxf.message.MessageImpl;
-import org.apache.cxf.service.model.EndpointInfo;
-import org.apache.cxf.transport.ConduitInitiator;
-import org.apache.cxf.transport.MessageObserver;
-import org.apache.cxf.transport.http.AbstractHTTPDestination;
-
-
-public class OsgiDestination extends AbstractHTTPDestination {
-
-    static final Logger LOG = LogUtils.getL7dLogger(OsgiDestination.class);
-
-    private static final long serialVersionUID = 1L;
-
-    final OsgiDestinationRegistry factory;
-    final String path;
-
-    /**
-     * Constructor, allowing subsititution of configuration.
-     *
-     * @param b the associated Bus
-     * @param ci the associated conduit initiator
-     * @param ei the endpoint info of the destination
-     * @param fact the transport factory
-     * @param p the path
-     * @throws IOException
-     */
-    public OsgiDestination(Bus b,
-                           ConduitInitiator ci,
-                           EndpointInfo ei,
-                           OsgiDestinationRegistry fact,
-                           String p)
-        throws IOException {
-        // would add the default port to the address
-        super(b, ci, ei, false);
-        factory = fact;
-        path = p;
-    }
-
-
-    protected Logger getLogger() {
-        return LOG;
-    }
-
-    protected Bus getBus() {
-        return bus;
-    }
-
-
-    protected void doMessage(MessageImpl inMessage) throws IOException {
-        try {
-
-            setHeaders(inMessage);
-
-            inMessage.setDestination(this);
-
-            incomingObserver.onMessage(inMessage);
-
-        } finally {
-            if (LOG.isLoggable(Level.FINE)) {
-                LOG.fine("Finished servicing http request on thread: " + Thread.currentThread());
-            }
-        }
-    }
-
-    @Override
-    public void shutdown() {
-        factory.removeDestination(path);
-        super.shutdown();
-    }
-
-    public MessageObserver getMessageObserver() {
-        return this.incomingObserver;
-    }
-
-    public EndpointInfo getEndpointInfo() {
-        return endpointInfo;
-    }
-}
diff --git a/cxf-transport-osgi/src/main/java/org/apache/servicemix/cxf/transport/http_osgi/OsgiDestinationRegistry.java b/cxf-transport-osgi/src/main/java/org/apache/servicemix/cxf/transport/http_osgi/OsgiDestinationRegistry.java
deleted file mode 100644
index dc2860f..0000000
--- a/cxf-transport-osgi/src/main/java/org/apache/servicemix/cxf/transport/http_osgi/OsgiDestinationRegistry.java
+++ /dev/null
@@ -1,75 +0,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.
- */
-package org.apache.servicemix.cxf.transport.http_osgi;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-public class OsgiDestinationRegistry {
-
-    private ConcurrentMap<String, OsgiDestination> destinations = new ConcurrentHashMap<String, OsgiDestination>();
-
-    public OsgiDestinationRegistry() {
-    }
-
-    public void addDestination(String path, OsgiDestination destination) {
-        String p = getTrimmedPath(path);
-        destinations.putIfAbsent(path, destination);
-    }
-
-    public void removeDestination(String path) {
-        destinations.remove(path);
-    }
-
-    public OsgiDestination getDestinationForPath(String path) {
-        // to use the url context match
-        return destinations.get(getTrimmedPath(path));
-    }
-
-    public Collection<OsgiDestination> getDestinations() {
-        return Collections.unmodifiableCollection(destinations.values());
-    }
-
-    public Set<String> getDestinationsPaths() {
-        return Collections.unmodifiableSet(destinations.keySet());
-    }
-
-    static String getTrimmedPath(String path) {
-        if (path == null) {
-            return "/";
-        }
-        final String lh = "http://localhost/";
-        final String lhs = "https://localhost/";
-
-        if (path.startsWith(lh)) {
-            path = path.substring(lh.length());
-        } else if (path.startsWith(lhs)) {
-            path = path.substring(lhs.length());
-        }
-        if (!path.startsWith("/")) {
-            path = "/" + path;
-
-        }
-        return path;
-    }
-
-}
diff --git a/cxf-transport-osgi/src/main/java/org/apache/servicemix/cxf/transport/http_osgi/OsgiServlet.java b/cxf-transport-osgi/src/main/java/org/apache/servicemix/cxf/transport/http_osgi/OsgiServlet.java
deleted file mode 100644
index e2ba880..0000000
--- a/cxf-transport-osgi/src/main/java/org/apache/servicemix/cxf/transport/http_osgi/OsgiServlet.java
+++ /dev/null
@@ -1,294 +0,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.
- */
-package org.apache.servicemix.cxf.transport.http_osgi;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.InputStream;
-import java.util.logging.Logger;
-import java.util.logging.Level;
-import java.util.Set;
-import java.util.Collection;
-import java.security.Principal;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.cxf.Bus;
-import org.apache.cxf.helpers.HttpHeaderHelper;
-import org.apache.cxf.security.SecurityContext;
-import org.apache.cxf.transport.http.AbstractHTTPDestination;
-import org.apache.cxf.transport.http.HTTPSession;
-import org.apache.cxf.transport.https.SSLUtils;
-import org.apache.cxf.message.MessageImpl;
-import org.apache.cxf.message.Message;
-import org.apache.cxf.message.ExchangeImpl;
-import org.apache.cxf.transports.http.QueryHandlerRegistry;
-import org.apache.cxf.transports.http.QueryHandler;
-import org.apache.cxf.service.model.EndpointInfo;
-import org.apache.cxf.common.logging.LogUtils;
-import org.apache.cxf.common.util.StringUtils;
-import org.xmlsoap.schemas.wsdl.http.AddressType;
-
-public class OsgiServlet extends HttpServlet {
-
-    private static final Logger LOG = LogUtils.getL7dLogger(OsgiServlet.class);
-
-    private OsgiDestinationRegistry transport;
-    private String lastBase = "";
-    private boolean isHideServiceList;
-    private boolean disableAddressUpdates;
-    private String forcedBaseAddress;
-
-    public OsgiServlet(OsgiDestinationRegistry transport) {
-        this.transport = transport;
-    }
-
-    @Override
-    public void destroy() {
-    }
-
-    @Override
-    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException {
-        invoke(request, response);
-    }
-
-    @Override
-    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException {
-        invoke(request, response);
-    }
-
-    @Override
-    protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-        invoke(request, response);
-    }
-
-    @Override
-    protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-        invoke(request, response);
-    }
-
-    public void setHideServiceList(boolean generate) {
-        isHideServiceList = generate;
-    }
-
-    public void setDisableAddressUpdates(boolean noupdates) {
-        disableAddressUpdates = noupdates;
-    }
-
-    public void setForcedBaseAddress(String s) {
-        forcedBaseAddress = s;
-    }
-
-    private synchronized void updateDests(HttpServletRequest request) {
-        if (disableAddressUpdates) {
-            return;
-        }
-        String base = forcedBaseAddress == null ? getBaseURL(request) : forcedBaseAddress;
-
-        //if (base.equals(lastBase)) {
-        //    return;
-        //}
-        Set<String> paths = transport.getDestinationsPaths();
-        for (String path : paths) {
-            OsgiDestination d2 = transport.getDestinationForPath(path);
-            String ad = d2.getEndpointInfo().getAddress();
-            if (ad.equals(path)
-                || ad.equals(lastBase + path)) {
-                d2.getEndpointInfo().setAddress(base + path);
-                if (d2.getEndpointInfo().getExtensor(AddressType.class) != null) {
-                    d2.getEndpointInfo().getExtensor(AddressType.class).setLocation(base + path);
-                }
-            }
-        }
-        lastBase = base;
-    }
-
-    public void invoke(HttpServletRequest request, HttpServletResponse res) throws ServletException {
-        try {
-            EndpointInfo ei = new EndpointInfo();
-            String address = request.getPathInfo() == null ? "" : request.getPathInfo();
-
-            ei.setAddress(address);
-            OsgiDestination d = (OsgiDestination) transport.getDestinationForPath(ei.getAddress());
-
-            if (d == null) {
-                if (request.getRequestURI().endsWith("/services")
-                    || request.getRequestURI().endsWith("/services/")
-                    || StringUtils.isEmpty(request.getPathInfo())
-                    || "/".equals(request.getPathInfo())) {
-                    updateDests(request);
-                    generateServiceList(request, res);
-                } else {
-                    d = checkRestfulRequest(request);
-                    if (d == null || d.getMessageObserver() == null) {
-                        LOG.warning("Can't find the the request for "
-                                    + request.getRequestURL() + "'s Observer ");
-                        generateNotFound(request, res);
-                    }  else { // the request should be a restful service request
-                        updateDests(request);
-                        invokeDestination(request, res, d);
-                    }
-                }
-            } else {
-                ei = d.getEndpointInfo();
-                Bus bus = d.getBus();
-                if (null != request.getQueryString()
-                    && request.getQueryString().length() > 0
-                    && bus.getExtension(QueryHandlerRegistry.class) != null) {
-
-                    String ctxUri = request.getPathInfo();
-                    String baseUri = request.getRequestURL().toString()
-                        + "?" + request.getQueryString();
-                    // update the EndPoint Address with request url
-                    if ("GET".equals(request.getMethod())) {
-                        updateDests(request);
-                    }
-
-                    for (QueryHandler qh : bus.getExtension(QueryHandlerRegistry.class).getHandlers()) {
-                        if (qh.isRecognizedQuery(baseUri, ctxUri, ei)) {
-
-                            res.setContentType(qh.getResponseContentType(baseUri, ctxUri));
-                            OutputStream out = res.getOutputStream();
-                            try {
-                                qh.writeResponse(baseUri, ctxUri, ei, out);
-                                out.flush();
-                                return;
-                            } catch (Exception e) {
-                                //throw new ServletException(e);
-                                LOG.warning(qh.getClass().getName()
-                                    + " Exception caught writing response: "
-                                    + e.getMessage());
-                            }
-                        }
-                    }
-                }
-
-                invokeDestination(request, res, d);
-            }
-        } catch (IOException e) {
-            throw new ServletException(e);
-        }
-    }
-
-    private OsgiDestination checkRestfulRequest(HttpServletRequest request) throws IOException {
-
-        String address = request.getPathInfo() == null ? "" : request.getPathInfo();
-
-        for (String path : transport.getDestinationsPaths()) {
-            if (address.startsWith(path)) {
-                return transport.getDestinationForPath(path);
-            }
-        }
-        return null;
-    }
-
-    private void generateServiceList(HttpServletRequest request, HttpServletResponse response)
-        throws IOException {
-        Collection<OsgiDestination> destinations = transport.getDestinations();
-        response.setContentType("text/html");
-        response.getWriter().write("<html><body>");
-        if (!isHideServiceList) {
-            if (destinations.size() > 0) {
-                for (OsgiDestination sd : destinations) {
-                    if (null != sd.getEndpointInfo().getName()) {
-                        String address = sd.getEndpointInfo().getAddress();
-                        response.getWriter().write("<p> <a href=\"" + address + "?wsdl\">");
-                        response.getWriter().write(sd.getEndpointInfo().getName() + "</a> </p>");
-                    }
-                }
-            } else {
-                response.getWriter().write("No service was found.");
-            }
-        }
-        response.getWriter().write("</body></html>");
-    }
-
-    private String getBaseURL(HttpServletRequest request) {
-        String reqPrefix = request.getRequestURL().toString();
-        String pathInfo = request.getPathInfo() == null ? "" : request.getPathInfo();
-        //fix for CXF-898
-        if (!"/".equals(pathInfo) || reqPrefix.endsWith("/")) {
-            reqPrefix = reqPrefix.substring(0, reqPrefix.length() - pathInfo.length());
-        }
-        return reqPrefix;
-    }
-
-    protected void generateNotFound(HttpServletRequest request, HttpServletResponse res) throws IOException {
-        res.setStatus(404);
-        res.setContentType("text/html");
-        res.getWriter().write("<html><body>No service was found.</body></html>");
-    }
-
-    public void invokeDestination(final HttpServletRequest request, HttpServletResponse response, OsgiDestination d) throws ServletException {
-        if (LOG.isLoggable(Level.FINE)) {
-            LOG.fine("Service http request on thread: " + Thread.currentThread());
-        }
-
-        try {
-            MessageImpl inMessage = new MessageImpl();
-            inMessage.setContent(InputStream.class, request.getInputStream());
-            inMessage.put(AbstractHTTPDestination.HTTP_REQUEST, request);
-            inMessage.put(AbstractHTTPDestination.HTTP_RESPONSE, response);
-            inMessage.put(AbstractHTTPDestination.HTTP_CONTEXT, getServletContext());
-            inMessage.put(Message.HTTP_REQUEST_METHOD, request.getMethod());
-            inMessage.put(Message.PATH_INFO, request.getPathInfo());
-            inMessage.put(Message.QUERY_STRING, request.getQueryString());
-            inMessage.put(Message.CONTENT_TYPE, request.getContentType());
-            inMessage.put(Message.BASE_PATH, d.getAddress().getAddress().getValue());
-            inMessage.put(SecurityContext.class, new SecurityContext() {
-                public Principal getUserPrincipal() {
-                    return request.getUserPrincipal();
-                }
-                public boolean isUserInRole(String role) {
-                    return request.isUserInRole(role);
-                }
-            });
-
-            // work around a bug with Jetty which results in the character
-            // encoding not being trimmed correctly.
-            String enc = request.getCharacterEncoding();
-            if (enc != null && enc.endsWith("\"")) {
-                enc = enc.substring(0, enc.length() - 1);
-            }
-
-            String normalizedEncoding = HttpHeaderHelper.mapCharset(enc);
-            if (normalizedEncoding == null) {
-                String m = new org.apache.cxf.common.i18n.Message("INVALID_ENCODING_MSG",
-                                                                  LOG, enc).toString();
-                LOG.log(Level.WARNING, m);
-                throw new IOException(m);
-            }
-
-            inMessage.put(Message.ENCODING, normalizedEncoding);
-            SSLUtils.propogateSecureSession(request, inMessage);
-
-            ExchangeImpl exchange = new ExchangeImpl();
-            exchange.setInMessage(inMessage);
-            exchange.setSession(new HTTPSession(request));
-
-            d.doMessage(inMessage);
-        } catch (IOException e) {
-            throw new ServletException(e);
-        }
-
-    }
-}
diff --git a/cxf-transport-osgi/src/main/java/org/apache/servicemix/cxf/transport/http_osgi/OsgiTransportFactory.java b/cxf-transport-osgi/src/main/java/org/apache/servicemix/cxf/transport/http_osgi/OsgiTransportFactory.java
deleted file mode 100644
index 7d459bf..0000000
--- a/cxf-transport-osgi/src/main/java/org/apache/servicemix/cxf/transport/http_osgi/OsgiTransportFactory.java
+++ /dev/null
@@ -1,70 +0,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.
- */
-package org.apache.servicemix.cxf.transport.http_osgi;
-
-import java.io.IOException;
-import java.net.URI;
-
-import org.apache.cxf.service.model.EndpointInfo;
-import org.apache.cxf.transport.Destination;
-import org.apache.cxf.transport.DestinationFactory;
-import org.apache.cxf.transport.DestinationFactoryManager;
-import org.apache.cxf.transport.http.AbstractHTTPTransportFactory;
-
-public class OsgiTransportFactory extends AbstractHTTPTransportFactory
-    implements DestinationFactory {
-
-    private OsgiDestinationRegistry registry;
-
-    public void setRegistry(OsgiDestinationRegistry registry) {
-        this.registry = registry;
-    }
-
-    public void init() {
-        if (bus == null) {
-            throw new IllegalStateException("bus should not be null");
-        }
-        if (registry == null) {
-            throw new IllegalStateException("registry should not be null");
-        }
-        if (activationNamespaces == null) {
-            activationNamespaces = getTransportIds();
-        }
-        DestinationFactoryManager dfm = bus.getExtension(DestinationFactoryManager.class);
-        if (dfm != null && activationNamespaces != null) {
-            for (String ns : activationNamespaces) {
-                dfm.registerDestinationFactory(ns, this);
-            }
-        }
-    }
-
-    public Destination getDestination(EndpointInfo endpointInfo) throws IOException {
-        if (URI.create(endpointInfo.getAddress()).isAbsolute()) {
-            throw new IllegalStateException("Endpoint address should be a relative URI wrt to the servlet address (use '/xxx' for example)");
-        }
-        OsgiDestination d = registry.getDestinationForPath(endpointInfo.getAddress());
-        if (d == null) {
-            String path = OsgiDestinationRegistry.getTrimmedPath(endpointInfo.getAddress());
-            d = new OsgiDestination(getBus(), null, endpointInfo, registry, path);
-            registry.addDestination(path, d);
-        }
-        return d;
-    }
-
-}
diff --git a/cxf-transport-osgi/src/main/java/org/apache/servicemix/cxf/transport/http_osgi/SpringOsgiServlet.java b/cxf-transport-osgi/src/main/java/org/apache/servicemix/cxf/transport/http_osgi/SpringOsgiServlet.java
deleted file mode 100644
index a53155f..0000000
--- a/cxf-transport-osgi/src/main/java/org/apache/servicemix/cxf/transport/http_osgi/SpringOsgiServlet.java
+++ /dev/null
@@ -1,53 +0,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.
- */
-package org.apache.servicemix.cxf.transport.http_osgi;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.ServletException;
-
-import org.springframework.context.ApplicationContextAware;
-import org.springframework.context.ApplicationContext;
-
-public class SpringOsgiServlet extends OsgiServlet implements ApplicationContextAware {
-
-    private ApplicationContext applicationContext;
-
-    public SpringOsgiServlet(OsgiDestinationRegistry transport) {
-        super(transport);
-    }
-
-    public ApplicationContext getApplicationContext() {
-        return applicationContext;
-    }
-
-    public void setApplicationContext(ApplicationContext applicationContext) {
-        this.applicationContext = applicationContext;
-    }
-
-    public void invoke(HttpServletRequest request, HttpServletResponse res) throws ServletException {
-        ClassLoader cl = Thread.currentThread().getContextClassLoader();
-        try {
-            Thread.currentThread().setContextClassLoader(applicationContext.getClassLoader());
-            super.invoke(request, res);
-        } finally {
-            Thread.currentThread().setContextClassLoader(cl);
-        }
-    }
-}
diff --git a/cxf-transport-osgi/src/main/resources/META-INF/cxf/osgi/cxf-extension-osgi.xml b/cxf-transport-osgi/src/main/resources/META-INF/cxf/osgi/cxf-extension-osgi.xml
deleted file mode 100644
index c63af43..0000000
--- a/cxf-transport-osgi/src/main/resources/META-INF/cxf/osgi/cxf-extension-osgi.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?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://www.springframework.org/schema/beans"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xmlns:osgi="http://www.springframework.org/schema/osgi"
-       xsi:schemaLocation="
-http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-http://www.springframework.org/schema/osgi  http://www.springframework.org/schema/osgi/spring-osgi.xsd">
-
-    <bean id="org.apache.servicemix.cxf.transport.http_osgi.OsgiTransportFactory"
-          class="org.apache.servicemix.cxf.transport.http_osgi.OsgiTransportFactory"
-          init-method="init">
-
-        <property name="bus" ref="cxf"/>
-        <property name="registry" ref="osgiDestinationRegistry" />
-        <property name="transportIds">
-            <set>
-                <value>http://cxf.apache.org/bindings/xformat</value>
-                <value>http://schemas.xmlsoap.org/soap/http</value>
-                <value>http://schemas.xmlsoap.org/wsdl/http/</value>
-                <value>http://schemas.xmlsoap.org/wsdl/soap/http</value>
- 	            <value>http://www.w3.org/2003/05/soap/bindings/HTTP/</value>
-                <value>http://cxf.apache.org/transports/http/configuration</value>
-            </set>
-        </property>
-    </bean>
-
-    <osgi:reference id="osgiDestinationRegistry"
-                    interface="org.apache.servicemix.cxf.transport.http_osgi.OsgiDestinationRegistry" />
-
-</beans>
diff --git a/cxf-transport-osgi/src/main/resources/META-INF/spring/cxf-transport-osgi.xml b/cxf-transport-osgi/src/main/resources/META-INF/spring/cxf-transport-osgi.xml
deleted file mode 100644
index f125d12..0000000
--- a/cxf-transport-osgi/src/main/resources/META-INF/spring/cxf-transport-osgi.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?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://www.springframework.org/schema/beans"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xmlns:osgi="http://www.springframework.org/schema/osgi"
-       xsi:schemaLocation="
-http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-http://www.springframework.org/schema/osgi  http://www.springframework.org/schema/osgi/spring-osgi.xsd">
-
-    <bean id="destinationRegistry" class="org.apache.servicemix.cxf.transport.http_osgi.OsgiDestinationRegistry" />
-
-    <bean id="osgiServlet" class="org.apache.servicemix.cxf.transport.http_osgi.SpringOsgiServlet">
-        <constructor-arg ref="destinationRegistry"/>
-    </bean>
-
-    <osgi:service ref="osgiServlet" interface="javax.servlet.Servlet">
-        <osgi:service-properties>
-            <entry key="alias" value="/cxf" />
-        </osgi:service-properties>
-    </osgi:service>
-
-    <osgi:service ref="destinationRegistry" interface="org.apache.servicemix.cxf.transport.http_osgi.OsgiDestinationRegistry">
-    </osgi:service>
-
-</beans>
diff --git a/pom.xml b/pom.xml
index ead9709..9160189 100644
--- a/pom.xml
+++ b/pom.xml
@@ -36,9 +36,6 @@
 
     <modules>
         <module>bundles</module>
-        <module>cxf-transport-nmr</module>
-        <module>cxf-transport-osgi</module>
-        <module>cxf-binding-nmr</module>
         <module>deployer</module>
     </modules>
 
