diff --git a/trunk/assembly/pom.xml b/assembly/pom.xml
similarity index 100%
rename from trunk/assembly/pom.xml
rename to assembly/pom.xml
diff --git a/trunk/assembly/src/main/descriptors/src.xml b/assembly/src/main/descriptors/src.xml
similarity index 100%
rename from trunk/assembly/src/main/descriptors/src.xml
rename to assembly/src/main/descriptors/src.xml
diff --git a/jaxws-api-2.2/src/main/java/javax/xml/ws/spi/FactoryFinder.java b/jaxws-api-2.2/src/main/java/javax/xml/ws/spi/FactoryFinder.java
index 6fb3d99..a6ad195 100644
--- a/jaxws-api-2.2/src/main/java/javax/xml/ws/spi/FactoryFinder.java
+++ b/jaxws-api-2.2/src/main/java/javax/xml/ws/spi/FactoryFinder.java
@@ -171,12 +171,18 @@
                     ClassLoader classLoader = findClassLoader();
                     try {
                         // If we are deployed into an OSGi environment, leverage it
-                        Class factoryClass = FactoryFinder.class.getClassLoader().loadClass(iFactoryId);
+                        Class factoryClass = null;
+                        if (FactoryFinder.class.getClassLoader() != null) {
+                            factoryClass = FactoryFinder.class.getClassLoader().loadClass(iFactoryId);
+                        } else {
+                            factoryClass = Class.forName(iFactoryId);
+                        }
                         Class spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(factoryClass, iFactoryId);
                         if (spiClass != null) {
                             return spiClass.newInstance();
                         }
                      } catch (Throwable e) {
+                        if (debug) e.printStackTrace();
                      }
 
                     try {
diff --git a/pom.xml b/pom.xml
index fac862c..10e9cf4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -36,7 +36,6 @@
     <inceptionYear>2007</inceptionYear>
 
     <modules>
-        <module>src-assembly</module>
         <module>locator</module>
         <module>activator</module>
         <module>saaj-api-1.3</module>
@@ -65,6 +64,7 @@
         <module>java-persistence-api-2.0</module>
         <module>jsr303-api-1.0.0</module>
         <module>jcr-api-2.0</module>
+        <module>assembly</module>
     </modules>
 
     <scm>
@@ -264,32 +264,6 @@
                     </execution>
                 </executions>
             </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-assembly-plugin</artifactId>
-                <version>2.3</version>
-                <dependencies>
-                    <dependency>
-                        <groupId>org.apache.servicemix.bundles</groupId>
-                        <artifactId>src-assembly</artifactId>
-                        <version>1.0-SNAPSHOT</version>
-                    </dependency>
-                </dependencies>
-                <executions>
-                    <execution>
-                        <id>make-src-assembly</id>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>single</goal>
-                        </goals>
-                        <configuration>
-                            <descriptorRefs>
-                                <descriptorRef>src-assembly</descriptorRef>
-                            </descriptorRefs>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
         </plugins>
     </build>
 
@@ -394,38 +368,6 @@
             </build>
         </profile>
         <profile>
-            <id>setup.eclipse</id>
-            <modules>
-                <module>assembly</module>
-            </modules>
-            <properties>
-                <eclipse.workspace.dir>${basedir}/../workspace</eclipse.workspace.dir>
-            </properties>
-            <build>
-                <defaultGoal>eclipse:eclipse</defaultGoal>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-eclipse-plugin</artifactId>
-                        <version>2.5.1</version>
-                        <inherited>false</inherited>
-                        <executions>
-                            <execution>
-                                <id>setup.eclipse.workspace</id>
-                                <phase>process-test-sources</phase>
-                                <goals>
-                                    <goal>add-maven-repo</goal>
-                                </goals>
-                                <configuration>
-                                    <workspace>${eclipse.workspace.dir}</workspace>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
             <id>deploy</id>
             <build>
                 <defaultGoal>deploy</defaultGoal>
diff --git a/saaj-api-1.3/src/main/java/javax/xml/soap/FactoryFinder.java b/saaj-api-1.3/src/main/java/javax/xml/soap/FactoryFinder.java
index ac9e9f5..b028edc 100644
--- a/saaj-api-1.3/src/main/java/javax/xml/soap/FactoryFinder.java
+++ b/saaj-api-1.3/src/main/java/javax/xml/soap/FactoryFinder.java
@@ -81,7 +81,11 @@
      */
     static Object find(Class factory,
                        String defaultFactoryClassName) throws SOAPException {
-        return find(factory.getName(), factory, defaultFactoryClassName);
+        String factoryPropertyName = factory.getName();
+        if ("javax.xml.soap.SAAJMetaFactory".equals(factoryPropertyName)) {
+            factoryPropertyName = "javax.xml.soap.MetaFactory";
+        }
+        return find(factoryPropertyName, factory, defaultFactoryClassName);
     }
     /**
      * Instantiates a factory object given the factory's property name and the default class name.
@@ -106,6 +110,7 @@
     static Object find(String factoryPropertyName,
                        Class factoryClass,
                        String defaultFactoryClassName) throws SOAPException {
+        
         try {
             // If we are deployed into an OSGi environment, leverage it
             if (factoryClass == null) {
diff --git a/src-assembly/pom.xml b/src-assembly/pom.xml
deleted file mode 100644
index d66c19c..0000000
--- a/src-assembly/pom.xml
+++ /dev/null
@@ -1,32 +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/xsd/maven-4.0.0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.servicemix.specs</groupId>
-        <artifactId>specs</artifactId>
-        <version>2.1.0</version>
-    </parent>
-
-    <artifactId>src-assembly</artifactId>
-
-</project>
\ No newline at end of file
diff --git a/src-assembly/src/main/resources/assemblies/src-assembly.xml b/src-assembly/src/main/resources/assemblies/src-assembly.xml
deleted file mode 100644
index 7c754d3..0000000
--- a/src-assembly/src/main/resources/assemblies/src-assembly.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
-          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
-
-    <id>src</id>
-
-    <formats>
-        <format>zip</format>
-        <format>tar.gz</format>
-    </formats>
-
-    <fileSets>
-        <fileSet>
-            <includes>
-                <include>pom.xml</include>
-                <include>src/**/*</include>
-            </includes>
-            <useDefaultExcludes>true</useDefaultExcludes>
-        </fileSet>
-    </fileSets>
-
-    <files>
-        <file>
-            <source>target/maven-shared-archive-resources/META-INF/LICENSE</source>
-            <outputDirectory>.</outputDirectory>
-        </file>
-        <file>
-            <source>target/maven-shared-archive-resources/META-INF/NOTICE</source>
-            <outputDirectory>.</outputDirectory>
-        </file>
-    </files>
-
-</assembly>
\ No newline at end of file
diff --git a/trunk/.gitignore b/trunk/.gitignore
deleted file mode 100644
index e45abe8..0000000
--- a/trunk/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-target
-*.i??
\ No newline at end of file
diff --git a/trunk/LICENSE.txt b/trunk/LICENSE.txt
deleted file mode 100644
index 6b0b127..0000000
--- a/trunk/LICENSE.txt
+++ /dev/null
@@ -1,203 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
diff --git a/trunk/NOTICE.txt b/trunk/NOTICE.txt
deleted file mode 100644
index 15b77cc..0000000
--- a/trunk/NOTICE.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-   =========================================================================
-   ==  NOTICE file for use with the Apache License, Version 2.0,          ==
-   ==  in this case for the Apache ServiceMix distribution.               ==
-   =========================================================================
-
-   This product contains software developed by
-   The Apache Software Foundation (http://www.apache.org/).
-
-
diff --git a/trunk/activation-api-1.1/pom.xml b/trunk/activation-api-1.1/pom.xml
deleted file mode 100644
index 1f678f5..0000000
--- a/trunk/activation-api-1.1/pom.xml
+++ /dev/null
@@ -1,197 +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.specs</groupId>
-        <artifactId>specs</artifactId>
-        <version>2.1.0</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.specs</groupId>
-    <artifactId>org.apache.servicemix.specs.activation-api-1.1</artifactId>
-    <packaging>bundle</packaging>
-    <version>2.1.0</version>
-    <name>Apache ServiceMix :: Specs :: Activation API 1.4</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-activation_1.1_spec</artifactId>
-            <version>1.0.2</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <version>1.2.0</version>
-            <scope>provided</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-              <groupId>org.apache.maven.plugins</groupId>
-              <artifactId>maven-compiler-plugin</artifactId>
-              <inherited>true</inherited>
-              <configuration>
-                <compilerArgument>-Xbootclasspath/p:${settings.localRepository}/org/apache/geronimo/specs/geronimo-activation_1.1_spec/1.0.2/geronimo-activation_1.1_spec-1.0.2.jar</compilerArgument>
-              </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Description>${project.description}</Bundle-Description>
-                        <Export-Package>javax.activation*;version=1.1;-split-package:=merge-first;-noimport:=true</Export-Package>
-                        <Import-Package>
-                            *,
-                            !org.apache.servicemix.specs.activation
-                        </Import-Package>
-                        <Private-Package>
-                            org.apache.servicemix.specs.locator;-split-package:=merge-first,
-                            org.apache.servicemix.specs.activation;-split-package:=merge-first
-                        </Private-Package>
-                        <Bundle-Activator>org.apache.servicemix.specs.activation.Activator</Bundle-Activator>
-                        <Implementation-Title>Apache ServiceMix</Implementation-Title>
-                        <Implementation-Version>${project.version}</Implementation-Version>
-                    </instructions>
-                    <unpackBundle>true</unpackBundle>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <artifactSet>
-                                <includes>
-                                    <include>org.apache.geronimo.specs:geronimo-activation_1.1_spec</include>
-                                    <include>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</include>
-                                    <include>${project.groupId}:${project.artifactId}</include>
-                                </includes>
-                            </artifactSet>
-                            <filters>
-                                <filter>
-                                    <artifact>org.apache.geronimo.specs:geronimo-activation_1.1_spec</artifact>
-                                    <excludes>
-                                        <exclude>javax/**</exclude>
-                                    </excludes>
-                                </filter>
-                                <filter>
-                                    <artifact>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</artifact>
-                                    <excludes>
-                                        <exclude>org/**</exclude>
-                                    </excludes>
-                                </filter>
-                            </filters>
-                            <createSourcesJar>${createSourcesJar}</createSourcesJar>
-                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-                            <createDependencyReducedPom>true</createDependencyReducedPom>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>deploy</id>
-            <properties>
-                <createSourcesJar>true</createSourcesJar>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-source-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>attach-sources</id>
-                                <phase>process-classes</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-dependency-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>unpack-sources</id>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>unpack</goal>
-                                </goals>
-                                <configuration>
-                                    <artifactItems>
-                                        <artifactItem>
-                                            <groupId>org.apache.servicemix.specs</groupId>
-                                            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                    </artifactItems>
-                                    <outputDirectory>${project.build.directory}/sources</outputDirectory>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>package</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <minmemory>128m</minmemory>
-                            <maxmemory>512m</maxmemory>
-                            <sourcepath>${project.build.directory}/sources</sourcepath>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
diff --git a/trunk/activation-api-1.1/src/main/java/javax/activation/DataHandler.java b/trunk/activation-api-1.1/src/main/java/javax/activation/DataHandler.java
deleted file mode 100644
index 817ef02..0000000
--- a/trunk/activation-api-1.1/src/main/java/javax/activation/DataHandler.java
+++ /dev/null
@@ -1,305 +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 javax.activation;
-
-import java.awt.datatransfer.DataFlavor;
-import java.awt.datatransfer.Transferable;
-import java.awt.datatransfer.UnsupportedFlavorException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PipedInputStream;
-import java.io.PipedOutputStream;
-import java.net.URL;
-
-public class DataHandler implements Transferable {
-    private final DataSource ds;
-    private final DataFlavor flavor;
-
-    private CommandMap commandMap;
-    private DataContentHandler dch;
-
-    public DataHandler(DataSource ds) {
-        this.ds = ds;
-        this.flavor = new ActivationDataFlavor(ds.getContentType(), null);
-    }
-
-    public DataHandler(Object data, String type) {
-        this.ds = new ObjectDataSource(data, type);
-        this.flavor = new ActivationDataFlavor(data.getClass(), null);
-    }
-
-    public DataHandler(URL url) {
-        this.ds = new URLDataSource(url);
-        this.flavor = new ActivationDataFlavor(ds.getContentType(), null);
-    }
-
-    public DataSource getDataSource() {
-        return ds;
-    }
-
-    public String getName() {
-        return ds.getName();
-    }
-
-    public String getContentType() {
-        return ds.getContentType();
-    }
-
-    public InputStream getInputStream() throws IOException {
-        return ds.getInputStream();
-    }
-
-    public void writeTo(OutputStream os) throws IOException {
-        if (ds instanceof ObjectDataSource) {
-            ObjectDataSource ods = (ObjectDataSource) ds;
-            DataContentHandler dch = getDataContentHandler();
-            if (dch == null) {
-                throw new UnsupportedDataTypeException(ods.mimeType);
-            }
-            dch.writeTo(ods.data, ods.mimeType, os);
-        } else {
-            byte[] buffer = new byte[1024];
-            InputStream is = getInputStream();
-            try {
-                int count;
-                while ((count = is.read(buffer)) != -1) {
-                    os.write(buffer, 0, count);
-                }
-            } finally {
-                is.close();
-            }
-        }
-    }
-
-    public OutputStream getOutputStream() throws IOException {
-        return ds.getOutputStream();
-    }
-
-    public synchronized DataFlavor[] getTransferDataFlavors() {
-        return getDataContentHandler().getTransferDataFlavors();
-    }
-
-    public boolean isDataFlavorSupported(DataFlavor flavor) {
-        DataFlavor[] flavors = getTransferDataFlavors();
-        for (int i = 0; i < flavors.length; i++) {
-            DataFlavor dataFlavor = flavors[i];
-            if (dataFlavor.equals(flavor)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
-        DataContentHandler dch = getDataContentHandler();
-        if (dch != null) {
-            return dch.getTransferData(flavor, ds);
-        } else if (this.flavor.match(flavor)) {
-            if (ds instanceof ObjectDataSource) {
-                return ((ObjectDataSource) ds).data;
-            } else {
-                return ds.getInputStream();
-            }
-        } else {
-            throw new UnsupportedFlavorException(flavor);
-        }
-    }
-
-    public CommandInfo[] getPreferredCommands() {
-        return getCommandMap().getPreferredCommands(ds.getContentType());
-    }
-
-    public CommandInfo[] getAllCommands() {
-        return getCommandMap().getAllCommands(ds.getContentType());
-    }
-
-    public CommandInfo getCommand(String cmdName) {
-        return getCommandMap().getCommand(ds.getContentType(), cmdName);
-    }
-
-    public Object getContent() throws IOException {
-        if (ds instanceof ObjectDataSource) {
-            return ((ObjectDataSource) ds).data;
-        } else {
-            DataContentHandler dch = getDataContentHandler();
-            if (dch != null) {
-                return dch.getContent(ds);
-            } else {
-                return ds.getInputStream();
-            }
-        }
-    }
-
-    public Object getBean(CommandInfo cmdinfo) {
-        try {
-            return cmdinfo.getCommandObject(this, this.getClass().getClassLoader());
-        } catch (IOException e) {
-            return null;
-        } catch (ClassNotFoundException e) {
-            return null;
-        }
-    }
-
-    /**
-     * A local implementation of DataSouce used to wrap an Object and mime-type.
-     */
-    private class ObjectDataSource implements DataSource {
-        private final Object data;
-        private final String mimeType;
-
-        public ObjectDataSource(Object data, String mimeType) {
-            this.data = data;
-            this.mimeType = mimeType;
-        }
-
-        public String getName() {
-            return null;
-        }
-
-        public String getContentType() {
-            return mimeType;
-        }
-
-        public InputStream getInputStream() throws IOException {
-            final DataContentHandler dch = getDataContentHandler();
-            if (dch == null) {
-                throw new UnsupportedDataTypeException(mimeType);
-            }
-            final PipedInputStream is = new PipedInputStream();
-            final PipedOutputStream os = new PipedOutputStream(is);
-            Thread thread = new Thread("DataHandler Pipe Pump") {
-                public void run() {
-                    try {
-                        try {
-                            dch.writeTo(data, mimeType, os);
-                        } finally {
-                            os.close();
-                        }
-                    } catch (IOException e) {
-                        // ignore, per spec - doh!
-                    }
-                }
-            };
-            thread.start();
-            return is;
-        }
-
-        public OutputStream getOutputStream() throws IOException {
-            return null;
-        }
-    }
-
-    public synchronized void setCommandMap(CommandMap commandMap) {
-        this.commandMap = commandMap;
-        this.dch = null;
-    }
-
-    private synchronized CommandMap getCommandMap() {
-        return commandMap != null ? commandMap : CommandMap.getDefaultCommandMap();
-    }
-
-    /**
-     * Search for a DataContentHandler for our mime type.
-     * The search is performed by first checking if a global factory has been set using
-     * {@link #setDataContentHandlerFactory(DataContentHandlerFactory)};
-     * if found then it is called to attempt to create a handler.
-     * If this attempt fails, we then call the command map set using {@link #setCommandMap(CommandMap)}
-     * (or if that has not been set, the default map returned by {@link CommandMap#getDefaultCommandMap()})
-     * to create the handler.
-     *
-     * The resulting handler is cached until the global factory is changed.
-     *
-     * @return
-     */
-    private synchronized DataContentHandler getDataContentHandler() {
-        DataContentHandlerFactory localFactory;
-        synchronized (DataHandler.class) {
-            if (factory != originalFactory) {
-                // setDCHF was called - clear our cached copy of the DCH and DCHF
-                dch = null;
-                originalFactory = factory;
-            }
-            localFactory = originalFactory;
-        }
-        if (dch == null) {
-            // get the main mime-type portion of the content.
-            String mimeType = getMimeType(ds.getContentType());
-            if (localFactory != null) {
-                dch = localFactory.createDataContentHandler(mimeType);
-            }
-            if (dch == null) {
-                dch = CommandMap.getDefaultCommandMap().createDataContentHandler(mimeType);
-            }
-        }
-        return dch;
-    }
-
-    /**
-     * Retrieve the base MIME type from a content type.  This parses
-     * the type into its base components, stripping off any parameter
-     * information.
-     *
-     * @param contentType
-     *               The content type string.
-     *
-     * @return The MIME type identifier portion of the content type.
-     */
-    private String getMimeType(String contentType) {
-        try {
-            MimeType mimeType = new MimeType(contentType);
-            return mimeType.getBaseType();
-        } catch (MimeTypeParseException e) {
-        }
-        return contentType;
-    }
-
-    /**
-     * This is used to check if the DataContentHandlerFactory has been changed.
-     * This is not specified behaviour but this check is required to make this work like the RI.
-     */
-    private DataContentHandlerFactory originalFactory;
-
-    {
-        synchronized (DataHandler.class) {
-            originalFactory = factory;
-        }
-    }
-
-    private static DataContentHandlerFactory factory;
-
-    /**
-     * Set the DataContentHandlerFactory to use.
-     * If this method has already been called then an Error is raised.
-     *
-     * @param newFactory the new factory
-     * @throws SecurityException if the caller does not have "SetFactory" RuntimePermission
-     */
-    public static synchronized void setDataContentHandlerFactory(DataContentHandlerFactory newFactory) {
-        if (factory != null) {
-            throw new Error("javax.activation.DataHandler.setDataContentHandlerFactory has already been defined");
-        }
-        SecurityManager sm = System.getSecurityManager();
-        if (sm != null) {
-            sm.checkSetFactory();
-        }
-        factory = newFactory;
-    }
-}
diff --git a/trunk/activation-api-1.1/src/main/java/javax/activation/MailcapCommandMap.java b/trunk/activation-api-1.1/src/main/java/javax/activation/MailcapCommandMap.java
deleted file mode 100644
index ef6fd50..0000000
--- a/trunk/activation-api-1.1/src/main/java/javax/activation/MailcapCommandMap.java
+++ /dev/null
@@ -1,506 +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 javax.activation;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.net.URL;
-import java.security.Security;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @version $Rev$ $Date$
- */
-public class MailcapCommandMap extends CommandMap {
-    private final Map mimeTypes = new HashMap();
-    private final Map preferredCommands = new HashMap();
-    private final Map allCommands = new HashMap();
-    // the unparsed commands from the mailcap file.
-    private final Map nativeCommands = new HashMap();
-    // commands identified as fallbacks...these are used last, and also used as wildcards.
-    private final Map fallbackCommands = new HashMap();
-    private URL url;
-
-    public MailcapCommandMap() {
-        ClassLoader contextLoader = Thread.currentThread().getContextClassLoader();
-        // process /META-INF/mailcap.default
-        try {
-            InputStream is = MailcapCommandMap.class.getResourceAsStream("/META-INF/mailcap.default");
-            if (is != null) {
-                try {
-                    parseMailcap(is);
-                } finally {
-                    is.close();
-                }
-            }
-        } catch (IOException e) {
-            // ignore
-        }
-
-        // process /META-INF/mailcap resources
-        try {
-            Enumeration e = contextLoader.getResources("META-INF/mailcap");
-            while (e.hasMoreElements()) {
-                url = ((URL) e.nextElement());
-                try {
-                    InputStream is = url.openStream();
-                    try {
-                        parseMailcap(is);
-                    } finally {
-                        is.close();
-                    }
-                } catch (IOException e1) {
-                    continue;
-                }
-            }
-        } catch (SecurityException e) {
-            // ignore
-        } catch (IOException e) {
-            // ignore
-        }
-
-        // process ${java.home}/lib/mailcap
-        try {
-            File file = new File(System.getProperty("java.home"), "lib/mailcap");
-            InputStream is = new FileInputStream(file);
-            try {
-                parseMailcap(is);
-            } finally {
-                is.close();
-            }
-        } catch (SecurityException e) {
-            // ignore
-        } catch (IOException e) {
-            // ignore
-        }
-
-        // process ${user.home}/lib/mailcap
-        try {
-            File file = new File(System.getProperty("user.home"), ".mailcap");
-            InputStream is = new FileInputStream(file);
-            try {
-                parseMailcap(is);
-            } finally {
-                is.close();
-            }
-        } catch (SecurityException e) {
-            // ignore
-        } catch (IOException e) {
-            // ignore
-        }
-    }
-
-    public MailcapCommandMap(String fileName) throws IOException {
-        this();
-        FileReader reader = new FileReader(fileName);
-        try {
-            parseMailcap(reader);
-        } finally {
-            reader.close();
-        }
-    }
-
-    public MailcapCommandMap(InputStream is) {
-        this();
-        parseMailcap(is);
-    }
-
-    private void parseMailcap(InputStream is) {
-        try {
-            parseMailcap(new InputStreamReader(is));
-        } catch (IOException e) {
-            // spec API means all we can do is swallow this
-        }
-    }
-
-    void parseMailcap(Reader reader) throws IOException {
-        BufferedReader br = new BufferedReader(reader);
-        String line;
-        while ((line = br.readLine()) != null) {
-            addMailcap(line);
-        }
-    }
-
-    public synchronized void addMailcap(String mail_cap) {
-        int index = 0;
-        // skip leading whitespace
-        index = skipSpace(mail_cap, index);
-        if (index == mail_cap.length() || mail_cap.charAt(index) == '#') {
-            return;
-        }
-
-        // get primary type
-        int start = index;
-        index = getToken(mail_cap, index);
-        if (start == index) {
-            return;
-        }
-        String mimeType = mail_cap.substring(start, index);
-
-        // skip any spaces after the primary type
-        index = skipSpace(mail_cap, index);
-        if (index == mail_cap.length() || mail_cap.charAt(index) == '#') {
-            return;
-        }
-
-        // get sub-type
-        if (mail_cap.charAt(index) == '/') {
-            index = skipSpace(mail_cap, ++index);
-            start = index;
-            index = getToken(mail_cap, index);
-            mimeType = mimeType + '/' + mail_cap.substring(start, index);
-        } else {
-
-            mimeType = mimeType + "/*";
-        }
-
-        // we record all mappings using the lowercase version.
-        mimeType = mimeType.toLowerCase();
-
-        // skip spaces after mime type
-        index = skipSpace(mail_cap, index);
-
-        // expect a ';' to terminate field 1
-        if (index == mail_cap.length() || mail_cap.charAt(index) != ';') {
-            return;
-        }
-        // ok, we've parsed the mime text field, now parse the view field.  If there's something
-        // there, then we add this to the native text.
-        index = skipSpace(mail_cap, index + 1);
-        // if the next encountered text is not a ";", then we have a view.  This gets added to the
-        // native list.
-        if (index == mail_cap.length() || mail_cap.charAt(index) != ';') {
-            ArrayList nativeCommandList = (ArrayList)nativeCommands.get(mimeType);
-
-            // if this is the first for this mimetype, create a holder
-            if (nativeCommandList == null) {
-                nativeCommandList = new ArrayList();
-                nativeCommands.put(mimeType, nativeCommandList);
-            }
-
-            // now add this as an entry in the list.
-            nativeCommandList.add(mail_cap);
-            // now skip forward to the next field marker, if any
-            index = getMText(mail_cap, index);
-        }
-
-        // we don't know which list this will be added to until we finish parsing, as there
-        // can be an x-java-fallback-entry parameter that moves this to the fallback list.
-        List commandList = new ArrayList();
-        // but by default, this is not a fallback.
-        boolean fallback = false;
-
-        int fieldNumber = 0;
-
-        // parse fields
-        while (index < mail_cap.length() && mail_cap.charAt(index) == ';') {
-            index = skipSpace(mail_cap, index + 1);
-            start = index;
-            index = getToken(mail_cap, index);
-            String fieldName = mail_cap.substring(start, index).toLowerCase();
-            index = skipSpace(mail_cap, index);
-            if (index < mail_cap.length() && mail_cap.charAt(index) == '=') {
-                index = skipSpace(mail_cap, index + 1);
-                start = index;
-                index = getMText(mail_cap, index);
-                String value = mail_cap.substring(start, index);
-                index = skipSpace(mail_cap, index);
-                if (fieldName.startsWith("x-java-") && fieldName.length() > 7) {
-                    String command = fieldName.substring(7);
-                    value = value.trim();
-                    if (command.equals("fallback-entry")) {
-                        if (value.equals("true")) {
-                            fallback = true;
-                        }
-                    }
-                    else {
-                        // create a CommandInfo item and add it the accumulator
-                        CommandInfo info = new CommandInfo(command, value);
-                        commandList.add(info);
-                    }
-                }
-            }
-        }
-        addCommands(mimeType, commandList, fallback);
-    }
-
-    /**
-     * Add a parsed list of commands to the appropriate command list.
-     *
-     * @param mimeType The mimeType name this is added under.
-     * @param commands A List containing the command information.
-     * @param fallback The target list identifier.
-     */
-    protected void addCommands(String mimeType, List commands, boolean fallback) {
-        // add this to the mimeType set
-        mimeTypes.put(mimeType, mimeType);
-        // the target list changes based on the type of entry.
-        Map target = fallback ? fallbackCommands : preferredCommands;
-
-        // now process
-        for (Iterator i = commands.iterator(); i.hasNext();) {
-            CommandInfo info = (CommandInfo)i.next();
-            addCommand(target, mimeType, info);
-            // if this is not a fallback position, then this to the allcommands list.
-            if (!fallback) {
-                List cmdList = (List) allCommands.get(mimeType);
-                if (cmdList == null) {
-                    cmdList = new ArrayList();
-                    allCommands.put(mimeType, cmdList);
-                }
-                cmdList.add(info);
-            }
-        }
-    }
-
-
-    /**
-     * Add a command to a target command list (preferred or fallback).
-     *
-     * @param commandList
-     *                 The target command list.
-     * @param mimeType The MIME type the command is associated with.
-     * @param command  The command information.
-     */
-    protected void addCommand(Map commandList, String mimeType, CommandInfo command) {
-
-        Map commands = (Map) commandList.get(mimeType);
-        if (commands == null) {
-            commands = new HashMap();
-            commandList.put(mimeType, commands);
-        }
-        commands.put(command.getCommandName(), command);
-    }
-
-
-    private int skipSpace(String s, int index) {
-        while (index < s.length() && Character.isWhitespace(s.charAt(index))) {
-            index++;
-        }
-        return index;
-    }
-
-    private int getToken(String s, int index) {
-        while (index < s.length() && s.charAt(index) != '#' && !MimeType.isSpecial(s.charAt(index))) {
-            index++;
-        }
-        return index;
-    }
-
-    private int getMText(String s, int index) {
-        while (index < s.length()) {
-            char c = s.charAt(index);
-            if (c == '#' || c == ';' || Character.isISOControl(c)) {
-                return index;
-            }
-            if (c == '\\') {
-                index++;
-                if (index == s.length()) {
-                    return index;
-                }
-            }
-            index++;
-        }
-        return index;
-    }
-
-    public synchronized CommandInfo[] getPreferredCommands(String mimeType) {
-        // get the mimetype as a lowercase version.
-        mimeType = mimeType.toLowerCase();
-
-        Map commands = (Map) preferredCommands.get(mimeType);
-        if (commands == null) {
-            commands = (Map) preferredCommands.get(getWildcardMimeType(mimeType));
-        }
-
-        Map fallbackCommands = getFallbackCommands(mimeType);
-
-        // if we have fall backs, then we need to merge this stuff.
-        if (fallbackCommands != null) {
-            // if there's no command list, we can just use this as the master list.
-            if (commands == null) {
-                commands = fallbackCommands;
-            }
-            else {
-                // merge the two lists.  The ones in the commands list will take precedence.
-                commands = mergeCommandMaps(commands, fallbackCommands);
-            }
-        }
-
-        // now convert this into an array result.
-        if (commands == null) {
-            return new CommandInfo[0];
-        }
-        return (CommandInfo[]) commands.values().toArray(new CommandInfo[commands.size()]);
-    }
-
-    private Map getFallbackCommands(String mimeType) {
-        Map commands = (Map) fallbackCommands.get(mimeType);
-
-        // now we also need to search this as if it was a wildcard.  If we get a wildcard hit,
-        // we have to merge the two lists.
-        Map wildcardCommands = (Map)fallbackCommands.get(getWildcardMimeType(mimeType));
-        // no wildcard version
-        if (wildcardCommands == null) {
-            return commands;
-        }
-        // we need to merge these.
-        return mergeCommandMaps(commands, wildcardCommands);
-    }
-
-
-    private Map mergeCommandMaps(Map main, Map fallback) {
-        // create a cloned copy of the second map.  We're going to use a PutAll operation to
-        // overwrite any duplicates.
-        Map result = new HashMap(fallback);
-        result.putAll(main);
-
-        return result;
-    }
-
-    public synchronized CommandInfo[] getAllCommands(String mimeType) {
-        mimeType = mimeType.toLowerCase();
-        List exactCommands = (List) allCommands.get(mimeType);
-        if (exactCommands == null) {
-            exactCommands = Collections.EMPTY_LIST;
-        }
-        List wildCommands = (List) allCommands.get(getWildcardMimeType(mimeType));
-        if (wildCommands == null) {
-            wildCommands = Collections.EMPTY_LIST;
-        }
-
-        Map fallbackCommands = getFallbackCommands(mimeType);
-        if (fallbackCommands == null) {
-            fallbackCommands = Collections.EMPTY_MAP;
-        }
-
-
-        CommandInfo[] result = new CommandInfo[exactCommands.size() + wildCommands.size() + fallbackCommands.size()];
-        int j = 0;
-        for (int i = 0; i < exactCommands.size(); i++) {
-            result[j++] = (CommandInfo) exactCommands.get(i);
-        }
-        for (int i = 0; i < wildCommands.size(); i++) {
-            result[j++] = (CommandInfo) wildCommands.get(i);
-        }
-
-        for (Iterator i = fallbackCommands.keySet().iterator(); i.hasNext();) {
-            result[j++] = (CommandInfo) fallbackCommands.get((String)i.next());
-        }
-        return result;
-    }
-
-    public synchronized CommandInfo getCommand(String mimeType, String cmdName) {
-        mimeType = mimeType.toLowerCase();
-        // strip any parameters from the supplied mimeType
-        int i = mimeType.indexOf(';');
-        if (i != -1) {
-            mimeType = mimeType.substring(0, i).trim();
-        }
-
-        // search for an exact match
-        Map commands = (Map) preferredCommands.get(mimeType);
-        if (commands == null) {
-            // then a wild card match
-            commands = (Map) preferredCommands.get(getWildcardMimeType(mimeType));
-            if (commands == null) {
-                // then fallback searches, both standard and wild card.
-                commands = (Map) fallbackCommands.get(mimeType);
-                if (commands == null) {
-                    commands = (Map) fallbackCommands.get(getWildcardMimeType(mimeType));
-                }
-                if (commands == null) {
-                    return null;
-                }
-            }
-        }
-        return (CommandInfo) commands.get(cmdName.toLowerCase());
-    }
-
-    private String getWildcardMimeType(String mimeType) {
-        int i = mimeType.indexOf('/');
-        if (i == -1) {
-            return mimeType + "/*";
-        } else {
-            return mimeType.substring(0, i + 1) + "*";
-        }
-    }
-
-    public synchronized DataContentHandler createDataContentHandler(String mimeType) {
-
-        CommandInfo info = getCommand(mimeType, "content-handler");
-        if (info == null) {
-            return null;
-        }
-
-        ClassLoader cl = Thread.currentThread().getContextClassLoader();
-        if (cl == null) {
-            cl = getClass().getClassLoader();
-        }
-        try {
-            return (DataContentHandler) cl.loadClass(info.getCommandClass()).newInstance();
-        } catch (ClassNotFoundException e) {
-            return null;
-        } catch (IllegalAccessException e) {
-            return null;
-        } catch (InstantiationException e) {
-            return null;
-        }
-    }
-
-    /**
-     * Get all MIME types known to this command map.
-     *
-     * @return A String array of the MIME type names.
-     */
-    public synchronized String[] getMimeTypes() {
-        ArrayList types = new ArrayList(mimeTypes.values());
-        return (String[])types.toArray(new String[types.size()]);
-    }
-
-    /**
-     * Return the list of raw command strings parsed
-     * from the mailcap files for a given mimeType.
-     *
-     * @param mimeType The target mime type
-     *
-     * @return A String array of the raw command strings.  Returns
-     *         an empty array if the mimetype is not currently known.
-     */
-    public synchronized String[] getNativeCommands(String mimeType) {
-        ArrayList commands = (ArrayList)nativeCommands.get(mimeType.toLowerCase());
-        if (commands == null) {
-            return new String[0];
-        }
-        return (String[])commands.toArray(new String[commands.size()]);
-    }
-}
diff --git a/trunk/activation-api-1.1/src/main/java/org/apache/servicemix/specs/activation/Activator.java b/trunk/activation-api-1.1/src/main/java/org/apache/servicemix/specs/activation/Activator.java
deleted file mode 100644
index ffde31a..0000000
--- a/trunk/activation-api-1.1/src/main/java/org/apache/servicemix/specs/activation/Activator.java
+++ /dev/null
@@ -1,116 +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.specs.activation;
-
-import java.io.BufferedReader;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import javax.activation.CommandMap;
-import javax.activation.DataContentHandler;
-
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-
-/**
- * A bundle activator for activation framework
- */
-public class Activator extends org.apache.servicemix.specs.locator.Activator {
-
-    private Map<Long, MailCap> mailcaps = new ConcurrentHashMap<Long, MailCap>();
-
-    @Override
-    public void start(BundleContext bundleContext) throws Exception {
-        super.start(bundleContext);
-    }
-
-    @Override
-    public void stop(BundleContext bundleContext) throws Exception {
-        super.stop(bundleContext);
-        CommandMap.setDefaultCommandMap(null);
-    }
-
-    @Override
-    protected void register(Bundle bundle) {
-        debugPrintln("checking bundle " + bundle.getBundleId());
-        URL url = bundle.getResource("/META-INF/mailcap");
-        if (url != null) {
-            debugPrintln("found mailcap at " + url);
-
-            try {
-                final Class<?> clazz = bundle
-                        .loadClass("javax.activation.DataContentHandler");
-                if (!clazz.isAssignableFrom(DataContentHandler.class)) {
-                    debugPrintln("incompatible DataContentHandler class in bundle "
-                            + bundle.getBundleId());
-                    return;
-                }
-            } catch (ClassNotFoundException e) {
-                // ignored
-            }
-
-            mailcaps.put(bundle.getBundleId(), new MailCap(bundle, url));
-            rebuildCommandMap();
-        }
-    }
-
-    @Override
-    protected void unregister(long bundleId) {
-        MailCap mailcap = mailcaps.remove(bundleId);
-        if (mailcap != null ){
-            debugPrintln("removing mailcap at " + mailcap.url);
-            rebuildCommandMap();
-        }
-    }
-
-    private void rebuildCommandMap() {
-        OsgiMailcapCommandMap commandMap = new OsgiMailcapCommandMap();
-        for (MailCap mailcap : mailcaps.values()) {
-            try {
-                InputStream is = mailcap.url.openStream();
-                try {
-                    BufferedReader br = new BufferedReader(new InputStreamReader(is));
-                    String line;
-                    while ((line = br.readLine()) != null) {
-                        commandMap.addMailcap(line, mailcap.bundle);
-                    }
-                } finally {
-                    is.close();
-                }
-            } catch (Exception e) {
-                // Ignore
-            }
-        }
-        CommandMap.setDefaultCommandMap(commandMap);
-    }
-
-    private static class MailCap {
-        Bundle bundle;
-        URL url;
-
-        private MailCap(Bundle bundle, URL url) {
-            this.bundle = bundle;
-            this.url = url;
-        }
-    }
-
-}
diff --git a/trunk/activation-api-1.1/src/main/java/org/apache/servicemix/specs/activation/OsgiMailcapCommandMap.java b/trunk/activation-api-1.1/src/main/java/org/apache/servicemix/specs/activation/OsgiMailcapCommandMap.java
deleted file mode 100644
index a914247..0000000
--- a/trunk/activation-api-1.1/src/main/java/org/apache/servicemix/specs/activation/OsgiMailcapCommandMap.java
+++ /dev/null
@@ -1,84 +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.specs.activation;
-
-import java.util.Map;
-import java.util.HashMap;
-
-import javax.activation.MailcapCommandMap;
-import javax.activation.CommandInfo;
-import javax.activation.DataContentHandler;
-
-import org.osgi.framework.Bundle;
-
-/**
- * An OSGi enabled MailcapCommandMap
- */
-public class OsgiMailcapCommandMap extends MailcapCommandMap {
-
-    private Bundle currentBundle;
-    private Map<CommandInfo, Bundle> bundles = new HashMap<CommandInfo, Bundle>();
-
-    public void addMailcap(String line, Bundle bundle) {
-        currentBundle = bundle;
-        addMailcap(line);
-    }
-
-    protected void addCommand(Map commandList, String mimeType, CommandInfo command) {
-        super.addCommand(commandList, mimeType, command);
-        if (currentBundle != null) {
-            bundles.put(command, currentBundle);
-        }
-    }
-
-    @Override
-    public DataContentHandler createDataContentHandler(String mimeType) {
-        CommandInfo info = getCommand(mimeType, "content-handler");
-        if (info == null) {
-            return null;
-        }
-
-        Bundle bundle = bundles.get(info);
-        if (bundle != null) {
-            try {
-                return (DataContentHandler) bundle.loadClass(info.getCommandClass()).newInstance();
-            } catch (ClassNotFoundException e) {
-                return null;
-            } catch (IllegalAccessException e) {
-                return null;
-            } catch (InstantiationException e) {
-                return null;
-            }
-        }
-
-        ClassLoader cl = Thread.currentThread().getContextClassLoader();
-        if (cl == null) {
-            cl = getClass().getClassLoader();
-        }
-        try {
-            return (DataContentHandler) cl.loadClass(info.getCommandClass()).newInstance();
-        } catch (ClassNotFoundException e) {
-            return null;
-        } catch (IllegalAccessException e) {
-            return null;
-        } catch (InstantiationException e) {
-            return null;
-        }
-    }
-}
diff --git a/trunk/activator/pom.xml b/trunk/activator/pom.xml
deleted file mode 100644
index 77695ce..0000000
--- a/trunk/activator/pom.xml
+++ /dev/null
@@ -1,109 +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.specs</groupId>
-        <artifactId>specs</artifactId>
-        <version>2.1.0</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.specs</groupId>
-    <artifactId>org.apache.servicemix.specs.activator</artifactId>
-    <packaging>jar</packaging>
-    <version>2.1.0</version>
-    <name>Apache ServiceMix :: Specs :: Activator</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <version>4.8</version>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jar-plugin</artifactId>
-                <configuration>
-                    <archive>
-                        <manifestEntries>
-                            <Karaf-Activator>org.apache.servicemix.specs.activator.Activator</Karaf-Activator>
-                        </manifestEntries>
-                    </archive>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>deploy</id>
-            <properties>
-                <createSourcesJar>true</createSourcesJar>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-source-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>attach-sources</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>package</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <minmemory>128m</minmemory>
-                            <maxmemory>512m</maxmemory>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
diff --git a/trunk/activator/src/main/java/org/apache/servicemix/specs/activator/Activator.java b/trunk/activator/src/main/java/org/apache/servicemix/specs/activator/Activator.java
deleted file mode 100644
index 26e0016..0000000
--- a/trunk/activator/src/main/java/org/apache/servicemix/specs/activator/Activator.java
+++ /dev/null
@@ -1,189 +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.specs.activator;
-
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-import org.apache.servicemix.specs.locator.OsgiLocator;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleEvent;
-import org.osgi.framework.SynchronousBundleListener;
-
-public class Activator implements BundleActivator, SynchronousBundleListener {
-
-    private static boolean debug = false;
-
-    private ConcurrentMap<Long, Map<String, Callable<Class>>> factories = new ConcurrentHashMap<Long, Map<String, Callable<Class>>>();
-
-    private BundleContext bundleContext;
-
-    static {
-        try {
-            String prop = System.getProperty("org.apache.servicemix.specs.debug");
-            debug = prop != null && !"false".equals(prop);
-        } catch (Throwable t) { }
-    }
-
-    /**
-     * <p>Output debugging messages.</p>
-     *
-     * @param msg <code>String</code> to print to <code>stderr</code>.
-     */
-    protected void debugPrintln(String msg) {
-        if (debug) {
-            System.err.println("Spec(" + bundleContext.getBundle().getBundleId() + "): " + msg);
-        }
-    }
-
-    public synchronized void start(BundleContext bundleContext) throws Exception {
-        this.bundleContext = bundleContext;
-        debugPrintln("activating");
-        debugPrintln("adding bundle listener");
-        bundleContext.addBundleListener(this);
-        debugPrintln("checking existing bundles");
-        for (Bundle bundle : bundleContext.getBundles()) {
-            if (bundle.getState() == Bundle.RESOLVED || bundle.getState() == Bundle.STARTING ||
-                    bundle.getState() == Bundle.ACTIVE || bundle.getState() == Bundle.STOPPING) {
-                register(bundle);
-            }
-        }
-        debugPrintln("activated");
-    }
-
-    public synchronized void stop(BundleContext bundleContext) throws Exception {
-        debugPrintln("deactivating");
-        bundleContext.removeBundleListener(this);
-        while (!factories.isEmpty()) {
-            unregister(factories.keySet().iterator().next());
-        }
-        debugPrintln("deactivated");
-        this.bundleContext = null;
-    }
-
-    public void bundleChanged(BundleEvent event) {
-        if (event.getType() == BundleEvent.RESOLVED) {
-            register(event.getBundle());
-        } else if (event.getType() == BundleEvent.UNRESOLVED || event.getType() == BundleEvent.UNINSTALLED) {
-            unregister(event.getBundle().getBundleId());
-        }
-    }
-
-    protected void register(final Bundle bundle) {
-        debugPrintln("checking bundle " + bundle.getBundleId());
-        Map<String, Callable<Class>> map = factories.get(bundle.getBundleId());
-        Enumeration e = bundle.findEntries("META-INF/services/", "*", false);
-        if (e != null) {
-            while (e.hasMoreElements()) {
-                final URL u = (URL) e.nextElement();
-                final String url = u.toString();
-                if (url.endsWith("/")) {
-                    continue;
-                }
-                final String factoryId = url.substring(url.lastIndexOf("/") + 1);
-                if (map == null) {
-                    map = new HashMap<String, Callable<Class>>();
-                    factories.put(bundle.getBundleId(), map);
-                }
-                map.put(factoryId, new BundleFactoryLoader(factoryId, u, bundle));
-            }
-        }
-        if (map != null) {
-            for (Map.Entry<String, Callable<Class>> entry : map.entrySet()) {
-                debugPrintln("registering service for key " + entry.getKey() + " with value " + entry.getValue());
-                OsgiLocator.register(entry.getKey(), entry.getValue());
-            }
-        }
-    }
-
-    protected void unregister(long bundleId) {
-        Map<String, Callable<Class>> map = factories.remove(bundleId);
-        if (map != null) {
-            for (Map.Entry<String, Callable<Class>> entry : map.entrySet()) {
-                debugPrintln("unregistering service for key " + entry.getKey() + " with value " + entry.getValue());
-                OsgiLocator.unregister(entry.getKey(), entry.getValue());
-            }
-        }
-    }
-
-    private class BundleFactoryLoader implements Callable<Class> {
-        private final String factoryId;
-        private final URL u;
-        private final Bundle bundle;
-        private volatile Class<?> clazz;
-
-        public BundleFactoryLoader(String factoryId, URL u, Bundle bundle) {
-            this.factoryId = factoryId;
-            this.u = u;
-            this.bundle = bundle;
-        }
-
-        public Class call() throws Exception {
-            try {
-                debugPrintln("loading factory for key: " + factoryId);
-                
-                if (clazz == null){
-                    synchronized (this) {
-                        if (clazz == null){
-                            debugPrintln("creating factory for key: " + factoryId);
-                            BufferedReader br = new BufferedReader(new InputStreamReader(u.openStream(), "UTF-8"));
-                            String factoryClassName = br.readLine();
-                            br.close();
-                            debugPrintln("factory implementation: " + factoryClassName);
-                            clazz = bundle.loadClass(factoryClassName);
-                        }
-                    }
-                }
-                return clazz;
-            } catch (Exception e) {
-                debugPrintln("exception caught while creating factory: " + e);
-                throw e;
-            } catch (Error e) {
-                debugPrintln("error caught while creating factory: " + e);
-                throw e;
-            }
-        }
-
-        @Override
-        public String toString() {
-           return u.toString();
-        }
-
-        @Override
-        public int hashCode() {
-           return u.hashCode();
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (obj instanceof BundleFactoryLoader) {
-                return u.equals(((BundleFactoryLoader) obj).u);
-            } else {
-                return false;
-            }
-        }
-    }
-}
diff --git a/trunk/jain-sip-api-1.2/pom.xml b/trunk/jain-sip-api-1.2/pom.xml
deleted file mode 100644
index 3b3fc2f..0000000
--- a/trunk/jain-sip-api-1.2/pom.xml
+++ /dev/null
@@ -1,108 +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.specs</groupId>
-        <artifactId>specs</artifactId>
-        <version>2.1.0</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.specs</groupId>
-    <artifactId>org.apache.servicemix.specs.jain-sip-api-1.2</artifactId>
-    <packaging>bundle</packaging>
-    <version>2.1.0</version>
-    <name>Apache ServiceMix :: Specs :: SIP API 1.2</name>
-
-    <repositories>
-        <repository>
-            <id>jboss</id>
-            <url>http://repository.jboss.org/nexus/content/groups/public/</url>
-            <snapshots>
-                <enabled>false</enabled>
-            </snapshots>
-        </repository>
-    </repositories>
-
-    <dependencies>
-        <dependency>
-            <groupId>javax.sip</groupId>
-            <artifactId>jain-sip-api</artifactId>
-            <version>1.2</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Description>${project.description}</Bundle-Description>
-                        <Export-Package>javax.sip*;version=1.2;-split-package:=merge-first;-noimport:=true</Export-Package>
-                        <Import-Package>*</Import-Package>
-                        <Implementation-Title>Apache ServiceMix</Implementation-Title>
-                        <Implementation-Version>${project.version}</Implementation-Version>
-                    </instructions>
-                    <unpackBundle>true</unpackBundle>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>deploy</id>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>attach-javadocs</id>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-source-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>attach-sources</id>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-            
-</project>
diff --git a/trunk/java-persistence-api-1.1.1/pom.xml b/trunk/java-persistence-api-1.1.1/pom.xml
deleted file mode 100644
index 9806dfe..0000000
--- a/trunk/java-persistence-api-1.1.1/pom.xml
+++ /dev/null
@@ -1,177 +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.specs</groupId>
-        <artifactId>specs</artifactId>
-        <version>2.1.0</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.specs</groupId>
-    <artifactId>org.apache.servicemix.specs.java-persistence-api-1.1.1</artifactId>
-    <packaging>bundle</packaging>
-    <version>2.1.0</version>
-    <name>Apache ServiceMix :: Specs :: Java Persistence API 1.4</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-jpa_3.0_spec</artifactId>
-            <version>1.1.1</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Description>${project.description}</Bundle-Description>
-                        <Export-Package>javax.persistence*;version=1.1.1;-split-package:=merge-first;-noimport:=true</Export-Package>
-                        <Import-Package>*</Import-Package>
-                        <Private-Package>org.apache.servicemix.specs.locator;-split-package:=merge-first</Private-Package>
-                        <Bundle-Activator>org.apache.servicemix.specs.locator.Activator</Bundle-Activator>
-                        <Implementation-Title>Apache ServiceMix</Implementation-Title>
-                        <Implementation-Version>${project.version}</Implementation-Version>
-                    </instructions>
-                    <unpackBundle>true</unpackBundle>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <artifactSet>
-                                <includes>
-                                    <include>org.apache.geronimo.specs:geronimo-jpa_3.0_spec</include>
-                                    <include>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</include>
-                                    <include>${project.groupId}:${project.artifactId}</include>
-                                </includes>
-                            </artifactSet>
-                            <filters>
-                                <filter>
-                                    <artifact>org.apache.geronimo.specs:geronimo-jpa_3.0_spec</artifact>
-                                    <excludes>
-                                        <exclude>javax/**</exclude>
-                                    </excludes>
-                                </filter>
-                                <filter>
-                                    <artifact>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</artifact>
-                                    <excludes>
-                                        <exclude>org/**</exclude>
-                                    </excludes>
-                                </filter>
-                            </filters>
-                            <createSourcesJar>${createSourcesJar}</createSourcesJar>
-                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-                            <createDependencyReducedPom>true</createDependencyReducedPom>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>deploy</id>
-            <properties>
-                <createSourcesJar>true</createSourcesJar>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-source-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>attach-sources</id>
-                                <phase>process-classes</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-dependency-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>unpack-sources</id>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>unpack</goal>
-                                </goals>
-                                <configuration>
-                                    <artifactItems>
-                                        <artifactItem>
-                                            <groupId>org.apache.servicemix.specs</groupId>
-                                            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                    </artifactItems>
-                                    <outputDirectory>${project.build.directory}/sources</outputDirectory>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>package</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <minmemory>128m</minmemory>
-                            <maxmemory>512m</maxmemory>
-                            <sourcepath>${project.build.directory}/sources</sourcepath>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
diff --git a/trunk/java-persistence-api-1.1.1/src/main/java/javax/persistence/Persistence.java b/trunk/java-persistence-api-1.1.1/src/main/java/javax/persistence/Persistence.java
deleted file mode 100644
index b19cc5c..0000000
--- a/trunk/java-persistence-api-1.1.1/src/main/java/javax/persistence/Persistence.java
+++ /dev/null
@@ -1,193 +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.
- */
-
-//
-// This source code implements specifications defined by the Java
-// Community Process. In order to remain compliant with the specification
-// DO NOT add / change / or delete method signatures!
-//
-package javax.persistence;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.Map;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.persistence.spi.PersistenceProvider;
-/**
- * @version $Rev$ $Date$
- */
-
-/**
- * Bootstrap class that is used to obtain {@link javax.persistence.EntityManagerFactory}
- * references.
- */
-public class Persistence {
-
-    protected static final Set<PersistenceProvider> providers = new HashSet<PersistenceProvider>();
-    // Changed to the hard coded PERSISTENCE_PROVIDER value to pass signature tests.
-    // public static final java.lang.String PERSISTENCE_PROVIDER = PersistenceProvider.class.getName(); 
-    public static final java.lang.String PERSISTENCE_PROVIDER = "javax.persistence.spi.PeristenceProvider";
-    static final String PERSISTENCE_PROVIDER_PROPERTY = "javax.persistence.provider";
-    static final String PERSISTENCE_PROVIDER_SERVICE = "META-INF/services/"
-        + PersistenceProvider.class.getName();
-    /**
-     * Create and return an EntityManagerFactory for the named persistence unit.
-     *
-     * @param persistenceUnitName The name of the persistence unit
-     * @return The factory that creates EntityManagers configured according to the
-     *         specified persistence unit
-     */
-    public static EntityManagerFactory createEntityManagerFactory(
-            String persistenceUnitName) {
-        return createEntityManagerFactory(persistenceUnitName, Collections.EMPTY_MAP);
-            }
-
-    /**
-     * Create and return an EntityManagerFactory for the named persistence unit using the
-     * given properties.
-     *
-     * @param persistenceUnitName The name of the persistence unit
-     * @param properties          Additional properties to use when creating the factory. The values of
-     *                            these properties override any values that may have been configured
-     *                            elsewhere.
-     * @return The factory that creates EntityManagers configured according to the
-     *         specified persistence unit.
-     */
-    public static EntityManagerFactory createEntityManagerFactory(
-            String persistenceUnitName,
-            Map properties) {
-
-        if (properties == null) {
-            properties = Collections.EMPTY_MAP;
-        }
-
-        // start by loading a provider explicitly specified in properties. The spec
-        // doesn't seem to forbid providers that are not deployed as a service
-        Object providerName = properties.get(PERSISTENCE_PROVIDER_PROPERTY);
-        if (providerName instanceof String) {
-            EntityManagerFactory factory = createFactory(
-                    providerName.toString(),
-                    persistenceUnitName,
-                    properties);
-            if (factory != null) {
-                return factory;
-            }
-        }
-         
-        //If we are deployed into an OSGi environment, leverage it
-        Class<? extends PersistenceProvider> providerClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(PersistenceProvider.class);
-        if (providerClass != null) {
-            try {
-                PersistenceProvider provider = providerClass.newInstance();
-                return provider.createEntityManagerFactory(persistenceUnitName,
-                    properties);
-            }
-            catch (Exception e) {
-                throw new PersistenceException("Provider error. Provider: "
-                    + providerName, e);
-            } 
-        }
-
-        // load correctly deployed providers
-        ClassLoader loader = Thread.currentThread().getContextClassLoader();
-        try {
-            Enumeration<URL> providers = loader
-                .getResources(PERSISTENCE_PROVIDER_SERVICE);
-            while (providers.hasMoreElements()) {
-
-                String name = getProviderName(providers.nextElement());
-
-                if (name != null) {
-
-                    EntityManagerFactory factory = createFactory(
-                            name,
-                            persistenceUnitName,
-                            properties);
-
-                    if (factory != null) {
-                        return factory;
-                    }
-                }
-            }
-        }
-        catch (IOException e) {
-            // spec doesn't mention any exceptions thrown by this method
-        }
-
-        return null;
-    }
-
-    static String getProviderName(URL url) throws IOException {
-
-        BufferedReader in = new BufferedReader(new InputStreamReader(
-                    url.openStream(),
-                    "UTF-8"));
-
-        String providerName;
-
-        try {
-            providerName = in.readLine();
-        }
-        finally {
-            in.close();
-        }
-
-        if (providerName != null) {
-            providerName = providerName.trim();
-        }
-
-        return providerName;
-    }
-
-    static EntityManagerFactory createFactory(
-            String providerName,
-            String persistenceUnitName,
-            Map properties)
-        throws PersistenceException {
-
-        Class providerClass;
-        try {
-            providerClass = Class.forName(providerName, true, Thread
-                    .currentThread().getContextClassLoader());
-        } 
-        catch (Exception e) {
-            throw new PersistenceException(
-                    "Invalid or inaccessible provider class: " + providerName,
-                    e);
-        }
-
-        try {
-            PersistenceProvider provider = (PersistenceProvider) providerClass
-                .newInstance();
-            return provider.createEntityManagerFactory(persistenceUnitName,
-                    properties);
-        }
-        catch (Exception e) {
-            throw new PersistenceException("Provider error. Provider: "
-                    + providerName, e);
-        }
-    }
-}
-
diff --git a/trunk/java-persistence-api-2.0/pom.xml b/trunk/java-persistence-api-2.0/pom.xml
deleted file mode 100644
index c24312b..0000000
--- a/trunk/java-persistence-api-2.0/pom.xml
+++ /dev/null
@@ -1,177 +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.specs</groupId>
-        <artifactId>specs</artifactId>
-        <version>2.1.0</version>
-    </parent>
-    
-    <groupId>org.apache.servicemix.specs</groupId>
-    <artifactId>org.apache.servicemix.specs.java-persistence-api-2.0</artifactId>
-    <packaging>bundle</packaging>
-    <version>2.1.0</version>
-    <name>Apache ServiceMix :: Specs :: Java Persistence API 2.0</name>
-    
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-jpa_2.0_spec</artifactId>
-            <version>1.0</version>
-        </dependency>
-    </dependencies>
-    
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Description>${project.description}</Bundle-Description>
-                        <Export-Package>javax.persistence*;version=2.0;-split-package:=merge-first;-noimport:=true</Export-Package>
-                        <Import-Package>*</Import-Package>
-                        <Private-Package>org.apache.servicemix.specs.locator;-split-package:=merge-first</Private-Package>
-                        <Bundle-Activator>org.apache.servicemix.specs.locator.Activator</Bundle-Activator>
-                        <Implementation-Title>Apache ServiceMix</Implementation-Title>
-                        <Implementation-Version>${project.version}</Implementation-Version>
-                    </instructions>
-                    <unpackBundle>true</unpackBundle>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <artifactSet>
-                                <includes>
-                                    <include>org.apache.geronimo.specs:geronimo-jpa_3.0_spec</include>
-                                    <include>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</include>
-                                    <include>${project.groupId}:${project.artifactId}</include>
-                                </includes>
-                            </artifactSet>
-                            <filters>
-                                <filter>
-                                    <artifact>org.apache.geronimo.specs:geronimo-jpa_3.0_spec</artifact>
-                                    <excludes>
-                                        <exclude>javax/**</exclude>
-                                    </excludes>
-                                </filter>
-                                <filter>
-                                    <artifact>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</artifact>
-                                    <excludes>
-                                        <exclude>org/**</exclude>
-                                    </excludes>
-                                </filter>
-                            </filters>
-                            <createSourcesJar>${createSourceJar}</createSourcesJar>
-                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-                            <createDependencyReducedPom>true</createDependencyReducedPom>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-    
-    <profiles>
-        <profile>
-            <id>deploy</id>
-            <properties>
-                <createSourcesJar>true</createSourcesJar>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-source-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>attach-sources</id>
-                                <phase>process-classes</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-dependency-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>unpack-sources</id>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>unpack</goal>
-                                </goals>
-                                <configuration>
-                                    <artifactItems>
-                                        <artifactItem>
-                                            <groupId>org.apache.servicemix.specs</groupId>
-                                            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                    </artifactItems>
-                                    <outputDirectory>${project.build.directory}/sources</outputDirectory>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>package</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <minmemory>128m</minmemory>
-                            <maxmemory>512m</maxmemory>
-                            <sourcepath>${project.build.directory}/sources</sourcepath>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
diff --git a/trunk/java-persistence-api-2.0/src/main/java/javax/persistence/Persistence.java b/trunk/java-persistence-api-2.0/src/main/java/javax/persistence/Persistence.java
deleted file mode 100644
index 37a205d..0000000
--- a/trunk/java-persistence-api-2.0/src/main/java/javax/persistence/Persistence.java
+++ /dev/null
@@ -1,160 +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.
- */
-
-//
-// This source code implements specifications defined by the Java
-// Community Process. In order to remain compliant with the specification
-// DO NOT add / change / or delete method signatures!
-//
-package javax.persistence;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import javax.persistence.spi.PersistenceProvider;
-
-/**
- * @version $Rev$ $Date$
- */
-
-/**
- * Bootstrap class that is used to obtain {@link javax.persistence.EntityManagerFactory}
- * references.
- */
-public class Persistence {
-    
-    protected static final Set<PersistenceProvider> providers = new HashSet<PersistenceProvider>();
-    // Changed to the hard coded PERSISTENCE_PROVIDER value to pass signature tests.
-    // public static final java.lang.String PERSISTENCE_PROVIDER = PersistenceProvider.class.getName();
-    public static final java.lang.String PERSISTENCE_PROVIDER = "javax.persistence.spi.PersistenceProvider";
-    static final String PERSISTENCE_PROVIDER_PROPERTY = "javax.persistence.provider";
-    static final String PERSISTENCE_PROVIDER_SERVICE = "META-INF/services/"
-        + PersistenceProvider.class.getName();
-    
-    /**
-     * Create and return an EntityManagerFactory for the named persistence unit.
-     * 
-     * @param persistenceUnitName The name of the persistence unit
-     * @return The factory that creates EntityManagers configured according to the specified persistence unit
-     */
-    public static EntityManagerFactory createEntityManagerFactory(String persistenceUnitName) {
-        return createEntityManagerFactory(persistenceUnitName, Collections.EMPTY_MAP);
-    }
-    
-    public static EntityManagerFactory createEntityManagerFactory(String persistenceUnitName, Map properties) {
-        
-        if (properties == null) {
-            properties = Collections.EMPTY_MAP;
-        }
-        
-        // start by loading a provider explicitly specified in properties. The spec
-        // doesn't seem to forbid providers that are not deployed as a service
-        Object providerName = properties.get(PERSISTENCE_PROVIDER_PROPERTY);
-        if (providerName instanceof String) {
-            EntityManagerFactory factory = createFactory(providerName.toString(), persistenceUnitName, properties);
-            if (factory != null) {
-                return factory;
-            }
-        }
-        
-        // If we are deployed into an OSGi environment, leverage it
-        Class<? extends PersistenceProvider> providerClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(PersistenceProvider.class);
-        if (providerClass != null) {
-            try {
-                PersistenceProvider provider = providerClass.newInstance();
-                return provider.createEntityManagerFactory(persistenceUnitName, properties);
-            }
-            catch (Exception e) {
-                throw new PersistenceException("Provider error. Provider: " + providerName, e);
-            }
-        }
-        
-        // load correctly deployed providers
-        ClassLoader loader = Thread.currentThread().getContextClassLoader();
-        try {
-            Enumeration<URL> providers = loader.getResources(PERSISTENCE_PROVIDER_SERVICE);
-            while (providers.hasMoreElements()) {
-                
-                String name = getProviderName(providers.nextElement());
-                
-                if (name != null) {
-                    
-                    EntityManagerFactory factory = createFactory(name, persistenceUnitName, properties);
-                    
-                    if (factory != null) {
-                        return factory;
-                    }
-                }
-            }
-        }
-        catch (IOException e) {
-            // spec doesn't mention any exceptions thrown by this method
-        }
-        
-        return null;
-    }
-    
-    static String getProviderName(URL url) throws IOException {
-        
-        BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));
-        
-        String providerName;
-        
-        try {
-            providerName = in.readLine();
-        }
-        finally {
-            in.close();
-        }
-        
-        if (providerName != null) {
-            providerName = providerName.trim();
-        }
-        
-        return providerName;
-    }
-    
-    static EntityManagerFactory createFactory(String providerName, String persistenceUnitName, Map properties) throws PersistenceException {
-        
-        Class providerClass;
-        try {
-            providerClass = Class.forName(providerName, true, Thread.currentThread().getContextClassLoader());
-        }
-        catch (Exception e) {
-            throw new PersistenceException("Invalid or inaccessible provider class: " + providerName, e);
-        }
-        
-        try {
-            PersistenceProvider provider = (PersistenceProvider) providerClass.newInstance();
-            return provider.createEntityManagerFactory(persistenceUnitName, properties);
-        }
-        catch (Exception e) {
-            throw new PersistenceException("Provider error. Provider: " + providerName, e);
-        }
-        
-    }
-
-}
diff --git a/trunk/javamail-api-1.4/pom.xml b/trunk/javamail-api-1.4/pom.xml
deleted file mode 100644
index 59f0915..0000000
--- a/trunk/javamail-api-1.4/pom.xml
+++ /dev/null
@@ -1,178 +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.specs</groupId>
-        <artifactId>specs</artifactId>
-        <version>2.1.0</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.specs</groupId>
-    <artifactId>org.apache.servicemix.specs.javamail-api-1.4</artifactId>
-    <packaging>bundle</packaging>
-    <version>2.1.0</version>
-    <name>Apache ServiceMix :: Specs :: JavaMail API 1.4</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-javamail_1.4_spec</artifactId>
-            <version>1.6</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Description>${project.description}</Bundle-Description>
-                        <Export-Package>javax.mail*;version=1.4;-split-package:=merge-first,org.apache.geronimo.mail*;version=1.6;-split-package:=merge-first</Export-Package>
-                        <Import-Package>*</Import-Package>
-                        <Private-Package>org.apache.servicemix.specs.locator;-split-package:=merge-first</Private-Package>
-                        <Bundle-Activator>org.apache.servicemix.specs.locator.Activator</Bundle-Activator>
-                        <Implementation-Title>Apache ServiceMix</Implementation-Title>
-                        <Implementation-Version>${project.version}</Implementation-Version>
-                    </instructions>
-                    <unpackBundle>true</unpackBundle>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <artifactSet>
-                                <includes>
-                                    <include>org.apache.geronimo.specs:geronimo-javamail_1.4_spec</include>
-                                    <include>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</include>
-                                    <include>${project.groupId}:${project.artifactId}</include>
-                                </includes>
-                            </artifactSet>
-                            <filters>
-                                <filter>
-                                    <artifact>org.apache.geronimo.specs:geronimo-javamail_1.4_spec</artifact>
-                                    <excludes>
-                                        <exclude>javax/**</exclude>
-                                        <exclude>org/**</exclude>
-                                    </excludes>
-                                </filter>
-                                <filter>
-                                    <artifact>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</artifact>
-                                    <excludes>
-                                        <exclude>org/**</exclude>
-                                    </excludes>
-                                </filter>
-                            </filters>
-                            <createSourcesJar>${createSourcesJar}</createSourcesJar>
-                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-                            <createDependencyReducedPom>true</createDependencyReducedPom>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>deploy</id>
-            <properties>
-                <createSourcesJar>true</createSourcesJar>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-source-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>attach-sources</id>
-                                <phase>process-classes</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-dependency-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>unpack-sources</id>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>unpack</goal>
-                                </goals>
-                                <configuration>
-                                    <artifactItems>
-                                        <artifactItem>
-                                            <groupId>org.apache.servicemix.specs</groupId>
-                                            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                    </artifactItems>
-                                    <outputDirectory>${project.build.directory}/sources</outputDirectory>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>package</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <minmemory>128m</minmemory>
-                            <maxmemory>512m</maxmemory>
-                            <sourcepath>${project.build.directory}/sources</sourcepath>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
diff --git a/trunk/javamail-api-1.4/src/main/java/javax/mail/Session.java b/trunk/javamail-api-1.4/src/main/java/javax/mail/Session.java
deleted file mode 100644
index c0471ba..0000000
--- a/trunk/javamail-api-1.4/src/main/java/javax/mail/Session.java
+++ /dev/null
@@ -1,832 +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 javax.mail;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.PrintStream;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.net.InetAddress;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.StringTokenizer;
-import java.util.WeakHashMap;
-
-
-/**
- * OK, so we have a final class in the API with a heck of a lot of implementation required...
- * let's try and figure out what it is meant to do.
- * <p/>
- * It is supposed to collect together properties and defaults so that they can be
- * shared by multiple applications on a desktop; with process isolation and no
- * real concept of shared memory, this seems challenging. These properties and
- * defaults rely on system properties, making management in a app server harder,
- * and on resources loaded from "mail.jar" which may lead to skew between                    
- * differnet independent implementations of this API.
- *
- * @version $Rev$ $Date$
- */
-public final class Session {
-    private static final Class[] PARAM_TYPES = {Session.class, URLName.class};
-    private static final WeakHashMap addressMapsByClassLoader = new WeakHashMap();
-    private static Session DEFAULT_SESSION;
-
-    private Map passwordAuthentications = new HashMap();
-
-    private final Properties properties;
-    private final Authenticator authenticator;
-    private boolean debug;
-    private PrintStream debugOut = System.out;
-
-    private static final WeakHashMap providersByClassLoader = new WeakHashMap();
-
-    /**
-     * No public constrcutor allowed.
-     */
-    private Session(Properties properties, Authenticator authenticator) {
-        this.properties = properties;
-        this.authenticator = authenticator;
-        debug = Boolean.valueOf(properties.getProperty("mail.debug")).booleanValue();
-    }
-
-    /**
-     * Create a new session initialized with the supplied properties which uses the supplied authenticator.
-     * Clients should ensure the properties listed in Appendix A of the JavaMail specification are
-     * set as the defaults are unlikey to work in most scenarios; particular attention should be given
-     * to:
-     * <ul>
-     * <li>mail.store.protocol</li>
-     * <li>mail.transport.protocol</li>
-     * <li>mail.host</li>
-     * <li>mail.user</li>
-     * <li>mail.from</li>
-     * </ul>
-     *
-     * @param properties    the session properties
-     * @param authenticator an authenticator for callbacks to the user
-     * @return a new session
-     */
-    public static Session getInstance(Properties properties, Authenticator authenticator) {
-        return new Session(new Properties(properties), authenticator);
-    }
-
-    /**
-     * Create a new session initialized with the supplied properties with no authenticator.
-     *
-     * @param properties the session properties
-     * @return a new session
-     * @see #getInstance(java.util.Properties, Authenticator)
-     */
-    public static Session getInstance(Properties properties) {
-        return getInstance(properties, null);
-    }
-
-    /**
-     * Get the "default" instance assuming no authenticator is required.
-     *
-     * @param properties the session properties
-     * @return if "default" session
-     * @throws SecurityException if the does not have permission to access the default session
-     */
-    public synchronized static Session getDefaultInstance(Properties properties) {
-        return getDefaultInstance(properties, null);
-    }
-
-    /**
-     * Get the "default" session.
-     * If there is not current "default", a new Session is created and installed as the default.
-     *
-     * @param properties
-     * @param authenticator
-     * @return if "default" session
-     * @throws SecurityException if the does not have permission to access the default session
-     */
-    public synchronized static Session getDefaultInstance(Properties properties, Authenticator authenticator) {
-        if (DEFAULT_SESSION == null) {
-            DEFAULT_SESSION = getInstance(properties, authenticator);
-        } else {
-            if (authenticator != DEFAULT_SESSION.authenticator) {
-                if (authenticator == null || DEFAULT_SESSION.authenticator == null || authenticator.getClass().getClassLoader() != DEFAULT_SESSION.authenticator.getClass().getClassLoader()) {
-                    throw new SecurityException();
-                }
-            }
-            // todo we should check with the SecurityManager here as well
-        }
-        return DEFAULT_SESSION;
-    }
-
-    /**
-     * Enable debugging for this session.
-     * Debugging can also be enabled by setting the "mail.debug" property to true when
-     * the session is being created.
-     *
-     * @param debug the debug setting
-     */
-    public void setDebug(boolean debug) {
-        this.debug = debug;
-    }
-
-    /**
-     * Get the debug setting for this session.
-     *
-     * @return the debug setting
-     */
-    public boolean getDebug() {
-        return debug;
-    }
-
-    /**
-     * Set the output stream where debug information should be sent.
-     * If set to null, System.out will be used.
-     *
-     * @param out the stream to write debug information to
-     */
-    public void setDebugOut(PrintStream out) {
-        debugOut = out == null ? System.out : out;
-    }
-
-    /**
-     * Return the debug output stream.
-     *
-     * @return the debug output stream
-     */
-    public PrintStream getDebugOut() {
-        return debugOut;
-    }
-
-    /**
-     * Return the list of providers available to this application.
-     * This method searches for providers that are defined in the javamail.providers
-     * and javamail.default.providers resources available through the current context
-     * classloader, or if that is not available, the classloader that loaded this class.
-     * <p/>
-     * As searching for providers is potentially expensive, this implementation maintains
-     * a WeakHashMap of providers indexed by ClassLoader.
-     *
-     * @return an array of providers
-     */
-    public Provider[] getProviders() {
-        ProviderInfo info = getProviderInfo();
-        return (Provider[]) info.all.toArray(new Provider[info.all.size()]);
-    }
-
-    /**
-     * Return the provider for a specific protocol.
-     * This implementation initially looks in the Session properties for an property with the name
-     * "mail.<protocol>.class"; if found it attempts to create an instance of the class named in that
-     * property throwing a NoSuchProviderException if the class cannot be loaded.
-     * If this property is not found, it searches the providers returned by {@link #getProviders()}
-     * for a entry for the specified protocol.
-     *
-     * @param protocol the protocol to get a provider for
-     * @return a provider for that protocol
-     * @throws NoSuchProviderException
-     */
-    public Provider getProvider(String protocol) throws NoSuchProviderException {
-    	//If we are deployed into an OSGi environment, leverage it
-        Class<? extends Provider> providerClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(Provider.class, protocol);
-        if (providerClass != null) {
-            try {
-				return (Provider) providerClass.newInstance();
-			} catch (InstantiationException e) {
-				throw new NoSuchProviderException(e.getMessage());
-			} catch (IllegalAccessException e) {
-				throw new NoSuchProviderException(e.getMessage());
-			}
-        }
-
-        ProviderInfo info = getProviderInfo();
-        Provider provider = null;
-        String providerName = properties.getProperty("mail." + protocol + ".class");
-        if (providerName != null) {
-            provider = (Provider) info.byClassName.get(providerName);
-            if (debug) {
-                writeDebug("DEBUG: new provider loaded: " + provider.toString());
-            }
-        }
-
-        // if not able to locate this by class name, just grab a registered protocol.
-        if (provider == null) {
-            provider = (Provider) info.byProtocol.get(protocol);
-        }
-
-        if (provider == null) {
-            throw new NoSuchProviderException("Unable to locate provider for protocol: " + protocol);
-        }
-        if (debug) {
-            writeDebug("DEBUG: getProvider() returning provider " + provider.toString());
-        }
-        return provider;
-    }
-
-    /**
-     * Make the supplied Provider the default for its protocol.
-     *
-     * @param provider the new default Provider
-     * @throws NoSuchProviderException
-     */
-    public void setProvider(Provider provider) throws NoSuchProviderException {
-        ProviderInfo info = getProviderInfo();
-        info.byProtocol.put(provider.getProtocol(), provider);
-    }
-
-    /**
-     * Return a Store for the default protocol defined by the mail.store.protocol property.
-     *
-     * @return the store for the default protocol
-     * @throws NoSuchProviderException
-     */
-    public Store getStore() throws NoSuchProviderException {
-        String protocol = properties.getProperty("mail.store.protocol");
-        if (protocol == null) {
-            throw new NoSuchProviderException("mail.store.protocol property is not set");
-        }
-        return getStore(protocol);
-    }
-
-    /**
-     * Return a Store for the specified protocol.
-     *
-     * @param protocol the protocol to get a Store for
-     * @return a Store
-     * @throws NoSuchProviderException if no provider is defined for the specified protocol
-     */
-    public Store getStore(String protocol) throws NoSuchProviderException {
-        Provider provider = getProvider(protocol);
-        return getStore(provider);
-    }
-
-    /**
-     * Return a Store for the protocol specified in the given URL
-     *
-     * @param url the URL of the Store
-     * @return a Store
-     * @throws NoSuchProviderException if no provider is defined for the specified protocol
-     */
-    public Store getStore(URLName url) throws NoSuchProviderException {
-        return (Store) getService(getProvider(url.getProtocol()), url);
-    }
-
-    /**
-     * Return the Store specified by the given provider.
-     *
-     * @param provider the provider to create from
-     * @return a Store
-     * @throws NoSuchProviderException if there was a problem creating the Store
-     */
-    public Store getStore(Provider provider) throws NoSuchProviderException {
-        if (Provider.Type.STORE != provider.getType()) {
-            throw new NoSuchProviderException("Not a Store Provider: " + provider);
-        }
-        return (Store) getService(provider, null);
-    }
-
-    /**
-     * Return a closed folder for the supplied URLName, or null if it cannot be obtained.
-     * <p/>
-     * The scheme portion of the URL is used to locate the Provider and create the Store;
-     * the returned Store is then used to obtain the folder.
-     *
-     * @param name the location of the folder
-     * @return the requested folder, or null if it is unavailable
-     * @throws NoSuchProviderException if there is no provider
-     * @throws MessagingException      if there was a problem accessing the Store
-     */
-    public Folder getFolder(URLName name) throws MessagingException {
-        Store store = getStore(name);
-        return store.getFolder(name);
-    }
-
-    /**
-     * Return a Transport for the default protocol specified by the
-     * <code>mail.transport.protocol</code> property.
-     *
-     * @return a Transport
-     * @throws NoSuchProviderException
-     */
-    public Transport getTransport() throws NoSuchProviderException {
-        String protocol = properties.getProperty("mail.transport.protocol");
-        if (protocol == null) {
-            throw new NoSuchProviderException("mail.transport.protocol property is not set");
-        }
-        return getTransport(protocol);
-    }
-
-    /**
-     * Return a Transport for the specified protocol.
-     *
-     * @param protocol the protocol to use
-     * @return a Transport
-     * @throws NoSuchProviderException
-     */
-    public Transport getTransport(String protocol) throws NoSuchProviderException {
-        Provider provider = getProvider(protocol);
-        return getTransport(provider);
-    }
-
-    /**
-     * Return a transport for the protocol specified in the URL.
-     *
-     * @param name the URL whose scheme specifies the protocol
-     * @return a Transport
-     * @throws NoSuchProviderException
-     */
-    public Transport getTransport(URLName name) throws NoSuchProviderException {
-        return (Transport) getService(getProvider(name.getProtocol()), name);
-    }
-
-    /**
-     * Return a transport for the protocol associated with the type of this address.
-     *
-     * @param address the address we are trying to deliver to
-     * @return a Transport
-     * @throws NoSuchProviderException
-     */
-    public Transport getTransport(Address address) throws NoSuchProviderException {
-        String type = address.getType();
-        // load the address map from the resource files.
-        Map addressMap = getAddressMap();
-        String protocolName = (String)addressMap.get(type);
-        if (protocolName == null) {
-            throw new NoSuchProviderException("No provider for address type " + type);
-        }
-        return getTransport(protocolName);
-    }
-
-    /**
-     * Return the Transport specified by a Provider
-     *
-     * @param provider the defining Provider
-     * @return a Transport
-     * @throws NoSuchProviderException
-     */
-    public Transport getTransport(Provider provider) throws NoSuchProviderException {
-        return (Transport) getService(provider, null);
-    }
-
-    /**
-     * Set the password authentication associated with a URL.
-     *
-     * @param name          the url
-     * @param authenticator the authenticator
-     */
-    public void setPasswordAuthentication(URLName name, PasswordAuthentication authenticator) {
-        if (authenticator == null) {
-            passwordAuthentications.remove(name);
-        } else {
-            passwordAuthentications.put(name, authenticator);
-        }
-    }
-
-    /**
-     * Get the password authentication associated with a URL
-     *
-     * @param name the URL
-     * @return any authenticator for that url, or null if none
-     */
-    public PasswordAuthentication getPasswordAuthentication(URLName name) {
-        return (PasswordAuthentication) passwordAuthentications.get(name);
-    }
-
-    /**
-     * Call back to the application supplied authenticator to get the needed username add password.
-     *
-     * @param host            the host we are trying to connect to, may be null
-     * @param port            the port on that host
-     * @param protocol        the protocol trying to be used
-     * @param prompt          a String to show as part of the prompt, may be null
-     * @param defaultUserName the default username, may be null
-     * @return the authentication information collected by the authenticator; may be null
-     */
-    public PasswordAuthentication requestPasswordAuthentication(InetAddress host, int port, String protocol, String prompt, String defaultUserName) {
-        if (authenticator == null) {
-            return null;
-        }
-        return authenticator.authenticate(host, port, protocol, prompt, defaultUserName);
-    }
-
-    /**
-     * Return the properties object for this Session; this is a live collection.
-     *
-     * @return the properties for the Session
-     */
-    public Properties getProperties() {
-        return properties;
-    }
-
-    /**
-     * Return the specified property.
-     *
-     * @param property the property to get
-     * @return its value, or null if not present
-     */
-    public String getProperty(String property) {
-        return getProperties().getProperty(property);
-    }
-
-
-    /**
-     * Add a provider to the Session managed provider list.
-     *
-     * @param provider The new provider to add.
-     */
-    public synchronized void addProvider(Provider provider) {
-        ProviderInfo info = getProviderInfo();
-        info.addProvider(provider);
-    }
-
-
-
-    /**
-     * Add a mapping between an address type and a protocol used
-     * to process that address type.
-     *
-     * @param addressType
-     *                 The address type identifier.
-     * @param protocol The protocol name mapping.
-     */
-    public void setProtocolForAddress(String addressType, String protocol) {
-        Map addressMap = getAddressMap();
-
-        // no protocol specified is a removal
-        if (protocol == null) {
-            addressMap.remove(addressType);
-        }
-        else {
-            addressMap.put(addressType, protocol);
-        }
-    }
-
-
-    private Service getService(Provider provider, URLName name) throws NoSuchProviderException {
-        try {
-            if (name == null) {
-                name = new URLName(provider.getProtocol(), null, -1, null, null, null); 
-            }
-            
-            //If we are deployed into an OSGi environment, leverage it
-            Class<? extends Service> providerClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(Service.class, provider.getClassName());
-            if (providerClass != null) {
-                try {
-                	Constructor ctr = providerClass.getConstructor(PARAM_TYPES);
-                    return (Service) ctr.newInstance(this, name);
-    			} catch (InstantiationException e) {
-    				throw new NoSuchProviderException(e.getMessage());
-    			} catch (IllegalAccessException e) {
-    				throw new NoSuchProviderException(e.getMessage());
-    			}
-            }
-            
-            ClassLoader cl = getClassLoader();
-            Class clazz = cl.loadClass(provider.getClassName());
-            Constructor ctr = clazz.getConstructor(PARAM_TYPES);
-            return (Service) ctr.newInstance(this, name);
-        } catch (ClassNotFoundException e) {
-            throw (NoSuchProviderException) new NoSuchProviderException("Unable to load class for provider: " + provider).initCause(e);
-        } catch (NoSuchMethodException e) {
-            throw (NoSuchProviderException) new NoSuchProviderException("Provider class does not have a constructor(Session, URLName): " + provider).initCause(e);
-        } catch (InstantiationException e) {
-            throw (NoSuchProviderException) new NoSuchProviderException("Unable to instantiate provider class: " + provider).initCause(e);
-        } catch (IllegalAccessException e) {
-            throw (NoSuchProviderException) new NoSuchProviderException("Unable to instantiate provider class: " + provider).initCause(e);
-        } catch (InvocationTargetException e) {
-            throw (NoSuchProviderException) new NoSuchProviderException("Exception from constructor of provider class: " + provider).initCause(e.getCause());
-        }
-    }
-
-    private ProviderInfo getProviderInfo() {
-        ClassLoader cl = getClassLoader();
-        ProviderInfo info = (ProviderInfo) providersByClassLoader.get(cl);
-        if (info == null) {
-            info = loadProviders(cl);
-        }
-        return info;
-    }
-
-    private Map getAddressMap() {
-        ClassLoader cl = getClassLoader();
-        Map addressMap = (Map)addressMapsByClassLoader.get(cl);
-        if (addressMap == null) {
-            addressMap = loadAddressMap(cl);
-        }
-        return addressMap;
-    }
-
-
-    /**
-     * Resolve a class loader used to resolve context resources.  The
-     * class loader used is either a current thread context class
-     * loader (if set), the class loader used to load an authenticator
-     * we've been initialized with, or the class loader used to load
-     * this class instance (which may be a subclass of Session).
-     *
-     * @return The class loader used to load resources.
-     */
-    private ClassLoader getClassLoader() {
-        ClassLoader cl = Thread.currentThread().getContextClassLoader();
-        if (cl == null) {
-            if (authenticator != null) {
-                cl = authenticator.getClass().getClassLoader();
-            }
-            else {
-                cl = this.getClass().getClassLoader();
-            }
-        }
-        return cl;
-    }
-
-    private ProviderInfo loadProviders(ClassLoader cl) {
-        // we create a merged map from reading all of the potential address map entries.  The locations
-        // searched are:
-        //   1.   java.home/lib/javamail.address.map
-        //   2. META-INF/javamail.address.map
-        //   3. META-INF/javamail.default.address.map
-        //
-        ProviderInfo info = new ProviderInfo();
-
-        // make sure this is added to the global map.
-        providersByClassLoader.put(cl, info);
-
-
-        // NOTE:  Unlike the addressMap, we process these in the defined order.  The loading routine
-        // will not overwrite entries if they already exist in the map.
-
-        try {
-            File file = new File(System.getProperty("java.home"), "lib/javamail.providers");
-            InputStream is = new FileInputStream(file);
-            try {
-                loadProviders(info, is);
-                if (debug) {
-                    writeDebug("Loaded lib/javamail.providers from " + file.toString());
-                }
-            } finally{
-                is.close();
-            }
-        } catch (SecurityException e) {
-            // ignore
-        } catch (IOException e) {
-            // ignore
-        }
-
-        try {
-            Enumeration e = cl.getResources("META-INF/javamail.providers");
-            while (e.hasMoreElements()) {
-                URL url = (URL) e.nextElement();
-                if (debug) {
-                    writeDebug("Loading META-INF/javamail.providers from " + url.toString());
-                }
-                InputStream is = url.openStream();
-                try {
-                    loadProviders(info, is);
-                } finally{
-                    is.close();
-                }
-            }
-        } catch (SecurityException e) {
-            // ignore
-        } catch (IOException e) {
-            // ignore
-        }
-
-        try {
-            Enumeration e = cl.getResources("META-INF/javamail.default.providers");
-            while (e.hasMoreElements()) {
-                URL url = (URL) e.nextElement();
-                if (debug) {
-                    writeDebug("Loading javamail.default.providers from " + url.toString());
-                }
-
-                InputStream is = url.openStream();
-                try {
-                    loadProviders(info, is);
-                } finally{
-                    is.close();
-                }
-            }
-        } catch (SecurityException e) {
-            // ignore
-        } catch (IOException e) {
-            // ignore
-        }
-
-        return info;
-    }
-
-    private void loadProviders(ProviderInfo info, InputStream is) throws IOException {
-        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
-        String line;
-        while ((line = reader.readLine()) != null) {
-            // Lines beginning with "#" are just comments.  
-            if (line.startsWith("#")) {
-                continue; 
-            }
-            
-            StringTokenizer tok = new StringTokenizer(line, ";");
-            String protocol = null;
-            Provider.Type type = null;
-            String className = null;
-            String vendor = null;
-            String version = null;
-            while (tok.hasMoreTokens()) {
-                String property = tok.nextToken();
-                int index = property.indexOf('=');
-                if (index == -1) {
-                    continue;
-                }
-                String key = property.substring(0, index).trim().toLowerCase();
-                String value = property.substring(index+1).trim();
-                if (protocol == null && "protocol".equals(key)) {
-                    protocol = value;
-                } else if (type == null && "type".equals(key)) {
-                    if ("store".equals(value)) {
-                        type = Provider.Type.STORE;
-                    } else if ("transport".equals(value)) {
-                        type = Provider.Type.TRANSPORT;
-                    }
-                } else if (className == null && "class".equals(key)) {
-                    className = value;
-                } else if ("vendor".equals(key)) {
-                    vendor = value;
-                } else if ("version".equals(key)) {
-                    version = value;
-                }
-            }
-            if (protocol == null || type == null || className == null) {
-                //todo should we log a warning?
-                continue;
-            }
-
-            if (debug) {
-                writeDebug("DEBUG: loading new provider protocol=" + protocol + ", className=" + className + ", vendor=" + vendor + ", version=" + version);
-            }
-            Provider provider = new Provider(type, protocol, className, vendor, version);
-            // add to the info list.
-            info.addProvider(provider);
-        }
-    }
-
-    /**
-     * Load up an address map associated with a using class loader
-     * instance.
-     *
-     * @param cl     The class loader used to resolve the address map.
-     *
-     * @return A map containing the entries associated with this classloader
-     *         instance.
-     */
-    private static Map loadAddressMap(ClassLoader cl) {
-        // we create a merged map from reading all of the potential address map entries.  The locations
-        // searched are:
-        //   1.   java.home/lib/javamail.address.map
-        //   2. META-INF/javamail.address.map
-        //   3. META-INF/javamail.default.address.map
-        //
-        // if all of the above searches fail, we just set up some "default" defaults.
-
-        // the format of the address.map file is defined as a property file.  We can cheat and
-        // just use Properties.load() to read in the files.
-        Properties addressMap = new Properties();
-
-        // add this to the tracking map.
-        addressMapsByClassLoader.put(cl, addressMap);
-
-        // NOTE:  We are reading these resources in reverse order of what's cited above.  This allows
-        // user defined entries to overwrite default entries if there are similarly named items.
-
-        try {
-            Enumeration e = cl.getResources("META-INF/javamail.default.address.map");
-            while (e.hasMoreElements()) {
-                URL url = (URL) e.nextElement();
-                InputStream is = url.openStream();
-                try {
-                    // load as a property file
-                    addressMap.load(is);
-                } finally{
-                    is.close();
-                }
-            }
-        } catch (SecurityException e) {
-            // ignore
-        } catch (IOException e) {
-            // ignore
-        }
-
-
-        try {
-            Enumeration e = cl.getResources("META-INF/javamail.address.map");
-            while (e.hasMoreElements()) {
-                URL url = (URL) e.nextElement();
-                InputStream is = url.openStream();
-                try {
-                    // load as a property file
-                    addressMap.load(is);
-                } finally{
-                    is.close();
-                }
-            }
-        } catch (SecurityException e) {
-            // ignore
-        } catch (IOException e) {
-            // ignore
-        }
-
-
-        try {
-            File file = new File(System.getProperty("java.home"), "lib/javamail.address.map");
-            InputStream is = new FileInputStream(file);
-            try {
-                // load as a property file
-                addressMap.load(is);
-            } finally{
-                is.close();
-            }
-        } catch (SecurityException e) {
-            // ignore
-        } catch (IOException e) {
-            // ignore
-        }
-
-        try {
-            Enumeration e = cl.getResources("META-INF/javamail.address.map");
-            while (e.hasMoreElements()) {
-                URL url = (URL) e.nextElement();
-                InputStream is = url.openStream();
-                try {
-                    // load as a property file
-                    addressMap.load(is);
-                } finally{
-                    is.close();
-                }
-            }
-        } catch (SecurityException e) {
-            // ignore
-        } catch (IOException e) {
-            // ignore
-        }
-
-
-        // if unable to load anything, at least create the MimeMessage-smtp protocol mapping.
-        if (addressMap.isEmpty()) {
-            addressMap.put("rfc822", "smtp");
-        }
-
-        return addressMap;
-    }
-
-    /**
-     * Private convenience routine for debug output.
-     *
-     * @param msg    The message to write out to the debug stream.
-     */
-    private void writeDebug(String msg) {
-        debugOut.println(msg);
-    }
-
-
-    private static class ProviderInfo {
-        private final Map byClassName = new HashMap();
-        private final Map byProtocol = new HashMap();
-        private final List all = new ArrayList();
-
-        public void addProvider(Provider provider) {
-            String className = provider.getClassName();
-
-            if (!byClassName.containsKey(className)) {
-                byClassName.put(className, provider);
-            }
-
-            String protocol = provider.getProtocol();
-            if (!byProtocol.containsKey(protocol)) {
-                byProtocol.put(protocol, provider);
-            }
-            all.add(provider);
-        }
-    }
-}
diff --git a/trunk/jaxb-api-2.0/pom.xml b/trunk/jaxb-api-2.0/pom.xml
deleted file mode 100644
index 4ca45fb..0000000
--- a/trunk/jaxb-api-2.0/pom.xml
+++ /dev/null
@@ -1,195 +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.specs</groupId>
-        <artifactId>specs</artifactId>
-        <version>2.1.0</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.specs</groupId>
-    <artifactId>org.apache.servicemix.specs.jaxb-api-2.0</artifactId>
-    <packaging>bundle</packaging>
-    <version>2.1.0</version>
-    <name>Apache ServiceMix :: Specs :: JAXB API 2.0</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.stax-api-1.0</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-activation_1.1_spec</artifactId>
-            <version>1.0.2</version>
-        </dependency>
-        <dependency>
-            <groupId>javax.xml.bind</groupId>
-            <artifactId>jaxb-api</artifactId>
-            <version>2.0</version>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>com.google.code.japidiff</groupId>
-                <artifactId>maven-japidiff-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>diff</goal>
-                        </goals>
-                    </execution>
-                </executions>
-                <configuration>
-                    <filter>javax/xml/bind.*</filter>
-                    <jar>javax.xml.bind:jaxb-api:2.0</jar>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Description>${project.description}</Bundle-Description>
-                        <Export-Package>javax.xml.bind*;version=2.0;-split-package:=merge-first;-noimport:=true</Export-Package>
-                        <Import-Package>*</Import-Package>
-                        <Private-Package>org.apache.servicemix.specs.locator;-split-package:=merge-first</Private-Package>
-                        <Bundle-Activator>org.apache.servicemix.specs.locator.Activator</Bundle-Activator>
-                        <Implementation-Title>Apache ServiceMix</Implementation-Title>
-                        <Implementation-Version>${project.version}</Implementation-Version>
-                    </instructions>
-                    <unpackBundle>true</unpackBundle>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <artifactSet>
-                                <includes>
-                                    <include>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</include>
-                                </includes>
-                            </artifactSet>
-                            <filters>
-                                <filter>
-                                    <artifact>${project.groupId}:${project.artifactId}</artifact>
-                                    <excludes>
-                                        <exclude>org/**</exclude>
-                                    </excludes>
-                                </filter>
-                            </filters>
-                            <createSourcesJar>${createSourcesJar}</createSourcesJar>
-                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-                            <createDependencyReducedPom>true</createDependencyReducedPom>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>deploy</id>
-            <properties>
-                <createSourcesJar>true</createSourcesJar>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-source-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>attach-sources</id>
-                                <phase>process-classes</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-dependency-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>unpack-sources</id>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>unpack</goal>
-                                </goals>
-                                <configuration>
-                                    <artifactItems>
-                                        <artifactItem>
-                                            <groupId>org.apache.servicemix.specs</groupId>
-                                            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                    </artifactItems>
-                                    <outputDirectory>${project.build.directory}/sources</outputDirectory>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>package</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <minmemory>128m</minmemory>
-                            <maxmemory>512m</maxmemory>
-                            <sourcepath>${project.build.directory}/sources</sourcepath>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/Binder.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/Binder.java
deleted file mode 100644
index 125a1be..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/Binder.java
+++ /dev/null
@@ -1,52 +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 javax.xml.bind;
-
-import javax.xml.validation.Schema;
-
-public abstract class Binder<XmlNode> {
-
-    public abstract ValidationEventHandler getEventHandler() throws JAXBException;
-
-    public abstract Object getJAXBNode(XmlNode xmlNode);
-
-    public abstract Object getProperty(String name) throws PropertyException;
-
-    public abstract Schema getSchema();
-
-    public abstract XmlNode getXMLNode(Object jaxbObject);
-
-    public abstract void marshal(Object jaxbObject, XmlNode xmlNode) throws JAXBException;
-
-    public abstract void setEventHandler(ValidationEventHandler handler) throws JAXBException;
-
-    public abstract void setProperty(String name, Object value) throws PropertyException;
-
-    public abstract void setSchema(Schema schema);
-
-    public abstract Object unmarshal(XmlNode xmlNode) throws JAXBException;
-
-    public abstract <T> JAXBElement<T> unmarshal(XmlNode xmlNode, Class<T> declaredType) throws JAXBException;
-
-    public abstract Object updateJAXB(XmlNode xmlNode) throws JAXBException;
-
-    public abstract XmlNode updateXML(Object jaxbObject) throws JAXBException;
-
-    public abstract XmlNode updateXML(Object jaxbObject, XmlNode xmlNode) throws JAXBException; 
-
-    
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/ContextFinder.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/ContextFinder.java
deleted file mode 100644
index 61dcd65..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/ContextFinder.java
+++ /dev/null
@@ -1,172 +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 javax.xml.bind;
-
-import java.lang.reflect.Method;
-import java.util.Map;
-import java.util.Properties;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
-
-class ContextFinder {
-
-    private static final String PLATFORM_DEFAULT_FACTORY_CLASS = "com.sun.xml.bind.v2.ContextFactory";
-    private static final String JAXB_CONTEXT_PROPERTY = JAXBContext.class.getName();
-    private static final String JAXB_CONTEXT_FACTORY = JAXBContext.JAXB_CONTEXT_FACTORY;
-
-    public static JAXBContext find(String contextPath, ClassLoader classLoader, Map properties) throws JAXBException {
-        String className = null;
-        if (contextPath == null || contextPath.length() == 0) {
-            throw new JAXBException("Invalid contextPath");
-        }
-        String[] packages = contextPath.split(":");
-        if (packages == null || packages.length == 0) {
-            throw new JAXBException("Invalid contextPath");
-        }
-        for (String pkg : packages) {
-            String url = pkg.replace('.', '/') + "/jaxb.properties";
-            className = loadClassNameFromProperties(url, classLoader);
-            if (className != null) {
-                break;
-            }
-        }
-        if (className == null) {
-            className = System.getProperty(JAXB_CONTEXT_PROPERTY);
-        }
-        if (className == null) {
-            String url = "META-INF/services/" + JAXB_CONTEXT_PROPERTY;
-            className = loadClassName(url, classLoader);
-        }
-        if (className == null) {
-            className = PLATFORM_DEFAULT_FACTORY_CLASS;
-        }
-        Class spi = loadSpi(className, classLoader);
-        try {
-            Method m = spi.getMethod("createContext", new Class[] { String.class, ClassLoader.class, Map.class });
-            return (JAXBContext) m.invoke(null, new Object[] { contextPath, classLoader, properties });
-        } catch (Throwable t) {
-            throw new JAXBException("Unable to create context", t);
-        }
-    }
-
-
-    public static JAXBContext find(Class[] classes, Map properties) throws JAXBException {
-        String className = null;
-        for (Class cl : classes) {
-            Package pkg = cl.getPackage();
-            if (pkg != null) {
-                String url = pkg.getName().replace('.', '/') + "/jaxb.properties";
-                className = loadClassNameFromProperties(url, cl.getClassLoader());
-                if (className != null) {
-                    break;
-                }
-            }
-        }
-        if (className == null) {
-            className = System.getProperty(JAXB_CONTEXT_PROPERTY);
-        }
-        if (className == null) {
-            String url = "META-INF/services/" + JAXB_CONTEXT_PROPERTY;
-            className = loadClassName(url, Thread.currentThread().getContextClassLoader());
-        }
-        if (className == null) {
-            className = PLATFORM_DEFAULT_FACTORY_CLASS;
-        }
-        Class spi = loadSpi(className, Thread.currentThread().getContextClassLoader());
-        try {
-            Method m = spi.getMethod("createContext", new Class[] { Class[].class, Map.class });
-            return (JAXBContext) m.invoke(null, new Object[] { classes, properties });
-        } catch (Throwable t) {
-            throw new JAXBException("Unable to create context", t);
-        }
-    }
-
-    private static String loadClassNameFromProperties(String url, ClassLoader classLoader) throws JAXBException {
-        try {
-            InputStream is;
-            if (classLoader != null) {
-                is = classLoader.getResourceAsStream(url);
-            } else {
-                is = ClassLoader.getSystemResourceAsStream(url);
-            }
-            if (is != null) {
-                try {
-                    Properties props = new Properties();
-                    props.load(is);
-                    String className = props.getProperty(JAXB_CONTEXT_FACTORY);
-                    if (className == null) {
-                        throw new JAXBException("jaxb.properties file " + url + " should contain a " + JAXB_CONTEXT_FACTORY + " property");
-                    }
-                    return className.trim();
-                } finally {
-                    is.close();
-                }
-            } else {
-                return null;
-            }
-        } catch (IOException e) {
-            throw new JAXBException(e);
-        }
-    }
-
-    private static String loadClassName(String url, ClassLoader classLoader) throws JAXBException {
-        try {
-            InputStream is;
-            if (classLoader != null) {
-                is = classLoader.getResourceAsStream(url);
-            } else {
-                is = ClassLoader.getSystemResourceAsStream(url);
-            }
-            if (is != null) {
-                try {
-                    BufferedReader r = new BufferedReader(new InputStreamReader(is, "UTF-8"));
-                    return r.readLine().trim();
-                } finally {
-                    is.close();
-                }
-            }
-            return null;
-        } catch (IOException e) {
-            throw new JAXBException(e);
-        }
-    }
-
-    private static Class loadSpi(String className, ClassLoader classLoader) throws JAXBException {
-        Class spiClass;
-        try {
-            spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(JAXBContext.class);
-            if (spiClass != null) {
-                return spiClass;
-            }
-        } catch (Throwable t) {
-        }
-        try {
-            if (classLoader != null) {
-                spiClass = classLoader.loadClass(className);
-            } else {
-                spiClass = Class.forName(className);
-            }
-        } catch (ClassNotFoundException e) {
-            throw new JAXBException("Provider " + className + " not found", e);
-        }
-        return spiClass;
-    }
-
-
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/DatatypeConverter.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/DatatypeConverter.java
deleted file mode 100644
index e8dd3c6..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/DatatypeConverter.java
+++ /dev/null
@@ -1,194 +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 javax.xml.bind;
-
-import java.util.Calendar;
-import java.math.BigInteger;
-import java.math.BigDecimal;
-
-import javax.xml.namespace.QName;
-import javax.xml.namespace.NamespaceContext;
-
-public final class DatatypeConverter {
-
-    private static DatatypeConverterInterface converter = null;
-
-    private DatatypeConverter() {
-    }
-
-    public static void setDatatypeConverter(DatatypeConverterInterface converter) {
-        if (converter == null) {
-            throw new IllegalArgumentException("The DatatypeConverterInterface parameter must not be null");
-        }
-        if (DatatypeConverter.converter == null) {
-            DatatypeConverter.converter = converter;
-        }
-    }
-
-    public static String parseString(String lexicalXSDString) {
-        return converter.parseString(lexicalXSDString);
-    }
-
-    public static BigInteger parseInteger(String lexicalXSDInteger) {
-        return converter.parseInteger(lexicalXSDInteger);
-    }
-
-    public static int parseInt(String lexicalXSDInt) {
-        return converter.parseInt(lexicalXSDInt);
-    }
-
-    public static long parseLong(String lexicalXSDLong) {
-        return converter.parseLong(lexicalXSDLong);
-    }
-
-    public static short parseShort(String lexicalXSDShort) {
-        return converter.parseShort(lexicalXSDShort);
-    }
-
-    public static BigDecimal parseDecimal(String lexicalXSDDecimal) {
-        return converter.parseDecimal(lexicalXSDDecimal);
-    }
-
-    public static float parseFloat(String lexicalXSDFloat) {
-        return converter.parseFloat(lexicalXSDFloat);
-    }
-
-    public static double parseDouble(String lexicalXSDDouble) {
-        return converter.parseDouble(lexicalXSDDouble);
-    }
-
-    public static boolean parseBoolean(String lexicalXSDBoolean) {
-        return converter.parseBoolean(lexicalXSDBoolean);
-    }
-
-    public static byte parseByte(String lexicalXSDByte) {
-        return converter.parseByte(lexicalXSDByte);
-    }
-
-    public static QName parseQName(String lexicalXSDQName, NamespaceContext nsc) {
-        return converter.parseQName(lexicalXSDQName, nsc);
-    }
-
-    public static Calendar parseDateTime(String lexicalXSDDateTime) {
-        return converter.parseDateTime(lexicalXSDDateTime);
-    }
-
-    public static byte[] parseBase64Binary(String lexicalXSDBase64Binary) {
-        return converter.parseBase64Binary(lexicalXSDBase64Binary);
-    }
-
-    public static byte[] parseHexBinary(String lexicalXSDHexBinary) {
-        return converter.parseHexBinary(lexicalXSDHexBinary);
-    }
-
-    public static long parseUnsignedInt(String lexicalXSDUnsignedInt) {
-        return converter.parseUnsignedInt(lexicalXSDUnsignedInt);
-    }
-
-    public static int parseUnsignedShort(String lexicalXSDUnsignedShort) {
-        return converter.parseUnsignedShort(lexicalXSDUnsignedShort);
-    }
-
-    public static Calendar parseTime(String lexicalXSDTime) {
-        return converter.parseTime(lexicalXSDTime);
-    }
-
-    public static Calendar parseDate(String lexicalXSDDate) {
-        return converter.parseDate(lexicalXSDDate);
-    }
-
-    public static String parseAnySimpleType(String lexicalXSDAnySimpleType) {
-        return converter.parseAnySimpleType(lexicalXSDAnySimpleType);
-    }
-
-    public static String printString(String val) {
-        return converter.printString(val);
-    }
-
-    public static String printInteger(BigInteger val) {
-        return converter.printInteger(val);
-    }
-
-    public static String printInt(int val) {
-        return converter.printInt(val);
-    }
-
-    public static String printLong(long val) {
-        return converter.printLong(val);
-    }
-
-    public static String printShort(short val) {
-        return converter.printShort(val);
-    }
-
-    public static String printDecimal(BigDecimal val) {
-        return converter.printDecimal(val);
-    }
-
-    public static String printFloat(float val) {
-        return converter.printFloat(val);
-    }
-
-    public static String printDouble(double val) {
-        return converter.printDouble(val);
-    }
-
-    public static String printBoolean(boolean val) {
-        return converter.printBoolean(val);
-    }
-
-    public static String printByte(byte val) {
-        return converter.printByte(val);
-    }
-
-    public static String printQName(QName val, NamespaceContext nsc) {
-        return converter.printQName(val, nsc);
-    }
-
-    public static String printDateTime(Calendar val) {
-        return converter.printDateTime(val);
-    }
-
-    public static String printBase64Binary(byte val[]) {
-        return converter.printBase64Binary(val);
-    }
-
-    public static String printHexBinary(byte val[]) {
-        return converter.printHexBinary(val);
-    }
-
-    public static String printUnsignedInt(long val) {
-        return converter.printUnsignedInt(val);
-    }
-
-    public static String printUnsignedShort(int val) {
-        return converter.printUnsignedShort(val);
-    }
-
-    public static String printTime(Calendar val) {
-        return converter.printTime(val);
-    }
-
-    public static String printDate(Calendar val) {
-        return converter.printDate(val);
-    }
-
-    public static String printAnySimpleType(String val) {
-        return converter.printAnySimpleType(val);
-    }
-
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/DatatypeConverterInterface.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/DatatypeConverterInterface.java
deleted file mode 100644
index d0a4a63..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/DatatypeConverterInterface.java
+++ /dev/null
@@ -1,104 +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 javax.xml.bind;
-
-import java.util.Calendar;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import javax.xml.namespace.QName;
-import javax.xml.namespace.NamespaceContext;
-
-public interface DatatypeConverterInterface {
-
-    String parseAnySimpleType(String lexicalXSDAnySimpleType);
-
-    byte[] parseBase64Binary(String lexicalXSDBase64Binary);
-
-    boolean parseBoolean(String lexicalXSDBoolean);
-
-    byte parseByte(String lexicalXSDByte);
-
-    Calendar parseDate(String lexicalXSDDate);
-
-    Calendar parseDateTime(String lexicalXSDDateTime);
-
-    BigDecimal parseDecimal(String lexicalXSDDecimal);
-
-    double parseDouble(String lexicalXSDDouble);
-
-    float parseFloat(String lexicalXSDFloat);
-
-    byte[] parseHexBinary(String lexicalXSDHexBinary);
-
-    int parseInt(String lexicalXSDInt);
-
-    BigInteger parseInteger(String lexicalXSDInteger);
-
-    long parseLong(String lexicalXSDLong);
-
-    QName parseQName(String lexicalXSDQName, NamespaceContext nsc);
-
-    short parseShort(String lexicalXSDShort);
-
-    String parseString(String lexicalXSDString);
-
-    Calendar parseTime(String lexicalXSDTime);
-
-    long parseUnsignedInt(String lexicalXSDUnsignedInt);
-
-    int parseUnsignedShort(String lexicalXSDUnsignedShort);
-
-    String printAnySimpleType(String val);
-
-    String printBase64Binary(byte[] val);
-
-    String printBoolean(boolean val);
-
-    String printByte(byte val);
-
-    String printDate(Calendar val);
-
-    String printDateTime(Calendar val);
-
-    String printDecimal(BigDecimal val);
-
-    String printDouble(double val);
-
-    String printFloat(float val);
-
-    String printHexBinary(byte[] val);
-
-    String printInt(int val);
-
-    String printInteger(BigInteger val);
-
-    String printLong(long val);
-
-    String printQName(QName val, NamespaceContext nsc);
-
-    String printShort(short val);
-
-    String printString(String val);
-
-    String printTime(Calendar val);
-
-    String printUnsignedInt(long val);
-
-    String printUnsignedShort(int val);
-
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/Element.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/Element.java
deleted file mode 100644
index 1d9d263..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/Element.java
+++ /dev/null
@@ -1,20 +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 javax.xml.bind;
-
-public interface Element {
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/JAXBContext.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/JAXBContext.java
deleted file mode 100644
index 849ba92..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/JAXBContext.java
+++ /dev/null
@@ -1,79 +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 javax.xml.bind;
-
-import java.io.IOException;
-
-import java.util.Map;
-import java.util.Collections;
-
-import org.w3c.dom.Node;
-
-public abstract class JAXBContext {
-
-    public static final String JAXB_CONTEXT_FACTORY = "javax.xml.bind.context.factory";
-
-    protected JAXBContext() {
-    }
-
-    public Binder<Node> createBinder() {
-        throw new UnsupportedOperationException();
-    }
-
-    public <T> Binder<T> createBinder(Class<T> domType) {
-        throw new UnsupportedOperationException();
-    }
-
-    public JAXBIntrospector createJAXBIntrospector() {
-        throw new UnsupportedOperationException();
-    }
-
-    public abstract Marshaller createMarshaller() throws JAXBException;
-
-    public abstract Unmarshaller createUnmarshaller() throws JAXBException;
-
-    public abstract Validator createValidator() throws JAXBException;
-
-    public void generateSchema(SchemaOutputResolver resolver) throws IOException {
-        throw new UnsupportedOperationException();
-    }
-
-    public static JAXBContext newInstance(Class... classesToBeBound) throws JAXBException {
-        return newInstance(classesToBeBound, Collections.<String, Object>emptyMap());
-    }
-
-    public static JAXBContext newInstance(Class[] classesToBeBound, Map<String, ?> properties) throws JAXBException {
-        for (Class cl : classesToBeBound) {
-            if (cl == null) {
-                throw new IllegalArgumentException();
-            }
-        }
-        return ContextFinder.find(classesToBeBound, properties);
-    }
-
-    public static JAXBContext newInstance(String contextPath) throws JAXBException {
-        return newInstance(contextPath, Thread.currentThread().getContextClassLoader());
-    }
-
-    public static JAXBContext newInstance(String contextPath, ClassLoader classLoader) throws JAXBException {
-        return newInstance(contextPath, classLoader, Collections.<String, Object>emptyMap());
-    }
-
-    public static JAXBContext newInstance(String contextPath, ClassLoader classLoader, Map<String, ?> properties) throws JAXBException {
-        return ContextFinder.find(contextPath, classLoader, properties);
-    }
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/JAXBElement.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/JAXBElement.java
deleted file mode 100644
index fdfcf2d..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/JAXBElement.java
+++ /dev/null
@@ -1,93 +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 javax.xml.bind;
-
-import java.io.Serializable;
-
-import javax.xml.namespace.QName;
-
-public class JAXBElement<T> implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    public final static class GlobalScope {
-    }
-
-    protected final QName name;
-    protected final Class<T> declaredType;
-    protected final Class scope;
-    protected T value;
-    protected boolean nil;
-
-    public JAXBElement(QName name, Class<T> declaredType, Class scope, T value) {
-        this.nil = false;
-        if (declaredType == null || name == null) {
-            throw new IllegalArgumentException();
-        }
-        this.declaredType = declaredType;
-        if (scope == null) {
-            scope = GlobalScope.class;
-        }
-        this.scope = scope;
-        this.name = name;
-        setValue(value);
-    }
-
-    public JAXBElement(QName name, Class<T> declaredType, T value) {
-        this(name, declaredType, GlobalScope.class, value);
-    }
-
-    public Class<T> getDeclaredType() {
-        return declaredType;
-    }
-
-    public QName getName() {
-        return name;
-    }
-
-    public void setValue(T value) {
-        this.value = value;
-    }
-
-    public T getValue() {
-        return value;
-    }
-
-    public Class getScope() {
-        return scope;
-    }
-
-    public boolean isNil() {
-        return value == null || nil;
-    }
-
-    public void setNil(boolean nil) {
-        this.nil = nil;
-    }
-
-    public boolean isGlobalScope() {
-        return scope == GlobalScope.class;
-    }
-
-    public boolean isTypeSubstituted() {
-        if (value == null) {
-            return false;
-        } else {
-            return value.getClass() != declaredType;
-        }
-    }
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/JAXBException.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/JAXBException.java
deleted file mode 100644
index 200837d..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/JAXBException.java
+++ /dev/null
@@ -1,87 +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 javax.xml.bind;
-
-import java.io.IOException;
-import java.io.PrintStream;
-import java.io.PrintWriter;
-
-public class JAXBException extends Exception {
-
-    private static final long serialVersionUID = 0x5dd94775L;
-
-    private String errorCode;
-    private Throwable linkedException;
-
-    public JAXBException(String message) {
-        this(message, null, null);
-    }
-
-    public JAXBException(String message, String errorCode) {
-        this(message, errorCode, null);
-    }
-
-    public JAXBException(String message, String errorCode, Throwable cause) {
-        super(message);
-        this.errorCode = errorCode;
-        this.linkedException = cause;
-    }
-
-    public JAXBException(String message, Throwable cause) {
-        this(message, null, cause);
-    }
-
-    public JAXBException(Throwable cause) {
-        this(null, null, cause);
-    }
-
-    public String getErrorCode() {
-        return errorCode;
-    }
-
-    public Throwable getLinkedException() {
-        return getCause();
-    }
-
-    public synchronized void setLinkedException(Throwable linkedException) {
-        this.linkedException = linkedException;
-    }
-
-    public String toString() {
-        return linkedException != null ?
-                super.toString() + "\n - with linked exception:\n[" + linkedException.toString() + "]" : 
-                super.toString();
-    }
-
-    @Override
-    public Throwable getCause() {
-        return linkedException;
-    }
-
-    public void printStackTrace() {
-        super.printStackTrace();
-    }
-
-    public void printStackTrace(PrintStream ps) {
-        super.printStackTrace(ps);
-    }
-
-    public void printStackTrace(PrintWriter pw) {
-        super.printStackTrace(pw);
-    }
-
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/JAXBIntrospector.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/JAXBIntrospector.java
deleted file mode 100644
index 29323b8..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/JAXBIntrospector.java
+++ /dev/null
@@ -1,34 +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 javax.xml.bind;
-
-import javax.xml.namespace.QName;
-
-public abstract class JAXBIntrospector {
-
-    public abstract QName getElementName(Object jaxbElement);
-
-    public static Object getValue(Object jaxbElement) {
-        if (jaxbElement instanceof JAXBElement) {
-            return ((JAXBElement) jaxbElement).getValue();
-        } else {
-            return jaxbElement;
-        }
-    }
-
-    public abstract boolean isElement(Object object);
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/MarshalException.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/MarshalException.java
deleted file mode 100644
index 3f6377b..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/MarshalException.java
+++ /dev/null
@@ -1,40 +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 javax.xml.bind;
-
-public class MarshalException extends JAXBException {
-
-    public MarshalException(String message) {
-        super(message);
-    }
-
-    public MarshalException(String message, String errorCode) {
-        super(message, errorCode);
-    }
-
-    public MarshalException(String message, String errorCode, Throwable cause) {
-        super(message, errorCode, cause);
-    }
-
-    public MarshalException(String message, Throwable cause) {
-        super(message, cause);
-    }
-
-    public MarshalException(Throwable cause) {
-        super(cause);
-    }
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/Marshaller.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/Marshaller.java
deleted file mode 100644
index fd3bc7b..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/Marshaller.java
+++ /dev/null
@@ -1,90 +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 javax.xml.bind;
-
-import java.io.OutputStream;
-import java.io.Writer;
-
-import javax.xml.bind.annotation.adapters.XmlAdapter;
-import javax.xml.bind.attachment.AttachmentMarshaller;
-import javax.xml.validation.Schema;
-import javax.xml.transform.Result;
-import javax.xml.stream.XMLEventWriter;
-import javax.xml.stream.XMLStreamWriter;
-
-import org.w3c.dom.Node;
-
-import org.xml.sax.ContentHandler;
-
-public interface Marshaller {
-
-    String JAXB_ENCODING = "jaxb.encoding";
-    String JAXB_FORMATTED_OUTPUT = "jaxb.formatted.output";
-    String JAXB_FRAGMENT = "jaxb.fragment";
-    String JAXB_NO_NAMESPACE_SCHEMA_LOCATION = "jaxb.noNamespaceSchemaLocation";
-    String JAXB_SCHEMA_LOCATION = "jaxb.schemaLocation";
-
-    abstract class Listener {
-        public void beforeMarshal(Object source) {
-        }
-        public void afterMarshal(Object source) {
-        }
-    }
-
-    <A extends XmlAdapter> A getAdapter(Class<A> type);
-
-    AttachmentMarshaller getAttachmentMarshaller();
-
-    ValidationEventHandler getEventHandler() throws JAXBException;
-
-    Listener getListener();
-
-    Node getNode(Object contentTree) throws JAXBException;
-
-    Object getProperty(String name) throws PropertyException;
-
-    Schema getSchema();
-
-    void marshal(Object jaxbElement, ContentHandler handler) throws JAXBException;
-
-    void marshal(Object jaxbElement, Node node) throws JAXBException;
-
-    void marshal(Object jaxbElement, OutputStream os) throws JAXBException;
-
-    void marshal(Object jaxbElement, Result result) throws JAXBException;
-
-    void marshal(Object jaxbElement, Writer writer) throws JAXBException;
-
-    void marshal(Object jaxbElement, XMLEventWriter writer) throws JAXBException;
-
-    void marshal(Object jaxbElement, XMLStreamWriter writer) throws JAXBException;
-
-    <A extends XmlAdapter> void setAdapter(Class<A> type, A adapter);
-
-    void setAdapter(XmlAdapter adapter);
-
-    void setAttachmentMarshaller(AttachmentMarshaller am);
-
-    void setEventHandler(ValidationEventHandler handler) throws JAXBException;
-
-    void setListener(Listener listener);
-
-    void setProperty(String name, Object value) throws PropertyException;
-
-    void setSchema(Schema schema);
-
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/NotIdentifiableEvent.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/NotIdentifiableEvent.java
deleted file mode 100644
index 7ab70c2..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/NotIdentifiableEvent.java
+++ /dev/null
@@ -1,20 +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 javax.xml.bind;
-
-public interface NotIdentifiableEvent extends ValidationEvent {
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/ParseConversionEvent.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/ParseConversionEvent.java
deleted file mode 100644
index fc16ae4..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/ParseConversionEvent.java
+++ /dev/null
@@ -1,20 +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 javax.xml.bind;
-
-public interface ParseConversionEvent extends ValidationEvent {
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/PrintConversionEvent.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/PrintConversionEvent.java
deleted file mode 100644
index 4a9f94f..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/PrintConversionEvent.java
+++ /dev/null
@@ -1,20 +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 javax.xml.bind;
-
-public interface PrintConversionEvent extends ValidationEvent {
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/PropertyException.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/PropertyException.java
deleted file mode 100644
index 23bc367..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/PropertyException.java
+++ /dev/null
@@ -1,45 +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 javax.xml.bind;
-
-public class PropertyException extends JAXBException {
-
-    public PropertyException(String message) {
-        super(message);
-    }
-
-    public PropertyException(String message, String errorCode) {
-        super(message, errorCode);
-    }
-
-    public PropertyException(Throwable cause) {
-        super(cause);
-    }
-
-    public PropertyException(String message, Throwable cause) {
-        super(message, cause);
-    }
-
-    public PropertyException(String message, String errorCode, Throwable cause) {
-        super(message, errorCode, cause);
-    }
-
-    public PropertyException(String name, Object value) {
-        super("name: " + name + ", value: " + value);
-    }
-
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/SchemaOutputResolver.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/SchemaOutputResolver.java
deleted file mode 100644
index d74e563..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/SchemaOutputResolver.java
+++ /dev/null
@@ -1,26 +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 javax.xml.bind;
-
-import java.io.IOException;
-
-import javax.xml.transform.Result;
-
-public abstract class SchemaOutputResolver {
-
-    public abstract Result createOutput(String namespaceUri, String suggestedFileName) throws IOException;
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/TypeConstraintException.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/TypeConstraintException.java
deleted file mode 100644
index 8713b4b..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/TypeConstraintException.java
+++ /dev/null
@@ -1,74 +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 javax.xml.bind;
-
-import java.io.PrintStream;
-
-public class TypeConstraintException extends RuntimeException {
-
-    private String errorCode;
-    private Throwable linkedException;
-
-    public TypeConstraintException(String message) {
-        this(message, null, null);
-    }
-
-    public TypeConstraintException(String message, String errorCode) {
-        this(message, errorCode, null);
-    }
-
-    public TypeConstraintException(String message, String errorCode, Throwable cause) {
-        super(message);
-        this.errorCode = errorCode;
-        this.linkedException = cause;
-    }
-
-    public TypeConstraintException(String message, Throwable cause) {
-        this(message, null, cause);
-    }
-
-    public TypeConstraintException(Throwable cause) {
-        this(null, null, cause);
-    }
-
-    public String getErrorCode() {
-        return errorCode;
-    }
-
-    public Throwable getLinkedException() {
-        return getCause();
-    }
-
-    public synchronized void setLinkedException(Throwable linkedException) {
-        this.linkedException = linkedException;
-    }
-
-    public String toString() {
-        return linkedException != null ?
-                super.toString() + "\n - with linked exception:\n[" + linkedException.toString() + "]" :
-                super.toString();
-    }
-
-    public void printStackTrace() {
-        super.printStackTrace();
-    }
-
-    public void printStackTrace(PrintStream ps) {
-        super.printStackTrace(ps);
-    }
-
-}
\ No newline at end of file
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/UnmarshalException.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/UnmarshalException.java
deleted file mode 100644
index d17cdb1..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/UnmarshalException.java
+++ /dev/null
@@ -1,40 +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 javax.xml.bind;
-
-public class UnmarshalException extends JAXBException {
-
-    public UnmarshalException(String message) {
-        super(message);
-    }
-
-    public UnmarshalException(String message, String errorCode) {
-        super(message, errorCode);
-    }
-
-    public UnmarshalException(String message, String errorCode, Throwable cause) {
-        super(message, errorCode, cause);
-    }
-
-    public UnmarshalException(String message, Throwable cause) {
-        super(message, cause);
-    }
-
-    public UnmarshalException(Throwable cause) {
-        super(cause);
-    }
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/Unmarshaller.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/Unmarshaller.java
deleted file mode 100644
index 40a774a..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/Unmarshaller.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 javax.xml.bind;
-
-import java.io.File;
-import java.io.InputStream;
-import java.io.Reader;
-import java.net.URL;
-
-import javax.xml.bind.annotation.adapters.XmlAdapter;
-import javax.xml.bind.attachment.AttachmentUnmarshaller;
-import javax.xml.validation.Schema;
-import javax.xml.transform.Source;
-import javax.xml.stream.XMLEventReader;
-import javax.xml.stream.XMLStreamReader;
-
-import org.w3c.dom.Node;
-
-import org.xml.sax.InputSource;
-
-public interface Unmarshaller {
-
-    abstract class Listener {
-        public void beforeUnmarshal(Object target, Object parent) {
-        }
-        public void afterUnmarshal(Object target, Object parent) {
-        }
-    }
-
-    <A extends XmlAdapter> A getAdapter(Class<A> type);
-
-    AttachmentUnmarshaller getAttachmentUnmarshaller();
-
-    ValidationEventHandler getEventHandler() throws JAXBException;
-
-    Listener getListener();
-
-    Object getProperty(String name) throws PropertyException;
-
-    Schema getSchema();
-
-    UnmarshallerHandler getUnmarshallerHandler();
-
-    boolean isValidating() throws JAXBException;
-
-    <A extends XmlAdapter> void setAdapter(Class<A> type, A adapter);
-
-    void setAdapter(XmlAdapter adapter);
-
-    void setAttachmentUnmarshaller(AttachmentUnmarshaller au);
-
-    void setEventHandler(ValidationEventHandler handler) throws JAXBException;
-
-    void setListener(Listener listener);
-
-    void setProperty(String name, Object value) throws PropertyException;
-
-    void setSchema(Schema schema);
-
-    void setValidating(boolean validating) throws JAXBException;
-
-    Object unmarshal(File f) throws JAXBException;
-
-    Object unmarshal(InputSource source) throws JAXBException;
-
-    Object unmarshal(InputStream is) throws JAXBException;
-
-    Object unmarshal(Node node) throws JAXBException;
-
-    <T> JAXBElement<T> unmarshal(Node node, Class<T> declaredType) throws JAXBException;
-
-    Object unmarshal(Reader reader) throws JAXBException;
-
-    Object unmarshal(Source source) throws JAXBException;
-
-    <T> JAXBElement<T> unmarshal(Source source, Class<T> declaredType) throws JAXBException;
-
-    Object unmarshal(URL url) throws JAXBException;
-
-    Object unmarshal(XMLEventReader reader) throws JAXBException;
-
-    <T> JAXBElement<T> unmarshal(XMLEventReader reader, Class<T> declaredType) throws JAXBException;
-
-    Object unmarshal(XMLStreamReader reader) throws JAXBException;
-
-    <T> JAXBElement<T> unmarshal(XMLStreamReader reader, Class<T> declaredType) throws JAXBException;
-
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/UnmarshallerHandler.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/UnmarshallerHandler.java
deleted file mode 100644
index b4bb32b..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/UnmarshallerHandler.java
+++ /dev/null
@@ -1,25 +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 javax.xml.bind;
-
-import org.xml.sax.ContentHandler;
-
-public interface UnmarshallerHandler extends ContentHandler {
-
-    Object getResult() throws JAXBException, IllegalStateException;
-
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/ValidationEvent.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/ValidationEvent.java
deleted file mode 100644
index 64646df..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/ValidationEvent.java
+++ /dev/null
@@ -1,33 +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 javax.xml.bind;
-
-public interface ValidationEvent {
-
-    int ERROR = 1;
-    int FATAL_ERROR = 2;
-    int WARNING = 0;
-
-    Throwable getLinkedException();
-
-    ValidationEventLocator getLocator();
-
-    String getMessage();
-
-    int getSeverity();
-
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/ValidationEventHandler.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/ValidationEventHandler.java
deleted file mode 100644
index 36a8388..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/ValidationEventHandler.java
+++ /dev/null
@@ -1,22 +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 javax.xml.bind;
-
-public interface ValidationEventHandler {
-
-    boolean handleEvent(ValidationEvent event);
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/ValidationEventLocator.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/ValidationEventLocator.java
deleted file mode 100644
index a5fd082..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/ValidationEventLocator.java
+++ /dev/null
@@ -1,36 +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 javax.xml.bind;
-
-import java.net.URL;
-
-import org.w3c.dom.Node;
-
-public interface ValidationEventLocator {
-
-    int getColumnNumber();
-
-    int getLineNumber();
-
-    Node getNode();
-
-    Object getObject();
-
-    int getOffset();
-
-    URL getURL();
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/ValidationException.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/ValidationException.java
deleted file mode 100644
index 78b1a2b..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/ValidationException.java
+++ /dev/null
@@ -1,40 +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 javax.xml.bind;
-
-public class ValidationException extends JAXBException {
-
-    public ValidationException(String message) {
-        super(message);
-    }
-
-    public ValidationException(String message, String errorCode) {
-        super(message, errorCode);
-    }
-
-    public ValidationException(String message, String errorCode, Throwable cause) {
-        super(message, errorCode, cause);
-    }
-
-    public ValidationException(String message, Throwable cause) {
-        super(message, cause);
-    }
-
-    public ValidationException(Throwable cause) {
-        super(cause);
-    }
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/Validator.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/Validator.java
deleted file mode 100644
index 94790bb..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/Validator.java
+++ /dev/null
@@ -1,33 +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 javax.xml.bind;
-
-public interface Validator {
-
-    ValidationEventHandler getEventHandler() throws JAXBException;
-
-    Object getProperty(String name) throws PropertyException;
-
-    void setEventHandler(ValidationEventHandler handler) throws JAXBException;
-
-    void setProperty(String name, Object value) throws PropertyException;
-
-    boolean validate(Object subRoot) throws JAXBException;
-
-    boolean validateRoot(Object rootObj) throws JAXBException;
-
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/DomHandler.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/DomHandler.java
deleted file mode 100644
index e5fbf90..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/DomHandler.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 javax.xml.bind.annotation;
-
-import javax.xml.transform.Result;
-import javax.xml.transform.Source;
-import javax.xml.bind.ValidationEventHandler;
-
-public interface DomHandler<ElementT, ResultT extends Result> {
-
-    ResultT createUnmarshaller(ValidationEventHandler errorHandler);
-
-    ElementT getElement(ResultT rt);
-
-    Source marshal(ElementT n, ValidationEventHandler errorHandler);
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/W3CDomHandler.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/W3CDomHandler.java
deleted file mode 100644
index 2794e14..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/W3CDomHandler.java
+++ /dev/null
@@ -1,78 +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 javax.xml.bind.annotation;
-
-import javax.xml.transform.dom.DOMResult;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.Source;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.bind.ValidationEventHandler;
-
-import org.w3c.dom.Element;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.DocumentFragment;
-
-public class W3CDomHandler implements DomHandler<Element, DOMResult> {
-
-    private DocumentBuilder builder;
-
-    public W3CDomHandler() {
-    }
-
-    public W3CDomHandler(DocumentBuilder builder) {
-        if (builder == null) {
-            throw new IllegalArgumentException();
-        }
-        this.builder = builder;
-    }
-
-    public DOMResult createUnmarshaller(ValidationEventHandler errorHandler) {
-        if (builder == null) {
-            return new DOMResult();
-        } else {
-            return new DOMResult(builder.newDocument());
-        }
-    }
-
-    public DocumentBuilder getBuilder() {
-        return builder;
-    }
-
-    public Element getElement(DOMResult rt) {
-        Node n = rt.getNode();
-        if (n instanceof Document) {
-            return ((Document)n).getDocumentElement();
-        }
-        if (n instanceof Element) {
-            return (Element)n;
-        }
-        if (n instanceof DocumentFragment) {
-            return (Element)n.getChildNodes().item(0);
-        } else {
-            throw new IllegalStateException(n.toString());
-        }
-    }
-
-    public Source marshal(Element n, ValidationEventHandler errorHandler) {
-        return new DOMSource(n);
-    }
-
-    public void setBuilder(DocumentBuilder builder) {
-        this.builder = builder;
-    }
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlAccessOrder.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlAccessOrder.java
deleted file mode 100644
index 45d6bc0..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlAccessOrder.java
+++ /dev/null
@@ -1,24 +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 javax.xml.bind.annotation;
-
-public enum XmlAccessOrder {
-
-    ALPHABETICAL,
-    UNDEFINED
-    
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlAccessType.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlAccessType.java
deleted file mode 100644
index a34a650..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlAccessType.java
+++ /dev/null
@@ -1,27 +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 javax.xml.bind.annotation;
-
-public enum XmlAccessType {
-
-    FIELD,
-    NONE,
-    PROPERTY,
-    PUBLIC_MEMBER
-    
-
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlAccessorOrder.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlAccessorOrder.java
deleted file mode 100644
index d800634..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlAccessorOrder.java
+++ /dev/null
@@ -1,31 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Inherited
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.PACKAGE, ElementType.TYPE})
-public @interface XmlAccessorOrder {
-
-    XmlAccessOrder value() default XmlAccessOrder.UNDEFINED;
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlAccessorType.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlAccessorType.java
deleted file mode 100644
index 6662588..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlAccessorType.java
+++ /dev/null
@@ -1,31 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Inherited
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value  = {ElementType.PACKAGE, ElementType.TYPE })
-public @interface XmlAccessorType {
-
-    XmlAccessType value() default XmlAccessType.PUBLIC_MEMBER;
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlAnyAttribute.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlAnyAttribute.java
deleted file mode 100644
index 41ab490..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlAnyAttribute.java
+++ /dev/null
@@ -1,27 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value  = {ElementType.FIELD, ElementType.METHOD })
-public @interface XmlAnyAttribute {
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlAnyElement.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlAnyElement.java
deleted file mode 100644
index 3828a9e..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlAnyElement.java
+++ /dev/null
@@ -1,31 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value  = {ElementType.FIELD, ElementType.METHOD })
-public @interface XmlAnyElement {
-
-    boolean lax() default false;
-
-    Class<? extends DomHandler> value() default W3CDomHandler.class;
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlAttachmentRef.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlAttachmentRef.java
deleted file mode 100644
index 23bd034..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlAttachmentRef.java
+++ /dev/null
@@ -1,27 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value  = {ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER })
-public @interface XmlAttachmentRef {
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlAttribute.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlAttribute.java
deleted file mode 100644
index ed2fb7c..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlAttribute.java
+++ /dev/null
@@ -1,33 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value  = {ElementType.FIELD, ElementType.METHOD })
-public @interface XmlAttribute {
-
-    String name() default "##default";
-
-    boolean required() default false;
-
-    String namespace() default "##default";
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlElement.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlElement.java
deleted file mode 100644
index e45cbad..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlElement.java
+++ /dev/null
@@ -1,42 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value  = {ElementType.FIELD, ElementType.METHOD })
-public @interface XmlElement {
-
-    final class DEFAULT {
-    }
-
-    String name() default "##default";
-
-    boolean nillable() default false;
-
-    boolean required() default false;
-
-    String namespace() default "##default";
-
-    String defaultValue() default "\u0000";
-
-    Class type() default DEFAULT.class;
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlElementDecl.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlElementDecl.java
deleted file mode 100644
index 79d60a1..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlElementDecl.java
+++ /dev/null
@@ -1,42 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.METHOD)
-public @interface XmlElementDecl {
-
-    final class GLOBAL {
-    }
-
-    String name();
-
-    Class scope() default GLOBAL.class;
-
-    String namespace() default "##default";
-
-    String substitutionHeadNamespace() default "##default";
-
-    String substitutionHeadName() default "";
-
-    String defaultValue() default "\u0000";
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlElementRef.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlElementRef.java
deleted file mode 100644
index ffdde6d..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlElementRef.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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.FIELD, ElementType.METHOD})
-public @interface XmlElementRef {
-
-    final class DEFAULT {
-    }
-
-    String name() default "##default";
-
-    String namespace() default "";
-
-    Class type() default DEFAULT.class;
-
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlElementRefs.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlElementRefs.java
deleted file mode 100644
index 2e56e41..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlElementRefs.java
+++ /dev/null
@@ -1,29 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.FIELD, ElementType.METHOD})
-public @interface XmlElementRefs {
-
-    XmlElementRef[] value();
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlElementWrapper.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlElementWrapper.java
deleted file mode 100644
index d8940a8..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlElementWrapper.java
+++ /dev/null
@@ -1,33 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.FIELD, ElementType.METHOD})
-public @interface XmlElementWrapper {
-
-    String name() default "##default";
-
-    String namespace() default "##default";
-
-    boolean nillable() default false;
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlElements.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlElements.java
deleted file mode 100644
index f213cb6..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlElements.java
+++ /dev/null
@@ -1,29 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.FIELD, ElementType.METHOD})
-public @interface XmlElements {
-
-    XmlElement[] value();
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlEnum.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlEnum.java
deleted file mode 100644
index 6700a99..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlEnum.java
+++ /dev/null
@@ -1,29 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
-public @interface XmlEnum {
-
-    Class<?> value() default String.class;
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlEnumValue.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlEnumValue.java
deleted file mode 100644
index 62a97eb..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlEnumValue.java
+++ /dev/null
@@ -1,29 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.FIELD)
-public @interface XmlEnumValue {
-
-    String value();
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlID.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlID.java
deleted file mode 100644
index 8a5bfdb..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlID.java
+++ /dev/null
@@ -1,27 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.FIELD, ElementType.METHOD})
-public @interface XmlID {
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlIDREF.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlIDREF.java
deleted file mode 100644
index 3cd2c98..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlIDREF.java
+++ /dev/null
@@ -1,27 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.FIELD, ElementType.METHOD})
-public @interface XmlIDREF {
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlInlineBinaryData.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlInlineBinaryData.java
deleted file mode 100644
index ded1639..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlInlineBinaryData.java
+++ /dev/null
@@ -1,27 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
-public @interface XmlInlineBinaryData {
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlList.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlList.java
deleted file mode 100644
index d28b510..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlList.java
+++ /dev/null
@@ -1,28 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
-public @interface XmlList {
-
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlMimeType.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlMimeType.java
deleted file mode 100644
index f7f8ec3..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlMimeType.java
+++ /dev/null
@@ -1,29 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
-public @interface XmlMimeType {
-
-    String value();
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlMixed.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlMixed.java
deleted file mode 100644
index ac052fe..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlMixed.java
+++ /dev/null
@@ -1,27 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.FIELD, ElementType.METHOD})
-public @interface XmlMixed {
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlNs.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlNs.java
deleted file mode 100644
index c43f6f9..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlNs.java
+++ /dev/null
@@ -1,31 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {})
-public @interface XmlNs {
-
-    String namespaceURI();
-
-    String prefix();
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlNsForm.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlNsForm.java
deleted file mode 100644
index 60e93f9..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlNsForm.java
+++ /dev/null
@@ -1,25 +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 javax.xml.bind.annotation;
-
-public enum XmlNsForm {
-
-    UNQUALIFIED,
-    QUALIFIED,
-    UNSET
-    
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlRegistry.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlRegistry.java
deleted file mode 100644
index 06733ec..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlRegistry.java
+++ /dev/null
@@ -1,27 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
-public @interface XmlRegistry {
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlRootElement.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlRootElement.java
deleted file mode 100644
index 981043d..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlRootElement.java
+++ /dev/null
@@ -1,31 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
-public @interface XmlRootElement {
-
-    String name() default "##default";
-
-    String namespace() default "##default";
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlSchema.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlSchema.java
deleted file mode 100644
index e316a21..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlSchema.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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.PACKAGE)
-public @interface XmlSchema {
-
-    XmlNsForm attributeFormDefault() default XmlNsForm.UNSET;
-
-    XmlNsForm elementFormDefault() default XmlNsForm.UNSET;
-
-    String namespace() default "";
-
-    XmlNs[] xmlns() default {};
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlSchemaType.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlSchemaType.java
deleted file mode 100644
index 0ab565a..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlSchemaType.java
+++ /dev/null
@@ -1,36 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.FIELD, ElementType.METHOD, ElementType.PACKAGE})
-public @interface XmlSchemaType {
-
-    final class DEFAULT {
-    }
-
-    String name();
-
-    String namespace() default "http://www.w3.org/2001/XMLSchema";
-
-    Class type() default DEFAULT.class;
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlSchemaTypes.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlSchemaTypes.java
deleted file mode 100644
index 0dc20e1..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlSchemaTypes.java
+++ /dev/null
@@ -1,29 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.PACKAGE)
-public @interface XmlSchemaTypes {
-
-    XmlSchemaType[] value();
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlTransient.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlTransient.java
deleted file mode 100644
index 8e95ba2..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlTransient.java
+++ /dev/null
@@ -1,27 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.FIELD, ElementType.METHOD})
-public @interface XmlTransient {
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlType.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlType.java
deleted file mode 100644
index 596fc96..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlType.java
+++ /dev/null
@@ -1,40 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
-public @interface XmlType {
-
-    final class DEFAULT {
-    }
-
-    Class factoryClass() default DEFAULT.class;
-
-    String factoryMethod() default "";
-
-    String name() default "##default";
-
-    String namespace() default "##default";
-
-    String[] propOrder() default "";
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlValue.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlValue.java
deleted file mode 100644
index ee9a41d..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/XmlValue.java
+++ /dev/null
@@ -1,27 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.FIELD, ElementType.METHOD})
-public @interface XmlValue {
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/adapters/CollapsedStringAdapter.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/adapters/CollapsedStringAdapter.java
deleted file mode 100644
index 4266ab6..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/adapters/CollapsedStringAdapter.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 javax.xml.bind.annotation.adapters;
-
-public class CollapsedStringAdapter extends XmlAdapter<String, String> {
-
-    public String marshal(String v) {
-        return v;
-    }
-
-    public String unmarshal(String v) {
-        if(v == null) {
-            return null;
-        }
-        int len = v.length();
-        int s;
-        for (s = 0; s < len && !isWhiteSpace(v.charAt(s)); s++);
-        if (s == len) {
-            return v;
-        }
-        StringBuffer result = new StringBuffer(len);
-        if (s != 0) {
-            for(int i = 0; i < s; i++) {
-                result.append(v.charAt(i));
-            }
-            result.append(' ');
-        }
-        boolean inStripMode = true;
-        for (int i = s + 1; i < len; i++) {
-            char ch = v.charAt(i);
-            boolean b = isWhiteSpace(ch);
-            if (inStripMode && b) {
-                continue;
-            }
-            inStripMode = b;
-            result.append(inStripMode ? ' ' : ch);
-        }
-        len = result.length();
-        if (len > 0 && result.charAt(len - 1) == ' ') {
-            result.setLength(len - 1);
-        }
-        return result.toString();
-    }
-
-    protected static boolean isWhiteSpace(char ch) {
-        if (ch > ' ') {
-            return false;
-        } else {
-            return ch == '\t' || ch == '\n' || ch == '\r' || ch == ' ';
-        }
-    }
-
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/adapters/HexBinaryAdapter.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/adapters/HexBinaryAdapter.java
deleted file mode 100644
index a3359f1..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/adapters/HexBinaryAdapter.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 javax.xml.bind.annotation.adapters;
-
-import javax.xml.bind.DatatypeConverter;
-
-public final class HexBinaryAdapter extends XmlAdapter<String, byte[]> {
-
-    public String marshal(byte[] v) {
-        return DatatypeConverter.printHexBinary(v);
-    }
-
-    public byte[] unmarshal(String v) {
-        return DatatypeConverter.parseHexBinary(v);
-    }
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/adapters/NormalizedStringAdapter.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/adapters/NormalizedStringAdapter.java
deleted file mode 100644
index f0071e9..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/adapters/NormalizedStringAdapter.java
+++ /dev/null
@@ -1,52 +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 javax.xml.bind.annotation.adapters;
-
-public final class NormalizedStringAdapter extends XmlAdapter<String, String> {
-
-    public String marshal(String v) {
-        return v;
-    }
-
-    public String unmarshal(String v) {
-        if (v == null) {
-            return null;
-        }
-        int i;
-        for (i = v.length() - 1; i >= 0 && !isWhiteSpaceExceptSpace(v.charAt(i)); i--);
-        if (i < 0) {
-            return v;
-        }
-        char buf[] = v.toCharArray();
-        buf[i--] = ' ';
-        for(; i >= 0; i--) {
-            if(isWhiteSpaceExceptSpace(buf[i])) {
-                buf[i] = ' ';
-            }
-        }
-        return new String(buf);
-    }
-
-    protected static boolean isWhiteSpaceExceptSpace(char ch) {
-        if (ch >= ' ') {
-            return false;
-        } else {
-            return ch == '\t' || ch == '\n' || ch == '\r';
-        }
-    }
-
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/adapters/XmlAdapter.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/adapters/XmlAdapter.java
deleted file mode 100644
index 0a1c2fe..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/adapters/XmlAdapter.java
+++ /dev/null
@@ -1,27 +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 javax.xml.bind.annotation.adapters;
-
-public abstract class XmlAdapter<ValueType, BoundType> {
-
-    protected XmlAdapter() {
-    }
-
-    public abstract ValueType marshal(BoundType v) throws Exception;
-
-    public abstract BoundType unmarshal(ValueType v) throws Exception;
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/adapters/XmlJavaTypeAdapter.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/adapters/XmlJavaTypeAdapter.java
deleted file mode 100644
index cb8e530..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/adapters/XmlJavaTypeAdapter.java
+++ /dev/null
@@ -1,34 +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 javax.xml.bind.annotation.adapters;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.PACKAGE, ElementType.FIELD, ElementType.METHOD, ElementType.TYPE, ElementType.PARAMETER})
-public @interface XmlJavaTypeAdapter {
-
-    final class DEFAULT {
-    }
-
-    Class<? extends XmlAdapter> value();
-
-    Class type() default DEFAULT.class;
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/adapters/XmlJavaTypeAdapters.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/adapters/XmlJavaTypeAdapters.java
deleted file mode 100644
index a3c85ce..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/annotation/adapters/XmlJavaTypeAdapters.java
+++ /dev/null
@@ -1,29 +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 javax.xml.bind.annotation.adapters;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.PACKAGE})
-public @interface XmlJavaTypeAdapters {
-
-    XmlJavaTypeAdapter[] value();
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/attachment/AttachmentMarshaller.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/attachment/AttachmentMarshaller.java
deleted file mode 100644
index 6a768b3..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/attachment/AttachmentMarshaller.java
+++ /dev/null
@@ -1,32 +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 javax.xml.bind.attachment;
-
-import javax.activation.DataHandler;
-
-public abstract class AttachmentMarshaller {
-
-    public abstract String addMtomAttachment(byte[] data, int offset, int length, String mimeType, String elementNamespace, String elementLocalName);
-
-    public abstract String addMtomAttachment(DataHandler data, String elementNamespace, String elementLocalName);
-
-    public abstract String addSwaRefAttachment(DataHandler data);
-
-    public boolean isXOPPackage() {
-        return false;
-    }
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/attachment/AttachmentUnmarshaller.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/attachment/AttachmentUnmarshaller.java
deleted file mode 100644
index d67426b..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/attachment/AttachmentUnmarshaller.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 javax.xml.bind.attachment;
-
-import javax.activation.DataHandler;
-
-public abstract class AttachmentUnmarshaller {
-
-    public abstract byte[] getAttachmentAsByteArray(String cid);
-
-    public abstract DataHandler getAttachmentAsDataHandler(String cid);
-
-    public boolean isXOPPackage() {
-        return false;
-    }
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/helpers/AbstractMarshallerImpl.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/helpers/AbstractMarshallerImpl.java
deleted file mode 100644
index 7378cdc..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/helpers/AbstractMarshallerImpl.java
+++ /dev/null
@@ -1,284 +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 javax.xml.bind.helpers;
-
-import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
-import java.io.Writer;
-
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Marshaller;
-import javax.xml.bind.PropertyException;
-import javax.xml.bind.ValidationEventHandler;
-import javax.xml.bind.annotation.adapters.XmlAdapter;
-import javax.xml.bind.attachment.AttachmentMarshaller;
-import javax.xml.stream.XMLEventWriter;
-import javax.xml.stream.XMLStreamWriter;
-import javax.xml.transform.dom.DOMResult;
-import javax.xml.transform.sax.SAXResult;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.Result;
-import javax.xml.validation.Schema;
-
-import org.w3c.dom.Node;
-
-import org.xml.sax.ContentHandler;
-
-public abstract class AbstractMarshallerImpl implements Marshaller {
-
-    static String aliases[] = {
-            "UTF-8", "UTF8",
-            "UTF-16", "Unicode",
-            "UTF-16BE", "UnicodeBigUnmarked",
-            "UTF-16LE", "UnicodeLittleUnmarked",
-            "US-ASCII", "ASCII",
-            "TIS-620", "TIS620",
-            "ISO-10646-UCS-2", "Unicode",
-            "EBCDIC-CP-US", "cp037",
-            "EBCDIC-CP-CA", "cp037",
-            "EBCDIC-CP-NL", "cp037",
-            "EBCDIC-CP-WT", "cp037",
-            "EBCDIC-CP-DK", "cp277",
-            "EBCDIC-CP-NO", "cp277",
-            "EBCDIC-CP-FI", "cp278",
-            "EBCDIC-CP-SE", "cp278",
-            "EBCDIC-CP-IT", "cp280",
-            "EBCDIC-CP-ES", "cp284",
-            "EBCDIC-CP-GB", "cp285",
-            "EBCDIC-CP-FR", "cp297",
-            "EBCDIC-CP-AR1", "cp420",
-            "EBCDIC-CP-HE", "cp424",
-            "EBCDIC-CP-BE", "cp500",
-            "EBCDIC-CP-CH", "cp500",
-            "EBCDIC-CP-ROECE", "cp870",
-            "EBCDIC-CP-YU", "cp870",
-            "EBCDIC-CP-IS", "cp871",
-            "EBCDIC-CP-AR2", "cp918"
-    };
-
-    private ValidationEventHandler eventHandler = new DefaultValidationEventHandler();
-    private String encoding = "UTF-8";
-    private String schemaLocation;
-    private String noNSSchemaLocation;
-    private boolean formattedOutput;
-    private boolean fragment;
-
-    public final void marshal(Object obj, OutputStream os) throws JAXBException {
-        checkNotNull(obj, "obj", os, "os");
-        marshal(obj, new StreamResult(os));
-    }
-
-    public final void marshal(Object obj, Writer w) throws JAXBException {
-        checkNotNull(obj, "obj", w, "writer");
-        marshal(obj, new StreamResult(w));
-    }
-
-    public final void marshal(Object obj, ContentHandler handler) throws JAXBException {
-        checkNotNull(obj, "obj", handler, "handler");
-        marshal(obj, new SAXResult(handler));
-    }
-
-    public final void marshal(Object obj, Node node) throws JAXBException {
-        checkNotNull(obj, "obj", node, "node");
-        marshal(obj, new DOMResult(node));
-    }
-
-    public Node getNode(Object obj) throws JAXBException {
-        checkNotNull(obj, "obj", "foo", "bar");
-        throw new UnsupportedOperationException();
-    }
-
-    protected String getEncoding() {
-        return encoding;
-    }
-
-    protected void setEncoding(String encoding) {
-        this.encoding = encoding;
-    }
-
-    protected String getSchemaLocation() {
-        return schemaLocation;
-    }
-
-    protected void setSchemaLocation(String location) {
-        schemaLocation = location;
-    }
-
-    protected String getNoNSSchemaLocation() {
-        return noNSSchemaLocation;
-    }
-
-    protected void setNoNSSchemaLocation(String location) {
-        noNSSchemaLocation = location;
-    }
-
-    protected boolean isFormattedOutput() {
-        return formattedOutput;
-    }
-
-    protected void setFormattedOutput(boolean v) {
-        formattedOutput = v;
-    }
-
-    protected boolean isFragment() {
-        return fragment;
-    }
-
-    protected void setFragment(boolean v) {
-        fragment = v;
-    }
-
-    protected String getJavaEncoding(String encoding) throws UnsupportedEncodingException {
-        try {
-            "dummy".getBytes(encoding);
-            return encoding;
-        }
-        catch (UnsupportedEncodingException e) {
-        }
-        for (int i = 0; i < aliases.length; i += 2) {
-            if (encoding.equals(aliases[i])) {
-                "dummy".getBytes(aliases[i + 1]);
-                return aliases[i + 1];
-            }
-        }
-        throw new UnsupportedEncodingException(encoding);
-    }
-
-    public void setProperty(String name, Object value) throws PropertyException {
-        if (name == null) {
-            throw new IllegalArgumentException("name must not be null");
-        }
-        if (JAXB_ENCODING.equals(name)) {
-            checkString(name, value);
-            setEncoding((String) value);
-        } else if (JAXB_FORMATTED_OUTPUT.equals(name)) {
-            checkBoolean(name, value);
-            setFormattedOutput(((Boolean) value).booleanValue());
-        } else if (JAXB_NO_NAMESPACE_SCHEMA_LOCATION.equals(name)) {
-            checkString(name, value);
-            setNoNSSchemaLocation((String) value);
-        } else if (JAXB_SCHEMA_LOCATION.equals(name)) {
-            checkString(name, value);
-            setSchemaLocation((String) value);
-        } else if (JAXB_FRAGMENT.equals(name)) {
-            checkBoolean(name, value);
-            setFragment(((Boolean) value).booleanValue());
-        } else {
-            throw new PropertyException(name, value);
-        }
-    }
-
-    public Object getProperty(String name) throws PropertyException {
-        if (name == null) {
-            throw new IllegalArgumentException("name must not be null");
-        }
-        if (JAXB_ENCODING.equals(name)) {
-            return getEncoding();
-        } else if (JAXB_FORMATTED_OUTPUT.equals(name)) {
-            return isFormattedOutput() ? Boolean.TRUE : Boolean.FALSE;
-        } else if (JAXB_NO_NAMESPACE_SCHEMA_LOCATION.equals(name)) {
-            return getNoNSSchemaLocation();
-        } else if (JAXB_SCHEMA_LOCATION.equals(name)) {
-            return getSchemaLocation();
-        } else if (JAXB_FRAGMENT.equals(name)) {
-            return isFragment() ? Boolean.TRUE : Boolean.FALSE;
-        } else {
-            throw new PropertyException(name);
-        }
-    }
-
-    public ValidationEventHandler getEventHandler() throws JAXBException {
-        return eventHandler;
-    }
-
-    public void setEventHandler(ValidationEventHandler handler) throws JAXBException {
-        if (handler == null) {
-            eventHandler = new DefaultValidationEventHandler();
-        } else {
-            eventHandler = handler;
-        }
-    }
-
-    private void checkBoolean(String name, Object value) throws PropertyException {
-        if (!(value instanceof Boolean)) {
-            throw new PropertyException(name + " must be a boolean");
-        }
-    }
-
-    private void checkString(String name, Object value) throws PropertyException {
-        if (!(value instanceof String)) {
-            throw new PropertyException(name + " must be a string");
-        }
-    }
-
-    private void checkNotNull(Object o1, String o1Name, Object o2, String o2Name) {
-        if (o1 == null) {
-            throw new IllegalArgumentException(o1Name + " must not be null");
-        }
-        if (o2 == null) {
-            throw new IllegalArgumentException(o2Name + " must not be null");
-        }
-    }
-
-    public void marshal(Object obj, XMLEventWriter writer)
-            throws JAXBException {
-        throw new UnsupportedOperationException();
-    }
-
-    public void marshal(Object obj, XMLStreamWriter writer) throws JAXBException {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setSchema(Schema schema) {
-        throw new UnsupportedOperationException();
-    }
-
-    public Schema getSchema() {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setAdapter(XmlAdapter adapter) {
-        if (adapter == null) {
-            throw new IllegalArgumentException();
-        }
-        setAdapter((Class<XmlAdapter>) adapter.getClass(), adapter);
-    }
-
-    public <A extends XmlAdapter> void setAdapter(Class<A> type, A adapter) {
-        throw new UnsupportedOperationException();
-    }
-
-    public <A extends XmlAdapter> A getAdapter(Class<A> type) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setAttachmentMarshaller(AttachmentMarshaller am) {
-        throw new UnsupportedOperationException();
-    }
-
-    public AttachmentMarshaller getAttachmentMarshaller() {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setListener(javax.xml.bind.Marshaller.Listener listener) {
-        throw new UnsupportedOperationException();
-    }
-
-    public javax.xml.bind.Marshaller.Listener getListener() {
-        throw new UnsupportedOperationException();
-    }
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/helpers/AbstractUnmarshallerImpl.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/helpers/AbstractUnmarshallerImpl.java
deleted file mode 100644
index fe14154..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/helpers/AbstractUnmarshallerImpl.java
+++ /dev/null
@@ -1,256 +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 javax.xml.bind.helpers;
-
-import java.io.File;
-import java.io.InputStream;
-import java.io.Reader;
-import java.net.URL;
-import java.net.MalformedURLException;
-
-import javax.xml.bind.Unmarshaller;
-import javax.xml.bind.ValidationEventHandler;
-import javax.xml.bind.UnmarshallerHandler;
-import javax.xml.bind.JAXBElement;
-import javax.xml.bind.UnmarshalException;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.PropertyException;
-import javax.xml.bind.attachment.AttachmentUnmarshaller;
-import javax.xml.bind.annotation.adapters.XmlAdapter;
-import javax.xml.validation.Schema;
-import javax.xml.transform.Source;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.transform.sax.SAXSource;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.stream.XMLEventReader;
-import javax.xml.stream.XMLStreamReader;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParserFactory;
-
-import org.w3c.dom.Node;
-
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-
-public abstract class AbstractUnmarshallerImpl implements Unmarshaller {
-
-    protected boolean validating;
-    private ValidationEventHandler eventHandler;
-    private XMLReader reader;
-
-    protected UnmarshalException createUnmarshalException(SAXException e) {
-        Exception nested = e.getException();
-        if (nested instanceof UnmarshalException) {
-            return (UnmarshalException)nested;
-        } else if(nested instanceof RuntimeException) {
-            throw (RuntimeException)nested;
-        } else if (nested != null) {
-            return new UnmarshalException(nested);
-        } else {
-            return new UnmarshalException(e);
-        }
-    }
-
-    protected XMLReader getXMLReader() throws JAXBException {
-        if (reader == null) {
-            try {
-                SAXParserFactory parserFactory = SAXParserFactory.newInstance();
-                parserFactory.setNamespaceAware(true);
-                parserFactory.setValidating(false);
-                reader = parserFactory.newSAXParser().getXMLReader();
-            } catch(ParserConfigurationException e) {
-                throw new JAXBException(e);
-            } catch(SAXException e) {
-                throw new JAXBException(e);
-            }
-        }
-        return reader;
-    }
-
-    public <A extends XmlAdapter> A getAdapter(Class<A> type) {
-        throw new UnsupportedOperationException();
-    }
-
-    public AttachmentUnmarshaller getAttachmentUnmarshaller() {
-        throw new UnsupportedOperationException();
-    }
-
-    public ValidationEventHandler getEventHandler() throws JAXBException {
-        return eventHandler;
-    }
-
-    public Listener getListener() {
-        throw new UnsupportedOperationException();
-    }
-
-    public Object getProperty(String name) throws PropertyException {
-        if(name == null) {
-            throw new IllegalArgumentException("name must not be null");
-        }
-        throw new PropertyException(name);
-    }
-
-    public Schema getSchema() {
-        throw new UnsupportedOperationException();
-    }
-
-    public boolean isValidating() throws JAXBException {
-        return validating;
-    }
-
-    public <A extends XmlAdapter> void setAdapter(Class<A> type, A adapter) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setAdapter(XmlAdapter adapter) {
-        if (adapter == null) {
-            throw new IllegalArgumentException();
-        }
-        setAdapter((Class<XmlAdapter>) adapter.getClass(), adapter);
-    }
-
-    public void setAttachmentUnmarshaller(AttachmentUnmarshaller au) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setEventHandler(ValidationEventHandler handler) throws JAXBException {
-        if (handler == null) {
-            handler = new DefaultValidationEventHandler();
-        }
-        eventHandler = handler;
-    }
-
-    public void setListener(Listener listener) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setProperty(String name, Object value) throws PropertyException {
-        if(name == null) {
-            throw new IllegalArgumentException("name must not be null");
-        }
-        throw new PropertyException(name, value);
-    }
-
-    public void setSchema(Schema schema) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setValidating(boolean validating) throws JAXBException {
-        this.validating = validating;
-    }
-
-    public final Object unmarshal(File file) throws JAXBException {
-        if (file == null) {
-            throw new IllegalArgumentException("file must not be null");
-        }
-        try
-        {
-            String path = file.getAbsolutePath();
-            if (File.separatorChar != '/') {
-                path = path.replace(File.separatorChar, '/');
-            }
-            if (!path.startsWith("/")) {
-                path = "/" + path;
-            }
-            if (!path.endsWith("/") && file.isDirectory()) {
-                path = path + "/";
-            }
-            return unmarshal(new URL("file", "", path));
-        }
-        catch(MalformedURLException e) {
-            throw new IllegalArgumentException(e.getMessage());
-        }
-    }
-
-    public final Object unmarshal(InputSource source) throws JAXBException {
-        if (source == null) {
-            throw new IllegalArgumentException("source must not be null");
-        }
-        return unmarshal(getXMLReader(), source);
-    }
-
-    public final Object unmarshal(InputStream is) throws JAXBException {
-        if (is == null) {
-            throw new IllegalArgumentException("is must not be null");
-        }
-        return unmarshal(new InputSource(is));
-    }
-
-    public <T> JAXBElement<T> unmarshal(Node node, Class<T> declaredType) throws JAXBException {
-        throw new UnsupportedOperationException();
-    }
-
-    public final Object unmarshal(Reader reader) throws JAXBException {
-        if (reader == null) {
-            throw new IllegalArgumentException("reader must not be null");
-        }
-        return unmarshal(new InputSource(reader));
-    }
-
-    public Object unmarshal(Source source) throws JAXBException {
-        if (source == null) {
-            throw new IllegalArgumentException("source must not be null");
-        } else if (source instanceof SAXSource) {
-            SAXSource saxSource = (SAXSource) source;
-            XMLReader reader = saxSource.getXMLReader();
-            if (reader == null) {
-                reader = getXMLReader();
-            }
-            return unmarshal(reader, saxSource.getInputSource());
-        } else if (source instanceof StreamSource) {
-            StreamSource ss = (StreamSource) source;
-            InputSource is = new InputSource();
-            is.setSystemId(ss.getSystemId());
-            is.setByteStream(ss.getInputStream());
-            is.setCharacterStream(ss.getReader());
-            return unmarshal(is);
-        } else if (source instanceof DOMSource)
-            return unmarshal(((DOMSource) source).getNode());
-        else
-            throw new IllegalArgumentException();
-    }
-
-    protected abstract Object unmarshal(XMLReader xmlreader, InputSource inputsource) throws JAXBException;
-
-    public <T> JAXBElement<T> unmarshal(Source source, Class<T> declaredType) throws JAXBException {
-        throw new UnsupportedOperationException();
-    }
-
-    public final Object unmarshal(URL url) throws JAXBException {
-        if(url == null) {
-            throw new IllegalArgumentException("url must not be null");
-        }
-        return unmarshal(new InputSource(url.toExternalForm()));
-    }
-
-    public Object unmarshal(XMLEventReader reader) throws JAXBException {
-        throw new UnsupportedOperationException();
-    }
-
-    public <T> JAXBElement<T> unmarshal(XMLEventReader reader, Class<T> declaredType) throws JAXBException {
-        throw new UnsupportedOperationException();
-    }
-
-    public Object unmarshal(XMLStreamReader reader) throws JAXBException {
-        throw new UnsupportedOperationException();
-    }
-
-    public <T> JAXBElement<T> unmarshal(XMLStreamReader reader, Class<T> declaredType) throws JAXBException {
-        throw new UnsupportedOperationException();
-    }
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/helpers/DefaultValidationEventHandler.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/helpers/DefaultValidationEventHandler.java
deleted file mode 100644
index d54d458..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/helpers/DefaultValidationEventHandler.java
+++ /dev/null
@@ -1,82 +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 javax.xml.bind.helpers;
-
-import java.net.URL;
-
-import javax.xml.bind.ValidationEventHandler;
-import javax.xml.bind.ValidationEvent;
-import javax.xml.bind.ValidationEventLocator;
-
-import org.w3c.dom.Node;
-
-public class DefaultValidationEventHandler implements ValidationEventHandler {
-
-    public boolean handleEvent(ValidationEvent event) {
-        if (event == null) {
-            throw new IllegalArgumentException();
-        }
-        String severity = null;
-        boolean retVal = false;
-        switch(event.getSeverity()) {
-        case ValidationEvent.WARNING:
-            severity = "[WARNING]: ";
-            retVal = true;
-            break;
-
-        case ValidationEvent.ERROR:
-            severity = "[ERROR]: ";
-            retVal = false;
-            break;
-
-        case ValidationEvent.FATAL_ERROR:
-            severity = "[FATAL_ERROR]: ";
-            retVal = false;
-            break;
-        }
-        String location = getLocation(event);
-        System.out.println("DefaultValidationEventHandler " + severity + " " + event.getMessage() + "\n     Location: " + location);
-        return retVal;
-    }
-
-    private String getLocation(ValidationEvent event) {
-        StringBuffer msg = new StringBuffer();
-        ValidationEventLocator locator = event.getLocator();
-        if (locator != null) {
-            URL url = locator.getURL();
-            Object obj = locator.getObject();
-            Node node = locator.getNode();
-            int line = locator.getLineNumber();
-            if(url != null || line != -1) {
-                msg.append("line ").append(line);
-                if(url != null) {
-                    msg.append(" of ").append(url);
-                }
-            } else {
-                if (obj != null) {
-                    msg.append(" obj: ").append(obj.toString());
-                } else if(node != null) {
-                    msg.append(" node: ").append(node.toString());
-                }
-            }
-        } else {
-            msg.append("unavailable");
-        }
-        return msg.toString();
-    }
-
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/helpers/NotIdentifiableEventImpl.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/helpers/NotIdentifiableEventImpl.java
deleted file mode 100644
index 8a08cdd..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/helpers/NotIdentifiableEventImpl.java
+++ /dev/null
@@ -1,31 +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 javax.xml.bind.helpers;
-
-import javax.xml.bind.NotIdentifiableEvent;
-import javax.xml.bind.ValidationEventLocator;
-
-public class NotIdentifiableEventImpl extends ValidationEventImpl implements NotIdentifiableEvent {
-
-    public NotIdentifiableEventImpl(int severity, String message, ValidationEventLocator locator) {
-        super(severity, message, locator);
-    }
-
-    public NotIdentifiableEventImpl(int severity, String message, ValidationEventLocator locator, Throwable linkedException) {
-        super(severity, message, locator, linkedException);
-    }
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/helpers/ParseConversionEventImpl.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/helpers/ParseConversionEventImpl.java
deleted file mode 100644
index 5e88c93..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/helpers/ParseConversionEventImpl.java
+++ /dev/null
@@ -1,31 +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 javax.xml.bind.helpers;
-
-import javax.xml.bind.ParseConversionEvent;
-import javax.xml.bind.ValidationEventLocator;
-
-public class ParseConversionEventImpl extends ValidationEventImpl implements ParseConversionEvent {
-
-    public ParseConversionEventImpl(int severity, String message, ValidationEventLocator locator) { 
-        super(severity, message, locator);
-    }
-
-    public ParseConversionEventImpl(int severity, String message, ValidationEventLocator locator, Throwable linkedException) {
-        super(severity, message, locator, linkedException);
-    }
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/helpers/PrintConversionEventImpl.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/helpers/PrintConversionEventImpl.java
deleted file mode 100644
index b0eb10f..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/helpers/PrintConversionEventImpl.java
+++ /dev/null
@@ -1,31 +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 javax.xml.bind.helpers;
-
-import javax.xml.bind.PrintConversionEvent;
-import javax.xml.bind.ValidationEventLocator;
-
-public class PrintConversionEventImpl extends ValidationEventImpl implements PrintConversionEvent {
-
-    public PrintConversionEventImpl(int severity, String message, ValidationEventLocator locator) {
-        super(severity, message, locator);
-    }
-
-    public PrintConversionEventImpl(int severity, String message, ValidationEventLocator locator, Throwable linkedException) {
-        super(severity, message, locator, linkedException);
-    }
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/helpers/ValidationEventImpl.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/helpers/ValidationEventImpl.java
deleted file mode 100644
index ca5e8b1..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/helpers/ValidationEventImpl.java
+++ /dev/null
@@ -1,94 +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 javax.xml.bind.helpers;
-
-import javax.xml.bind.ValidationEvent;
-import javax.xml.bind.ValidationEventLocator;
-
-public class ValidationEventImpl implements ValidationEvent {
-
-    private int severity;
-    private String message;
-    private Throwable linkedException;
-    private ValidationEventLocator locator;
-
-    public ValidationEventImpl(int severity, String message, ValidationEventLocator locator) {
-        this(severity, message, locator, null);
-    }
-
-    public ValidationEventImpl(int severity, String message, ValidationEventLocator locator, Throwable linkedException) {
-        setSeverity(severity);
-        this.message = message;
-        this.locator = locator;
-        this.linkedException = linkedException;
-    }
-
-    public int getSeverity() {
-        return severity;
-    }
-
-    public void setSeverity(int severity) {
-        if (severity != 0 && severity != 1 && severity != 2) {
-            throw new IllegalArgumentException("Illegal severity");
-        }
-        this.severity = severity;
-    }
-
-    public String getMessage() {
-        return message;
-    }
-
-    public void setMessage(String message) {
-        this.message = message;
-    }
-
-    public Throwable getLinkedException() {
-        return linkedException;
-    }
-
-    public void setLinkedException(Throwable linkedException) {
-        this.linkedException = linkedException;
-    }
-
-    public ValidationEventLocator getLocator() {
-        return locator;
-    }
-
-    public void setLocator(ValidationEventLocator locator) {
-        this.locator = locator;
-    }
-
-    public String toString() {
-        String s;
-        switch (getSeverity()) {
-            case WARNING:
-                s = "WARNING";
-                break;
-            case ERROR:
-                s = "ERROR";
-                break;
-            case FATAL_ERROR:
-                s = "FATAL_ERROR";
-                break;
-            default:
-                s = String.valueOf(getSeverity());
-                break;
-        }
-        return "[severity=" + s + ", message=" + getMessage() + ", locator=" + getLocator() + "]";
-    }
-
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/helpers/ValidationEventLocatorImpl.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/helpers/ValidationEventLocatorImpl.java
deleted file mode 100644
index b1ddf78..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/helpers/ValidationEventLocatorImpl.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 javax.xml.bind.helpers;
-
-import java.net.URL;
-import java.net.MalformedURLException;
-
-import javax.xml.bind.ValidationEventLocator;
-
-import org.w3c.dom.Node;
-
-import org.xml.sax.SAXParseException;
-import org.xml.sax.Locator;
-
-public class ValidationEventLocatorImpl implements ValidationEventLocator {
-
-    private URL url;
-    private int offset = -1;
-    private int lineNumber = -1;
-    private int columnNumber = -1;
-    private Object object;
-    private Node node;
-
-    public ValidationEventLocatorImpl() {
-    }
-
-    public ValidationEventLocatorImpl(Locator loc) {
-        if (loc == null) {
-            throw new IllegalArgumentException("loc must not be null");
-        }
-        url = toURL(loc.getSystemId());
-        columnNumber = loc.getColumnNumber();
-        lineNumber = loc.getLineNumber();
-    }
-
-    public ValidationEventLocatorImpl(SAXParseException e) {
-        if (e == null) {
-            throw new IllegalArgumentException("e must not be null");
-        }
-        url = toURL(e.getSystemId());
-        columnNumber = e.getColumnNumber();
-        lineNumber = e.getLineNumber();
-    }
-
-    public ValidationEventLocatorImpl(Node node) {
-        if (node == null) {
-            throw new IllegalArgumentException("node must not be null");
-        }
-        this.node = node;
-    }
-
-    public ValidationEventLocatorImpl(Object object) {
-        if (object == null) {
-            throw new IllegalArgumentException("object must not be null");
-        }
-        this.object = object;
-    }
-
-    private static URL toURL(String systemId) {
-        try {
-            return new URL(systemId);
-        }
-        catch (MalformedURLException e) {
-            return null;
-        }
-    }
-
-    public URL getURL() {
-        return url;
-    }
-
-    public void setURL(URL url) {
-        this.url = url;
-    }
-
-    public int getOffset() {
-        return offset;
-    }
-
-    public void setOffset(int offset) {
-        this.offset = offset;
-    }
-
-    public int getLineNumber() {
-        return lineNumber;
-    }
-
-    public void setLineNumber(int lineNumber) {
-        this.lineNumber = lineNumber;
-    }
-
-    public int getColumnNumber() {
-        return columnNumber;
-    }
-
-    public void setColumnNumber(int columnNumber) {
-        this.columnNumber = columnNumber;
-    }
-
-    public Object getObject() {
-        return object;
-    }
-
-    public void setObject(Object object) {
-        this.object = object;
-    }
-
-    public Node getNode() {
-        return node;
-    }
-
-    public void setNode(Node node) {
-        this.node = node;
-    }
-
-    public String toString() {
-        return "[node=" + getNode() + ", " +
-                "object=" + getObject() + ", " +
-                "url=" + getURL() + ", " +
-                "line=" + String.valueOf(getLineNumber()) + "," +
-                "col=" + String.valueOf(getColumnNumber()) + "," +
-                "offset=" + String.valueOf(getOffset()) + "]";
-    }
-
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/util/JAXBResult.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/util/JAXBResult.java
deleted file mode 100644
index 1584b41..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/util/JAXBResult.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 javax.xml.bind.util;
-
-import javax.xml.transform.Result;
-import javax.xml.transform.sax.SAXResult;
-import javax.xml.bind.UnmarshallerHandler;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Unmarshaller;
-
-public class JAXBResult extends SAXResult {
-
-    private final UnmarshallerHandler unmarshallerHandler;
-
-    public JAXBResult(JAXBContext context) throws JAXBException {
-        if (context == null) {
-            throw new JAXBException("context must not be null");
-        }
-        unmarshallerHandler = context.createUnmarshaller().getUnmarshallerHandler();
-        super.setHandler(unmarshallerHandler);
-    }
-
-    public JAXBResult(Unmarshaller unmarshaller) throws JAXBException {
-        if (unmarshaller == null) {
-            throw new JAXBException("unmarshaller must not be null");
-        }
-        unmarshallerHandler = unmarshaller.getUnmarshallerHandler();
-        super.setHandler(unmarshallerHandler);
-    }
-
-    public Object getResult() throws JAXBException {
-        return unmarshallerHandler.getResult();
-    }
-
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/util/JAXBSource.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/util/JAXBSource.java
deleted file mode 100644
index abd6457..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/util/JAXBSource.java
+++ /dev/null
@@ -1,165 +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 javax.xml.bind.util;
-
-import javax.xml.transform.Source;
-import javax.xml.transform.sax.SAXSource;
-import javax.xml.bind.Marshaller;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-
-import org.xml.sax.XMLReader;
-import org.xml.sax.SAXNotRecognizedException;
-import org.xml.sax.EntityResolver;
-import org.xml.sax.DTDHandler;
-import org.xml.sax.ContentHandler;
-import org.xml.sax.ErrorHandler;
-import org.xml.sax.SAXException;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXParseException;
-import org.xml.sax.helpers.XMLFilterImpl;
-import org.xml.sax.ext.LexicalHandler;
-
-public class JAXBSource extends SAXSource {
-
-    public JAXBSource(JAXBContext context, Object contentObject) throws JAXBException {
-        if (context == null) {
-            throw new JAXBException("context must not be null");
-        }
-        if (contentObject == null) {
-            throw new JAXBException("contentObject must not be null");
-        }
-        setXMLReader(new Reader(context.createMarshaller(), contentObject));
-        setInputSource(new InputSource());
-    }
-
-    public JAXBSource(final Marshaller marshaller, final Object contentObject) throws JAXBException {
-        if (marshaller == null) {
-            throw new JAXBException("marshaller must not be null");
-        }
-        if (contentObject == null) {
-            throw new JAXBException("contentObject must not be null");
-        }
-        setXMLReader(new Reader(marshaller, contentObject));
-        setInputSource(new InputSource());
-    }
-
-    private static class Reader implements XMLReader {
-
-        private LexicalHandler lexicalHandler;
-        private EntityResolver entityResolver;
-        private DTDHandler dtdHandler;
-        private XMLFilterImpl repeater;
-        private ErrorHandler errorHandler;
-        private final Marshaller marshaller;
-        private final Object contentObject;
-
-        public Reader(Marshaller marshaller, Object contentObject) {
-            this.marshaller = marshaller;
-            this.contentObject = contentObject;
-            repeater = new XMLFilterImpl();
-        }
-
-        public boolean getFeature(String name) throws SAXNotRecognizedException {
-            if (name.equals("http://xml.org/sax/features/namespaces")) {
-                return true;
-            }
-            if (name.equals("http://xml.org/sax/features/namespace-prefixes")) {
-                return false;
-            }
-            throw new SAXNotRecognizedException(name);
-        }
-
-        public void setFeature(String name, boolean value) throws SAXNotRecognizedException {
-            if (name.equals("http://xml.org/sax/features/namespaces") && value) {
-                return;
-            }
-            if (name.equals("http://xml.org/sax/features/namespace-prefixes") && !value) {
-                return;
-            }
-            throw new SAXNotRecognizedException(name);
-        }
-
-        public Object getProperty(String name) throws SAXNotRecognizedException {
-            if("http://xml.org/sax/properties/lexical-handler".equals(name)) {
-                return lexicalHandler;
-            }
-            throw new SAXNotRecognizedException(name);
-        }
-
-        public void setProperty(String name, Object value) throws SAXNotRecognizedException {
-            if("http://xml.org/sax/properties/lexical-handler".equals(name)) {
-                lexicalHandler = (LexicalHandler) value;
-                return;
-            }
-            throw new SAXNotRecognizedException(name);
-        }
-
-        public void setEntityResolver(EntityResolver resolver) {
-            entityResolver = resolver;
-        }
-
-        public EntityResolver getEntityResolver() {
-            return entityResolver;
-        }
-
-        public void setDTDHandler(DTDHandler handler) {
-            dtdHandler = handler;
-        }
-
-        public DTDHandler getDTDHandler() {
-            return dtdHandler;
-        }
-
-        public void setContentHandler(ContentHandler handler) {
-            repeater.setContentHandler(handler);
-        }
-
-        public ContentHandler getContentHandler() {
-            return repeater.getContentHandler();
-        }
-
-        public void setErrorHandler(ErrorHandler handler) {
-            errorHandler = handler;
-        }
-
-        public ErrorHandler getErrorHandler() {
-            return errorHandler;
-        }
-
-        public void parse(InputSource input) throws SAXException {
-            parse();
-        }
-
-        public void parse(String systemId) throws SAXException {
-            parse();
-        }
-
-        public void parse() throws SAXException {
-            try {
-                marshaller.marshal(contentObject, repeater);
-            } catch(JAXBException e) {
-                SAXParseException se = new SAXParseException(e.getMessage(), null, null, -1, -1, e);
-                if (errorHandler != null) {
-                    errorHandler.fatalError(se);
-                }
-                throw se;
-            }
-        }
-
-    }
-}
diff --git a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/util/ValidationEventCollector.java b/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/util/ValidationEventCollector.java
deleted file mode 100644
index e4cc436..0000000
--- a/trunk/jaxb-api-2.0/src/main/java/javax/xml/bind/util/ValidationEventCollector.java
+++ /dev/null
@@ -1,44 +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 javax.xml.bind.util;
-
-import java.util.ArrayList;
-
-import javax.xml.bind.ValidationEventHandler;
-import javax.xml.bind.ValidationEvent;
-
-public class ValidationEventCollector implements ValidationEventHandler {
-
-    private ArrayList<ValidationEvent> events = new ArrayList<ValidationEvent>();
-
-    public ValidationEvent[] getEvents() {
-        return events.toArray(new ValidationEvent[events.size()]);
-    }
-
-    public boolean handleEvent(ValidationEvent event) {
-        events.add(event);
-        return event.getSeverity() != ValidationEvent.FATAL_ERROR;
-    }
-
-    public boolean hasEvents() {
-        return !events.isEmpty();
-    }
-
-    public void reset() {
-        events.clear();
-    }
-}
diff --git a/trunk/jaxb-api-2.1/pom.xml b/trunk/jaxb-api-2.1/pom.xml
deleted file mode 100644
index cae2f80..0000000
--- a/trunk/jaxb-api-2.1/pom.xml
+++ /dev/null
@@ -1,195 +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.specs</groupId>
-        <artifactId>specs</artifactId>
-        <version>2.1.0</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.specs</groupId>
-    <artifactId>org.apache.servicemix.specs.jaxb-api-2.1</artifactId>
-    <packaging>bundle</packaging>
-    <version>2.1.0</version>
-    <name>Apache ServiceMix :: Specs :: JAXB API 2.1</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.stax-api-1.0</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-activation_1.1_spec</artifactId>
-            <version>1.0.2</version>
-        </dependency>
-        <dependency>
-            <groupId>javax.xml.bind</groupId>
-            <artifactId>jaxb-api</artifactId>
-            <version>2.1</version>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>com.google.code.japidiff</groupId>
-                <artifactId>maven-japidiff-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>diff</goal>
-                        </goals>
-                    </execution>
-                </executions>
-                <configuration>
-                    <filter>javax/xml/bind.*</filter>
-                    <jar>javax.xml.bind:jaxb-api:2.1</jar>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Description>${project.description}</Bundle-Description>
-                        <Export-Package>javax.xml.bind*;version=2.1;-split-package:=merge-first;-noimport:=true</Export-Package>
-                        <Import-Package>*</Import-Package>
-                        <Private-Package>org.apache.servicemix.specs.locator;-split-package:=merge-first</Private-Package>
-                        <Bundle-Activator>org.apache.servicemix.specs.locator.Activator</Bundle-Activator>
-                        <Implementation-Title>Apache ServiceMix</Implementation-Title>
-                        <Implementation-Version>${project.version}</Implementation-Version>
-                    </instructions>
-                    <unpackBundle>true</unpackBundle>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <artifactSet>
-                                <includes>
-                                    <include>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</include>
-                                </includes>
-                            </artifactSet>
-                            <filters>
-                                <filter>
-                                    <artifact>${project.groupId}:${project.artifactId}</artifact>
-                                    <excludes>
-                                        <exclude>org/**</exclude>
-                                    </excludes>
-                                </filter>
-                            </filters>
-                            <createSourcesJar>${createSourcesJar}</createSourcesJar>
-                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-                            <createDependencyReducedPom>true</createDependencyReducedPom>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>deploy</id>
-            <properties>
-                <createSourcesJar>true</createSourcesJar>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-source-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>attach-sources</id>
-                                <phase>process-classes</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-dependency-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>unpack-sources</id>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>unpack</goal>
-                                </goals>
-                                <configuration>
-                                    <artifactItems>
-                                        <artifactItem>
-                                            <groupId>org.apache.servicemix.specs</groupId>
-                                            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                    </artifactItems>
-                                    <outputDirectory>${project.build.directory}/sources</outputDirectory>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>package</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <minmemory>128m</minmemory>
-                            <maxmemory>512m</maxmemory>
-                            <sourcepath>${project.build.directory}/sources</sourcepath>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/Binder.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/Binder.java
deleted file mode 100644
index 125a1be..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/Binder.java
+++ /dev/null
@@ -1,52 +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 javax.xml.bind;
-
-import javax.xml.validation.Schema;
-
-public abstract class Binder<XmlNode> {
-
-    public abstract ValidationEventHandler getEventHandler() throws JAXBException;
-
-    public abstract Object getJAXBNode(XmlNode xmlNode);
-
-    public abstract Object getProperty(String name) throws PropertyException;
-
-    public abstract Schema getSchema();
-
-    public abstract XmlNode getXMLNode(Object jaxbObject);
-
-    public abstract void marshal(Object jaxbObject, XmlNode xmlNode) throws JAXBException;
-
-    public abstract void setEventHandler(ValidationEventHandler handler) throws JAXBException;
-
-    public abstract void setProperty(String name, Object value) throws PropertyException;
-
-    public abstract void setSchema(Schema schema);
-
-    public abstract Object unmarshal(XmlNode xmlNode) throws JAXBException;
-
-    public abstract <T> JAXBElement<T> unmarshal(XmlNode xmlNode, Class<T> declaredType) throws JAXBException;
-
-    public abstract Object updateJAXB(XmlNode xmlNode) throws JAXBException;
-
-    public abstract XmlNode updateXML(Object jaxbObject) throws JAXBException;
-
-    public abstract XmlNode updateXML(Object jaxbObject, XmlNode xmlNode) throws JAXBException; 
-
-    
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/ContextFinder.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/ContextFinder.java
deleted file mode 100644
index 5164643..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/ContextFinder.java
+++ /dev/null
@@ -1,183 +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 javax.xml.bind;
-
-import java.lang.reflect.Method;
-import java.util.Map;
-import java.util.Properties;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
-
-class ContextFinder {
-
-    private static final String PLATFORM_DEFAULT_FACTORY_CLASS = "com.sun.xml.bind.v2.ContextFactory";
-    private static final String JAXB_CONTEXT_PROPERTY = JAXBContext.class.getName();
-    private static final String JAXB_CONTEXT_FACTORY = JAXBContext.JAXB_CONTEXT_FACTORY;
-
-    public static JAXBContext find(String contextPath, ClassLoader classLoader, Map properties) throws JAXBException {
-        String className = null;
-        // Patch for bug https://issues.apache.org/activemq/browse/SMX4-329
-        if (contextPath == null || contextPath.length() == 0) {
-            throw new JAXBException("Invalid contextPath (empty or null)");
-  	    }
-        String[] packages = contextPath.split(":");
-        if (packages == null || packages.length == 0) {
-            throw new JAXBException("Invalid contextPath (no packages)");
-        }
-        for (String pkg : packages) {
-            String url = pkg.replace('.', '/') + "/jaxb.properties";
-            className = loadClassNameFromProperties(url, classLoader);
-            if (className != null) {
-                break;
-            }
-        }
-        if (className == null) {
-            className = System.getProperty(JAXB_CONTEXT_PROPERTY);
-        }
-        if (className == null) {
-            String url = "META-INF/services/" + JAXB_CONTEXT_PROPERTY;
-            className = loadClassName(url, classLoader);
-        }
-        if (className == null) {
-            className = PLATFORM_DEFAULT_FACTORY_CLASS;
-        }
-        Class spi = loadSpi(className, classLoader);
-        try {
-            Method m = spi.getMethod("createContext", new Class[] { String.class, ClassLoader.class, Map.class });
-            return (JAXBContext) m.invoke(null, new Object[] { contextPath, classLoader, properties });
-        } catch (NoSuchMethodException e) {
-            // ignore
-        } catch (Throwable t) {
-            throw new JAXBException("Unable to create context", t);
-        } 
-        // Fallback for JAXB 1.0 compatibility (at least JAXB TCK tests are using that feature)
-        try {
-            Method m = spi.getMethod("createContext", new Class[] { String.class, ClassLoader.class, });
-            return (JAXBContext) m.invoke(null, new Object[] { contextPath, classLoader });
-        } catch (Throwable t) {
-            throw new JAXBException("Unable to create context", t);
-        }
-    }
-
-
-    public static JAXBContext find(Class[] classes, Map properties) throws JAXBException {
-        String className = null;
-        for (Class cl : classes) {
-            Package pkg = cl.getPackage();
-            if (pkg != null) {
-                String url = pkg.getName().replace('.', '/') + "/jaxb.properties";
-                className = loadClassNameFromProperties(url, cl.getClassLoader());
-                if (className != null) {
-                    break;
-                }
-            }
-        }
-        if (className == null) {
-            className = System.getProperty(JAXB_CONTEXT_PROPERTY);
-        }
-        if (className == null) {
-            String url = "META-INF/services/" + JAXB_CONTEXT_PROPERTY;
-            className = loadClassName(url, Thread.currentThread().getContextClassLoader());
-        }
-        if (className == null) {
-            className = PLATFORM_DEFAULT_FACTORY_CLASS;
-        }
-        Class spi = loadSpi(className, Thread.currentThread().getContextClassLoader());
-        try {
-            Method m = spi.getMethod("createContext", new Class[] { Class[].class, Map.class });
-            return (JAXBContext) m.invoke(null, new Object[] { classes, properties });
-        } catch (Throwable t) {
-            throw new JAXBException("Unable to create context", t);
-        }
-    }
-
-    private static String loadClassNameFromProperties(String url, ClassLoader classLoader) throws JAXBException {
-        try {
-            InputStream is;
-            if (classLoader != null) {
-                is = classLoader.getResourceAsStream(url);
-            } else {
-                is = ClassLoader.getSystemResourceAsStream(url);
-            }
-            if (is != null) {
-                try {
-                    Properties props = new Properties();
-                    props.load(is);
-                    String className = props.getProperty(JAXB_CONTEXT_FACTORY);
-                    if (className == null) {
-                        throw new JAXBException("jaxb.properties file " + url + " should contain a " + JAXB_CONTEXT_FACTORY + " property");
-                    }
-                    return className.trim();
-                } finally {
-                    is.close();
-                }
-            } else {
-                return null;
-            }
-        } catch (IOException e) {
-            throw new JAXBException(e);
-        }
-    }
-
-    private static String loadClassName(String url, ClassLoader classLoader) throws JAXBException {
-        try {
-            InputStream is;
-            if (classLoader != null) {
-                is = classLoader.getResourceAsStream(url);
-            } else {
-                is = ClassLoader.getSystemResourceAsStream(url);
-            }
-            if (is != null) {
-                try {
-                    BufferedReader r = new BufferedReader(new InputStreamReader(is, "UTF-8"));
-                    return r.readLine().trim();
-                } finally {
-                    is.close();
-                }
-            }
-            return null;
-        } catch (IOException e) {
-            throw new JAXBException(e);
-        }
-    }
-
-    private static Class loadSpi(String className, ClassLoader classLoader) throws JAXBException {
-        Class spiClass;
-        try {
-            spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(JAXBContext.class);
-            if (spiClass != null) {
-                return spiClass;
-            }
-        } catch (Throwable t) {
-        }
-        try {
-            if (classLoader != null) {
-                spiClass = classLoader.loadClass(className);
-            } else {
-                spiClass = Class.forName(className);
-            }
-        } catch (ClassNotFoundException e) {
-            throw new JAXBException("Provider " + className + " not found", e);
-        }
-        return spiClass;
-    }
-
-
-}
-
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/DataBindingException.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/DataBindingException.java
deleted file mode 100644
index a5484b7..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/DataBindingException.java
+++ /dev/null
@@ -1,28 +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 javax.xml.bind;
-
-public class DataBindingException extends RuntimeException {
-
-    public DataBindingException(String message, Throwable cause) {
-        super(message, cause);
-    }
-
-    public DataBindingException(Throwable cause) {
-        super(cause);
-    }
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/DatatypeConverter.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/DatatypeConverter.java
deleted file mode 100644
index e8dd3c6..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/DatatypeConverter.java
+++ /dev/null
@@ -1,194 +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 javax.xml.bind;
-
-import java.util.Calendar;
-import java.math.BigInteger;
-import java.math.BigDecimal;
-
-import javax.xml.namespace.QName;
-import javax.xml.namespace.NamespaceContext;
-
-public final class DatatypeConverter {
-
-    private static DatatypeConverterInterface converter = null;
-
-    private DatatypeConverter() {
-    }
-
-    public static void setDatatypeConverter(DatatypeConverterInterface converter) {
-        if (converter == null) {
-            throw new IllegalArgumentException("The DatatypeConverterInterface parameter must not be null");
-        }
-        if (DatatypeConverter.converter == null) {
-            DatatypeConverter.converter = converter;
-        }
-    }
-
-    public static String parseString(String lexicalXSDString) {
-        return converter.parseString(lexicalXSDString);
-    }
-
-    public static BigInteger parseInteger(String lexicalXSDInteger) {
-        return converter.parseInteger(lexicalXSDInteger);
-    }
-
-    public static int parseInt(String lexicalXSDInt) {
-        return converter.parseInt(lexicalXSDInt);
-    }
-
-    public static long parseLong(String lexicalXSDLong) {
-        return converter.parseLong(lexicalXSDLong);
-    }
-
-    public static short parseShort(String lexicalXSDShort) {
-        return converter.parseShort(lexicalXSDShort);
-    }
-
-    public static BigDecimal parseDecimal(String lexicalXSDDecimal) {
-        return converter.parseDecimal(lexicalXSDDecimal);
-    }
-
-    public static float parseFloat(String lexicalXSDFloat) {
-        return converter.parseFloat(lexicalXSDFloat);
-    }
-
-    public static double parseDouble(String lexicalXSDDouble) {
-        return converter.parseDouble(lexicalXSDDouble);
-    }
-
-    public static boolean parseBoolean(String lexicalXSDBoolean) {
-        return converter.parseBoolean(lexicalXSDBoolean);
-    }
-
-    public static byte parseByte(String lexicalXSDByte) {
-        return converter.parseByte(lexicalXSDByte);
-    }
-
-    public static QName parseQName(String lexicalXSDQName, NamespaceContext nsc) {
-        return converter.parseQName(lexicalXSDQName, nsc);
-    }
-
-    public static Calendar parseDateTime(String lexicalXSDDateTime) {
-        return converter.parseDateTime(lexicalXSDDateTime);
-    }
-
-    public static byte[] parseBase64Binary(String lexicalXSDBase64Binary) {
-        return converter.parseBase64Binary(lexicalXSDBase64Binary);
-    }
-
-    public static byte[] parseHexBinary(String lexicalXSDHexBinary) {
-        return converter.parseHexBinary(lexicalXSDHexBinary);
-    }
-
-    public static long parseUnsignedInt(String lexicalXSDUnsignedInt) {
-        return converter.parseUnsignedInt(lexicalXSDUnsignedInt);
-    }
-
-    public static int parseUnsignedShort(String lexicalXSDUnsignedShort) {
-        return converter.parseUnsignedShort(lexicalXSDUnsignedShort);
-    }
-
-    public static Calendar parseTime(String lexicalXSDTime) {
-        return converter.parseTime(lexicalXSDTime);
-    }
-
-    public static Calendar parseDate(String lexicalXSDDate) {
-        return converter.parseDate(lexicalXSDDate);
-    }
-
-    public static String parseAnySimpleType(String lexicalXSDAnySimpleType) {
-        return converter.parseAnySimpleType(lexicalXSDAnySimpleType);
-    }
-
-    public static String printString(String val) {
-        return converter.printString(val);
-    }
-
-    public static String printInteger(BigInteger val) {
-        return converter.printInteger(val);
-    }
-
-    public static String printInt(int val) {
-        return converter.printInt(val);
-    }
-
-    public static String printLong(long val) {
-        return converter.printLong(val);
-    }
-
-    public static String printShort(short val) {
-        return converter.printShort(val);
-    }
-
-    public static String printDecimal(BigDecimal val) {
-        return converter.printDecimal(val);
-    }
-
-    public static String printFloat(float val) {
-        return converter.printFloat(val);
-    }
-
-    public static String printDouble(double val) {
-        return converter.printDouble(val);
-    }
-
-    public static String printBoolean(boolean val) {
-        return converter.printBoolean(val);
-    }
-
-    public static String printByte(byte val) {
-        return converter.printByte(val);
-    }
-
-    public static String printQName(QName val, NamespaceContext nsc) {
-        return converter.printQName(val, nsc);
-    }
-
-    public static String printDateTime(Calendar val) {
-        return converter.printDateTime(val);
-    }
-
-    public static String printBase64Binary(byte val[]) {
-        return converter.printBase64Binary(val);
-    }
-
-    public static String printHexBinary(byte val[]) {
-        return converter.printHexBinary(val);
-    }
-
-    public static String printUnsignedInt(long val) {
-        return converter.printUnsignedInt(val);
-    }
-
-    public static String printUnsignedShort(int val) {
-        return converter.printUnsignedShort(val);
-    }
-
-    public static String printTime(Calendar val) {
-        return converter.printTime(val);
-    }
-
-    public static String printDate(Calendar val) {
-        return converter.printDate(val);
-    }
-
-    public static String printAnySimpleType(String val) {
-        return converter.printAnySimpleType(val);
-    }
-
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/DatatypeConverterInterface.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/DatatypeConverterInterface.java
deleted file mode 100644
index d0a4a63..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/DatatypeConverterInterface.java
+++ /dev/null
@@ -1,104 +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 javax.xml.bind;
-
-import java.util.Calendar;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import javax.xml.namespace.QName;
-import javax.xml.namespace.NamespaceContext;
-
-public interface DatatypeConverterInterface {
-
-    String parseAnySimpleType(String lexicalXSDAnySimpleType);
-
-    byte[] parseBase64Binary(String lexicalXSDBase64Binary);
-
-    boolean parseBoolean(String lexicalXSDBoolean);
-
-    byte parseByte(String lexicalXSDByte);
-
-    Calendar parseDate(String lexicalXSDDate);
-
-    Calendar parseDateTime(String lexicalXSDDateTime);
-
-    BigDecimal parseDecimal(String lexicalXSDDecimal);
-
-    double parseDouble(String lexicalXSDDouble);
-
-    float parseFloat(String lexicalXSDFloat);
-
-    byte[] parseHexBinary(String lexicalXSDHexBinary);
-
-    int parseInt(String lexicalXSDInt);
-
-    BigInteger parseInteger(String lexicalXSDInteger);
-
-    long parseLong(String lexicalXSDLong);
-
-    QName parseQName(String lexicalXSDQName, NamespaceContext nsc);
-
-    short parseShort(String lexicalXSDShort);
-
-    String parseString(String lexicalXSDString);
-
-    Calendar parseTime(String lexicalXSDTime);
-
-    long parseUnsignedInt(String lexicalXSDUnsignedInt);
-
-    int parseUnsignedShort(String lexicalXSDUnsignedShort);
-
-    String printAnySimpleType(String val);
-
-    String printBase64Binary(byte[] val);
-
-    String printBoolean(boolean val);
-
-    String printByte(byte val);
-
-    String printDate(Calendar val);
-
-    String printDateTime(Calendar val);
-
-    String printDecimal(BigDecimal val);
-
-    String printDouble(double val);
-
-    String printFloat(float val);
-
-    String printHexBinary(byte[] val);
-
-    String printInt(int val);
-
-    String printInteger(BigInteger val);
-
-    String printLong(long val);
-
-    String printQName(QName val, NamespaceContext nsc);
-
-    String printShort(short val);
-
-    String printString(String val);
-
-    String printTime(Calendar val);
-
-    String printUnsignedInt(long val);
-
-    String printUnsignedShort(int val);
-
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/Element.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/Element.java
deleted file mode 100644
index 1d9d263..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/Element.java
+++ /dev/null
@@ -1,20 +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 javax.xml.bind;
-
-public interface Element {
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/JAXB.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/JAXB.java
deleted file mode 100644
index da2fdd6..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/JAXB.java
+++ /dev/null
@@ -1,189 +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 javax.xml.bind;
-
-import java.io.File;
-import java.io.OutputStream;
-import java.io.Writer;
-import java.io.IOException;
-import java.io.Reader;
-import java.io.InputStream;
-import java.net.URI;
-import java.net.URL;
-import java.net.URLConnection;
-import java.net.URISyntaxException;
-import java.net.MalformedURLException;
-import java.beans.Introspector;
-
-import javax.xml.transform.Result;
-import javax.xml.transform.Source;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.namespace.QName;
-
-final public class JAXB {
-
-    private JAXB() {
-    }
-
-    public static void marshal(Object object, File file) {
-        if (file == null) {
-            throw new IllegalStateException("No file is given");
-        }
-        marshal(object, new StreamResult(file));
-    }
-
-    public static void marshal(Object object, OutputStream os) {
-        if (os == null) {
-            throw new IllegalStateException("No output stream is given");
-        }
-        marshal(object, new StreamResult(os));
-    }
-
-    public static void marshal(Object object, Writer writer) {
-        if (writer == null) {
-            throw new IllegalStateException("No writer is given");
-        }
-        marshal(object, new StreamResult(writer));
-    }
-
-    public static void marshal(Object object, String str) {
-        if (str == null) {
-            throw new IllegalStateException("No string destination is given");
-        }
-        try {
-            marshal(object, new URI(str));
-        } catch (URISyntaxException e) {
-            marshal(object, new File(str));
-        }
-    }
-
-    public static void marshal(Object object, URI uri) {
-        if (uri == null) {
-            throw new IllegalStateException("No uri is given");
-        }
-        try {
-            marshal(object, uri.toURL());
-        } catch (IOException e) {
-            throw new DataBindingException(e);
-        }
-    }
-
-    public static void marshal(Object object, URL url) {
-        if (url == null) {
-            throw new IllegalStateException("No url is given");
-        }
-        try {
-            URLConnection con = url.openConnection();
-            con.setDoOutput(true);
-            con.setDoInput(false);
-            con.connect();
-            marshal(object, new StreamResult(con.getOutputStream()));
-        } catch (IOException e) {
-            throw new DataBindingException(e);
-        }
-    }
-
-    public static void marshal(Object object, Result result) {
-        try {
-            JAXBContext context;
-            if (object instanceof JAXBElement) {
-                context = getContext(((JAXBElement<?>) object).getDeclaredType());
-            } else {
-                Class<?> clazz = object.getClass();
-                XmlRootElement r = clazz.getAnnotation(XmlRootElement.class);
-                if (r == null) {
-                    // we need to infer the name
-                    object = new JAXBElement(new QName(Introspector.decapitalize(clazz.getSimpleName())),
-                                             clazz, object);
-                }
-                context = getContext(clazz);
-            }
-            Marshaller m = context.createMarshaller();
-            m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);
-            m.marshal(object, result);
-        } catch (JAXBException e) {
-            throw new DataBindingException(e);
-        }
-    }
-
-    public static <T> T unmarshal(File file, Class<T> type) {
-        if (file == null) {
-            throw new IllegalStateException("No file is given");
-        }
-        return unmarshal(new StreamSource(file), type);
-    }
-
-    public static <T> T unmarshal(URL url, Class<T> type) {
-        if (url == null) {
-            throw new IllegalStateException("No url is given");
-        }
-        return unmarshal(new StreamSource(url.toExternalForm()), type);
-    }
-
-    public static <T> T unmarshal(URI uri, Class<T> type) {
-        if (uri == null) {
-            throw new IllegalStateException("No uri is given");
-        }
-        try {
-            return unmarshal(uri.toURL(), type);
-        } catch (MalformedURLException e) {
-            throw new DataBindingException(e);
-        }
-    }
-
-    public static <T> T unmarshal(String str, Class<T> type) {
-        if (str == null) {
-            throw new IllegalStateException("No string destination is given");
-        }
-        try {
-            return unmarshal(new URI(str), type);
-        } catch (URISyntaxException e) {
-            return unmarshal(new File(str), type);
-        }
-    }
-
-    public static <T> T unmarshal(InputStream is, Class<T> type) {
-        if (is == null) {
-            throw new IllegalStateException("No input stream is given");
-        }
-        return unmarshal(new StreamSource(is), type);
-    }
-
-    public static <T> T unmarshal(Reader reader, Class<T> type) {
-        if (reader == null) {
-            throw new IllegalStateException("No reader is given");
-        }
-        return unmarshal(new StreamSource(reader), type);
-    }
-
-    public static <T> T unmarshal(Source source, Class<T> type) {
-        try {
-            JAXBElement<T> item = getContext(type).createUnmarshaller().unmarshal(source, type);
-            return item.getValue();
-        } catch (JAXBException e) {
-            throw new DataBindingException(e);
-        }
-    }
-
-    private static <T> JAXBContext getContext(Class<T> type) throws JAXBException {
-        return JAXBContext.newInstance(type);
-    }
-
-
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/JAXBContext.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/JAXBContext.java
deleted file mode 100644
index 849ba92..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/JAXBContext.java
+++ /dev/null
@@ -1,79 +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 javax.xml.bind;
-
-import java.io.IOException;
-
-import java.util.Map;
-import java.util.Collections;
-
-import org.w3c.dom.Node;
-
-public abstract class JAXBContext {
-
-    public static final String JAXB_CONTEXT_FACTORY = "javax.xml.bind.context.factory";
-
-    protected JAXBContext() {
-    }
-
-    public Binder<Node> createBinder() {
-        throw new UnsupportedOperationException();
-    }
-
-    public <T> Binder<T> createBinder(Class<T> domType) {
-        throw new UnsupportedOperationException();
-    }
-
-    public JAXBIntrospector createJAXBIntrospector() {
-        throw new UnsupportedOperationException();
-    }
-
-    public abstract Marshaller createMarshaller() throws JAXBException;
-
-    public abstract Unmarshaller createUnmarshaller() throws JAXBException;
-
-    public abstract Validator createValidator() throws JAXBException;
-
-    public void generateSchema(SchemaOutputResolver resolver) throws IOException {
-        throw new UnsupportedOperationException();
-    }
-
-    public static JAXBContext newInstance(Class... classesToBeBound) throws JAXBException {
-        return newInstance(classesToBeBound, Collections.<String, Object>emptyMap());
-    }
-
-    public static JAXBContext newInstance(Class[] classesToBeBound, Map<String, ?> properties) throws JAXBException {
-        for (Class cl : classesToBeBound) {
-            if (cl == null) {
-                throw new IllegalArgumentException();
-            }
-        }
-        return ContextFinder.find(classesToBeBound, properties);
-    }
-
-    public static JAXBContext newInstance(String contextPath) throws JAXBException {
-        return newInstance(contextPath, Thread.currentThread().getContextClassLoader());
-    }
-
-    public static JAXBContext newInstance(String contextPath, ClassLoader classLoader) throws JAXBException {
-        return newInstance(contextPath, classLoader, Collections.<String, Object>emptyMap());
-    }
-
-    public static JAXBContext newInstance(String contextPath, ClassLoader classLoader, Map<String, ?> properties) throws JAXBException {
-        return ContextFinder.find(contextPath, classLoader, properties);
-    }
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/JAXBElement.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/JAXBElement.java
deleted file mode 100644
index fdfcf2d..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/JAXBElement.java
+++ /dev/null
@@ -1,93 +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 javax.xml.bind;
-
-import java.io.Serializable;
-
-import javax.xml.namespace.QName;
-
-public class JAXBElement<T> implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    public final static class GlobalScope {
-    }
-
-    protected final QName name;
-    protected final Class<T> declaredType;
-    protected final Class scope;
-    protected T value;
-    protected boolean nil;
-
-    public JAXBElement(QName name, Class<T> declaredType, Class scope, T value) {
-        this.nil = false;
-        if (declaredType == null || name == null) {
-            throw new IllegalArgumentException();
-        }
-        this.declaredType = declaredType;
-        if (scope == null) {
-            scope = GlobalScope.class;
-        }
-        this.scope = scope;
-        this.name = name;
-        setValue(value);
-    }
-
-    public JAXBElement(QName name, Class<T> declaredType, T value) {
-        this(name, declaredType, GlobalScope.class, value);
-    }
-
-    public Class<T> getDeclaredType() {
-        return declaredType;
-    }
-
-    public QName getName() {
-        return name;
-    }
-
-    public void setValue(T value) {
-        this.value = value;
-    }
-
-    public T getValue() {
-        return value;
-    }
-
-    public Class getScope() {
-        return scope;
-    }
-
-    public boolean isNil() {
-        return value == null || nil;
-    }
-
-    public void setNil(boolean nil) {
-        this.nil = nil;
-    }
-
-    public boolean isGlobalScope() {
-        return scope == GlobalScope.class;
-    }
-
-    public boolean isTypeSubstituted() {
-        if (value == null) {
-            return false;
-        } else {
-            return value.getClass() != declaredType;
-        }
-    }
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/JAXBException.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/JAXBException.java
deleted file mode 100644
index 200837d..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/JAXBException.java
+++ /dev/null
@@ -1,87 +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 javax.xml.bind;
-
-import java.io.IOException;
-import java.io.PrintStream;
-import java.io.PrintWriter;
-
-public class JAXBException extends Exception {
-
-    private static final long serialVersionUID = 0x5dd94775L;
-
-    private String errorCode;
-    private Throwable linkedException;
-
-    public JAXBException(String message) {
-        this(message, null, null);
-    }
-
-    public JAXBException(String message, String errorCode) {
-        this(message, errorCode, null);
-    }
-
-    public JAXBException(String message, String errorCode, Throwable cause) {
-        super(message);
-        this.errorCode = errorCode;
-        this.linkedException = cause;
-    }
-
-    public JAXBException(String message, Throwable cause) {
-        this(message, null, cause);
-    }
-
-    public JAXBException(Throwable cause) {
-        this(null, null, cause);
-    }
-
-    public String getErrorCode() {
-        return errorCode;
-    }
-
-    public Throwable getLinkedException() {
-        return getCause();
-    }
-
-    public synchronized void setLinkedException(Throwable linkedException) {
-        this.linkedException = linkedException;
-    }
-
-    public String toString() {
-        return linkedException != null ?
-                super.toString() + "\n - with linked exception:\n[" + linkedException.toString() + "]" : 
-                super.toString();
-    }
-
-    @Override
-    public Throwable getCause() {
-        return linkedException;
-    }
-
-    public void printStackTrace() {
-        super.printStackTrace();
-    }
-
-    public void printStackTrace(PrintStream ps) {
-        super.printStackTrace(ps);
-    }
-
-    public void printStackTrace(PrintWriter pw) {
-        super.printStackTrace(pw);
-    }
-
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/JAXBIntrospector.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/JAXBIntrospector.java
deleted file mode 100644
index 29323b8..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/JAXBIntrospector.java
+++ /dev/null
@@ -1,34 +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 javax.xml.bind;
-
-import javax.xml.namespace.QName;
-
-public abstract class JAXBIntrospector {
-
-    public abstract QName getElementName(Object jaxbElement);
-
-    public static Object getValue(Object jaxbElement) {
-        if (jaxbElement instanceof JAXBElement) {
-            return ((JAXBElement) jaxbElement).getValue();
-        } else {
-            return jaxbElement;
-        }
-    }
-
-    public abstract boolean isElement(Object object);
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/MarshalException.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/MarshalException.java
deleted file mode 100644
index 3f6377b..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/MarshalException.java
+++ /dev/null
@@ -1,40 +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 javax.xml.bind;
-
-public class MarshalException extends JAXBException {
-
-    public MarshalException(String message) {
-        super(message);
-    }
-
-    public MarshalException(String message, String errorCode) {
-        super(message, errorCode);
-    }
-
-    public MarshalException(String message, String errorCode, Throwable cause) {
-        super(message, errorCode, cause);
-    }
-
-    public MarshalException(String message, Throwable cause) {
-        super(message, cause);
-    }
-
-    public MarshalException(Throwable cause) {
-        super(cause);
-    }
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/Marshaller.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/Marshaller.java
deleted file mode 100644
index 12b00b9..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/Marshaller.java
+++ /dev/null
@@ -1,93 +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 javax.xml.bind;
-
-import java.io.OutputStream;
-import java.io.Writer;
-import java.io.File;
-
-import javax.xml.bind.annotation.adapters.XmlAdapter;
-import javax.xml.bind.attachment.AttachmentMarshaller;
-import javax.xml.validation.Schema;
-import javax.xml.transform.Result;
-import javax.xml.stream.XMLEventWriter;
-import javax.xml.stream.XMLStreamWriter;
-
-import org.w3c.dom.Node;
-
-import org.xml.sax.ContentHandler;
-
-public interface Marshaller {
-
-    String JAXB_ENCODING = "jaxb.encoding";
-    String JAXB_FORMATTED_OUTPUT = "jaxb.formatted.output";
-    String JAXB_FRAGMENT = "jaxb.fragment";
-    String JAXB_NO_NAMESPACE_SCHEMA_LOCATION = "jaxb.noNamespaceSchemaLocation";
-    String JAXB_SCHEMA_LOCATION = "jaxb.schemaLocation";
-
-    abstract class Listener {
-        public void beforeMarshal(Object source) {
-        }
-        public void afterMarshal(Object source) {
-        }
-    }
-
-    <A extends XmlAdapter> A getAdapter(Class<A> type);
-
-    AttachmentMarshaller getAttachmentMarshaller();
-
-    ValidationEventHandler getEventHandler() throws JAXBException;
-
-    Listener getListener();
-
-    Node getNode(Object contentTree) throws JAXBException;
-
-    Object getProperty(String name) throws PropertyException;
-
-    Schema getSchema();
-
-    void marshal(Object jaxbElement, ContentHandler handler) throws JAXBException;
-
-    void marshal(Object jaxbElement, File file) throws JAXBException;
-
-    void marshal(Object jaxbElement, Node node) throws JAXBException;
-
-    void marshal(Object jaxbElement, OutputStream os) throws JAXBException;
-
-    void marshal(Object jaxbElement, Result result) throws JAXBException;
-
-    void marshal(Object jaxbElement, Writer writer) throws JAXBException;
-
-    void marshal(Object jaxbElement, XMLEventWriter writer) throws JAXBException;
-
-    void marshal(Object jaxbElement, XMLStreamWriter writer) throws JAXBException;
-
-    <A extends XmlAdapter> void setAdapter(Class<A> type, A adapter);
-
-    void setAdapter(XmlAdapter adapter);
-
-    void setAttachmentMarshaller(AttachmentMarshaller am);
-
-    void setEventHandler(ValidationEventHandler handler) throws JAXBException;
-
-    void setListener(Listener listener);
-
-    void setProperty(String name, Object value) throws PropertyException;
-
-    void setSchema(Schema schema);
-
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/NotIdentifiableEvent.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/NotIdentifiableEvent.java
deleted file mode 100644
index 7ab70c2..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/NotIdentifiableEvent.java
+++ /dev/null
@@ -1,20 +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 javax.xml.bind;
-
-public interface NotIdentifiableEvent extends ValidationEvent {
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/ParseConversionEvent.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/ParseConversionEvent.java
deleted file mode 100644
index fc16ae4..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/ParseConversionEvent.java
+++ /dev/null
@@ -1,20 +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 javax.xml.bind;
-
-public interface ParseConversionEvent extends ValidationEvent {
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/PrintConversionEvent.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/PrintConversionEvent.java
deleted file mode 100644
index 4a9f94f..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/PrintConversionEvent.java
+++ /dev/null
@@ -1,20 +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 javax.xml.bind;
-
-public interface PrintConversionEvent extends ValidationEvent {
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/PropertyException.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/PropertyException.java
deleted file mode 100644
index 23bc367..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/PropertyException.java
+++ /dev/null
@@ -1,45 +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 javax.xml.bind;
-
-public class PropertyException extends JAXBException {
-
-    public PropertyException(String message) {
-        super(message);
-    }
-
-    public PropertyException(String message, String errorCode) {
-        super(message, errorCode);
-    }
-
-    public PropertyException(Throwable cause) {
-        super(cause);
-    }
-
-    public PropertyException(String message, Throwable cause) {
-        super(message, cause);
-    }
-
-    public PropertyException(String message, String errorCode, Throwable cause) {
-        super(message, errorCode, cause);
-    }
-
-    public PropertyException(String name, Object value) {
-        super("name: " + name + ", value: " + value);
-    }
-
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/SchemaOutputResolver.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/SchemaOutputResolver.java
deleted file mode 100644
index d74e563..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/SchemaOutputResolver.java
+++ /dev/null
@@ -1,26 +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 javax.xml.bind;
-
-import java.io.IOException;
-
-import javax.xml.transform.Result;
-
-public abstract class SchemaOutputResolver {
-
-    public abstract Result createOutput(String namespaceUri, String suggestedFileName) throws IOException;
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/TypeConstraintException.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/TypeConstraintException.java
deleted file mode 100644
index 25aa4b8..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/TypeConstraintException.java
+++ /dev/null
@@ -1,79 +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 javax.xml.bind;
-
-import java.io.PrintStream;
-
-public class TypeConstraintException extends RuntimeException {
-
-    private String errorCode;
-    private Throwable linkedException;
-
-    public TypeConstraintException(String message) {
-        this(message, null, null);
-    }
-
-    public TypeConstraintException(String message, String errorCode) {
-        this(message, errorCode, null);
-    }
-
-    public TypeConstraintException(String message, String errorCode, Throwable cause) {
-        super(message);
-        this.errorCode = errorCode;
-        this.linkedException = cause;
-    }
-
-    public TypeConstraintException(String message, Throwable cause) {
-        this(message, null, cause);
-    }
-
-    public TypeConstraintException(Throwable cause) {
-        this(null, null, cause);
-    }
-
-    public String getErrorCode() {
-        return errorCode;
-    }
-
-    public Throwable getLinkedException() {
-        // Do not use getCause() as the cause was never initialized in the constructor
-        return linkedException;
-    }
-
-    public synchronized void setLinkedException(Throwable linkedException) {
-        this.linkedException = linkedException;
-    }
-
-    public String toString() {
-        return linkedException != null ?
-                super.toString() + "\n - with linked exception:\n[" + linkedException.toString() + "]" :
-                super.toString();
-    }
-
-    public void printStackTrace() {
-        printStackTrace(System.err);
-    }
-
-    public void printStackTrace(PrintStream ps) {
-        if (this.linkedException != null) {
-            this.linkedException.printStackTrace(ps);
-            ps.println("--------------- linked to ------------------");
-        }
-        super.printStackTrace(ps);
-    }
-
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/UnmarshalException.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/UnmarshalException.java
deleted file mode 100644
index d17cdb1..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/UnmarshalException.java
+++ /dev/null
@@ -1,40 +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 javax.xml.bind;
-
-public class UnmarshalException extends JAXBException {
-
-    public UnmarshalException(String message) {
-        super(message);
-    }
-
-    public UnmarshalException(String message, String errorCode) {
-        super(message, errorCode);
-    }
-
-    public UnmarshalException(String message, String errorCode, Throwable cause) {
-        super(message, errorCode, cause);
-    }
-
-    public UnmarshalException(String message, Throwable cause) {
-        super(message, cause);
-    }
-
-    public UnmarshalException(Throwable cause) {
-        super(cause);
-    }
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/Unmarshaller.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/Unmarshaller.java
deleted file mode 100644
index 40a774a..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/Unmarshaller.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 javax.xml.bind;
-
-import java.io.File;
-import java.io.InputStream;
-import java.io.Reader;
-import java.net.URL;
-
-import javax.xml.bind.annotation.adapters.XmlAdapter;
-import javax.xml.bind.attachment.AttachmentUnmarshaller;
-import javax.xml.validation.Schema;
-import javax.xml.transform.Source;
-import javax.xml.stream.XMLEventReader;
-import javax.xml.stream.XMLStreamReader;
-
-import org.w3c.dom.Node;
-
-import org.xml.sax.InputSource;
-
-public interface Unmarshaller {
-
-    abstract class Listener {
-        public void beforeUnmarshal(Object target, Object parent) {
-        }
-        public void afterUnmarshal(Object target, Object parent) {
-        }
-    }
-
-    <A extends XmlAdapter> A getAdapter(Class<A> type);
-
-    AttachmentUnmarshaller getAttachmentUnmarshaller();
-
-    ValidationEventHandler getEventHandler() throws JAXBException;
-
-    Listener getListener();
-
-    Object getProperty(String name) throws PropertyException;
-
-    Schema getSchema();
-
-    UnmarshallerHandler getUnmarshallerHandler();
-
-    boolean isValidating() throws JAXBException;
-
-    <A extends XmlAdapter> void setAdapter(Class<A> type, A adapter);
-
-    void setAdapter(XmlAdapter adapter);
-
-    void setAttachmentUnmarshaller(AttachmentUnmarshaller au);
-
-    void setEventHandler(ValidationEventHandler handler) throws JAXBException;
-
-    void setListener(Listener listener);
-
-    void setProperty(String name, Object value) throws PropertyException;
-
-    void setSchema(Schema schema);
-
-    void setValidating(boolean validating) throws JAXBException;
-
-    Object unmarshal(File f) throws JAXBException;
-
-    Object unmarshal(InputSource source) throws JAXBException;
-
-    Object unmarshal(InputStream is) throws JAXBException;
-
-    Object unmarshal(Node node) throws JAXBException;
-
-    <T> JAXBElement<T> unmarshal(Node node, Class<T> declaredType) throws JAXBException;
-
-    Object unmarshal(Reader reader) throws JAXBException;
-
-    Object unmarshal(Source source) throws JAXBException;
-
-    <T> JAXBElement<T> unmarshal(Source source, Class<T> declaredType) throws JAXBException;
-
-    Object unmarshal(URL url) throws JAXBException;
-
-    Object unmarshal(XMLEventReader reader) throws JAXBException;
-
-    <T> JAXBElement<T> unmarshal(XMLEventReader reader, Class<T> declaredType) throws JAXBException;
-
-    Object unmarshal(XMLStreamReader reader) throws JAXBException;
-
-    <T> JAXBElement<T> unmarshal(XMLStreamReader reader, Class<T> declaredType) throws JAXBException;
-
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/UnmarshallerHandler.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/UnmarshallerHandler.java
deleted file mode 100644
index b4bb32b..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/UnmarshallerHandler.java
+++ /dev/null
@@ -1,25 +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 javax.xml.bind;
-
-import org.xml.sax.ContentHandler;
-
-public interface UnmarshallerHandler extends ContentHandler {
-
-    Object getResult() throws JAXBException, IllegalStateException;
-
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/ValidationEvent.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/ValidationEvent.java
deleted file mode 100644
index 64646df..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/ValidationEvent.java
+++ /dev/null
@@ -1,33 +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 javax.xml.bind;
-
-public interface ValidationEvent {
-
-    int ERROR = 1;
-    int FATAL_ERROR = 2;
-    int WARNING = 0;
-
-    Throwable getLinkedException();
-
-    ValidationEventLocator getLocator();
-
-    String getMessage();
-
-    int getSeverity();
-
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/ValidationEventHandler.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/ValidationEventHandler.java
deleted file mode 100644
index 36a8388..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/ValidationEventHandler.java
+++ /dev/null
@@ -1,22 +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 javax.xml.bind;
-
-public interface ValidationEventHandler {
-
-    boolean handleEvent(ValidationEvent event);
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/ValidationEventLocator.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/ValidationEventLocator.java
deleted file mode 100644
index a5fd082..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/ValidationEventLocator.java
+++ /dev/null
@@ -1,36 +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 javax.xml.bind;
-
-import java.net.URL;
-
-import org.w3c.dom.Node;
-
-public interface ValidationEventLocator {
-
-    int getColumnNumber();
-
-    int getLineNumber();
-
-    Node getNode();
-
-    Object getObject();
-
-    int getOffset();
-
-    URL getURL();
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/ValidationException.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/ValidationException.java
deleted file mode 100644
index 78b1a2b..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/ValidationException.java
+++ /dev/null
@@ -1,40 +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 javax.xml.bind;
-
-public class ValidationException extends JAXBException {
-
-    public ValidationException(String message) {
-        super(message);
-    }
-
-    public ValidationException(String message, String errorCode) {
-        super(message, errorCode);
-    }
-
-    public ValidationException(String message, String errorCode, Throwable cause) {
-        super(message, errorCode, cause);
-    }
-
-    public ValidationException(String message, Throwable cause) {
-        super(message, cause);
-    }
-
-    public ValidationException(Throwable cause) {
-        super(cause);
-    }
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/Validator.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/Validator.java
deleted file mode 100644
index 94790bb..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/Validator.java
+++ /dev/null
@@ -1,33 +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 javax.xml.bind;
-
-public interface Validator {
-
-    ValidationEventHandler getEventHandler() throws JAXBException;
-
-    Object getProperty(String name) throws PropertyException;
-
-    void setEventHandler(ValidationEventHandler handler) throws JAXBException;
-
-    void setProperty(String name, Object value) throws PropertyException;
-
-    boolean validate(Object subRoot) throws JAXBException;
-
-    boolean validateRoot(Object rootObj) throws JAXBException;
-
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/DomHandler.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/DomHandler.java
deleted file mode 100644
index e5fbf90..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/DomHandler.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 javax.xml.bind.annotation;
-
-import javax.xml.transform.Result;
-import javax.xml.transform.Source;
-import javax.xml.bind.ValidationEventHandler;
-
-public interface DomHandler<ElementT, ResultT extends Result> {
-
-    ResultT createUnmarshaller(ValidationEventHandler errorHandler);
-
-    ElementT getElement(ResultT rt);
-
-    Source marshal(ElementT n, ValidationEventHandler errorHandler);
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/W3CDomHandler.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/W3CDomHandler.java
deleted file mode 100644
index 2794e14..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/W3CDomHandler.java
+++ /dev/null
@@ -1,78 +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 javax.xml.bind.annotation;
-
-import javax.xml.transform.dom.DOMResult;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.Source;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.bind.ValidationEventHandler;
-
-import org.w3c.dom.Element;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.DocumentFragment;
-
-public class W3CDomHandler implements DomHandler<Element, DOMResult> {
-
-    private DocumentBuilder builder;
-
-    public W3CDomHandler() {
-    }
-
-    public W3CDomHandler(DocumentBuilder builder) {
-        if (builder == null) {
-            throw new IllegalArgumentException();
-        }
-        this.builder = builder;
-    }
-
-    public DOMResult createUnmarshaller(ValidationEventHandler errorHandler) {
-        if (builder == null) {
-            return new DOMResult();
-        } else {
-            return new DOMResult(builder.newDocument());
-        }
-    }
-
-    public DocumentBuilder getBuilder() {
-        return builder;
-    }
-
-    public Element getElement(DOMResult rt) {
-        Node n = rt.getNode();
-        if (n instanceof Document) {
-            return ((Document)n).getDocumentElement();
-        }
-        if (n instanceof Element) {
-            return (Element)n;
-        }
-        if (n instanceof DocumentFragment) {
-            return (Element)n.getChildNodes().item(0);
-        } else {
-            throw new IllegalStateException(n.toString());
-        }
-    }
-
-    public Source marshal(Element n, ValidationEventHandler errorHandler) {
-        return new DOMSource(n);
-    }
-
-    public void setBuilder(DocumentBuilder builder) {
-        this.builder = builder;
-    }
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlAccessOrder.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlAccessOrder.java
deleted file mode 100644
index 45d6bc0..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlAccessOrder.java
+++ /dev/null
@@ -1,24 +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 javax.xml.bind.annotation;
-
-public enum XmlAccessOrder {
-
-    ALPHABETICAL,
-    UNDEFINED
-    
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlAccessType.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlAccessType.java
deleted file mode 100644
index a34a650..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlAccessType.java
+++ /dev/null
@@ -1,27 +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 javax.xml.bind.annotation;
-
-public enum XmlAccessType {
-
-    FIELD,
-    NONE,
-    PROPERTY,
-    PUBLIC_MEMBER
-    
-
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlAccessorOrder.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlAccessorOrder.java
deleted file mode 100644
index d800634..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlAccessorOrder.java
+++ /dev/null
@@ -1,31 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Inherited
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.PACKAGE, ElementType.TYPE})
-public @interface XmlAccessorOrder {
-
-    XmlAccessOrder value() default XmlAccessOrder.UNDEFINED;
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlAccessorType.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlAccessorType.java
deleted file mode 100644
index 6662588..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlAccessorType.java
+++ /dev/null
@@ -1,31 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Inherited
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value  = {ElementType.PACKAGE, ElementType.TYPE })
-public @interface XmlAccessorType {
-
-    XmlAccessType value() default XmlAccessType.PUBLIC_MEMBER;
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlAnyAttribute.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlAnyAttribute.java
deleted file mode 100644
index 41ab490..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlAnyAttribute.java
+++ /dev/null
@@ -1,27 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value  = {ElementType.FIELD, ElementType.METHOD })
-public @interface XmlAnyAttribute {
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlAnyElement.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlAnyElement.java
deleted file mode 100644
index 3828a9e..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlAnyElement.java
+++ /dev/null
@@ -1,31 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value  = {ElementType.FIELD, ElementType.METHOD })
-public @interface XmlAnyElement {
-
-    boolean lax() default false;
-
-    Class<? extends DomHandler> value() default W3CDomHandler.class;
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlAttachmentRef.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlAttachmentRef.java
deleted file mode 100644
index 23bd034..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlAttachmentRef.java
+++ /dev/null
@@ -1,27 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value  = {ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER })
-public @interface XmlAttachmentRef {
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlAttribute.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlAttribute.java
deleted file mode 100644
index ed2fb7c..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlAttribute.java
+++ /dev/null
@@ -1,33 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value  = {ElementType.FIELD, ElementType.METHOD })
-public @interface XmlAttribute {
-
-    String name() default "##default";
-
-    boolean required() default false;
-
-    String namespace() default "##default";
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElement.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElement.java
deleted file mode 100644
index e45cbad..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElement.java
+++ /dev/null
@@ -1,42 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value  = {ElementType.FIELD, ElementType.METHOD })
-public @interface XmlElement {
-
-    final class DEFAULT {
-    }
-
-    String name() default "##default";
-
-    boolean nillable() default false;
-
-    boolean required() default false;
-
-    String namespace() default "##default";
-
-    String defaultValue() default "\u0000";
-
-    Class type() default DEFAULT.class;
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElementDecl.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElementDecl.java
deleted file mode 100644
index 783370b..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElementDecl.java
+++ /dev/null
@@ -1,43 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.METHOD)
-public @interface XmlElementDecl {
-
-    final class GLOBAL {
-    }
-
-    String name();
-
-    Class scope() default GLOBAL.class;
-
-    String namespace() default "##default";
-
-    String substitutionHeadNamespace() default "##default";
-
-    String substitutionHeadName() default "";
-
-    String defaultValue() default "\u0000";
-
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElementRef.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElementRef.java
deleted file mode 100644
index ffdde6d..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElementRef.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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.FIELD, ElementType.METHOD})
-public @interface XmlElementRef {
-
-    final class DEFAULT {
-    }
-
-    String name() default "##default";
-
-    String namespace() default "";
-
-    Class type() default DEFAULT.class;
-
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElementRefs.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElementRefs.java
deleted file mode 100644
index 2e56e41..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElementRefs.java
+++ /dev/null
@@ -1,29 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.FIELD, ElementType.METHOD})
-public @interface XmlElementRefs {
-
-    XmlElementRef[] value();
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElementWrapper.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElementWrapper.java
deleted file mode 100644
index a6a1a04..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElementWrapper.java
+++ /dev/null
@@ -1,36 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.FIELD, ElementType.METHOD})
-public @interface XmlElementWrapper {
-
-    String name() default "##default";
-
-    String namespace() default "##default";
-
-    boolean nillable() default false;
-
-    boolean required() default false;
-
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElements.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElements.java
deleted file mode 100644
index f213cb6..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlElements.java
+++ /dev/null
@@ -1,29 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.FIELD, ElementType.METHOD})
-public @interface XmlElements {
-
-    XmlElement[] value();
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlEnum.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlEnum.java
deleted file mode 100644
index 6700a99..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlEnum.java
+++ /dev/null
@@ -1,29 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
-public @interface XmlEnum {
-
-    Class<?> value() default String.class;
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlEnumValue.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlEnumValue.java
deleted file mode 100644
index 62a97eb..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlEnumValue.java
+++ /dev/null
@@ -1,29 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.FIELD)
-public @interface XmlEnumValue {
-
-    String value();
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlID.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlID.java
deleted file mode 100644
index 8a5bfdb..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlID.java
+++ /dev/null
@@ -1,27 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.FIELD, ElementType.METHOD})
-public @interface XmlID {
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlIDREF.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlIDREF.java
deleted file mode 100644
index 3cd2c98..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlIDREF.java
+++ /dev/null
@@ -1,27 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.FIELD, ElementType.METHOD})
-public @interface XmlIDREF {
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlInlineBinaryData.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlInlineBinaryData.java
deleted file mode 100644
index ded1639..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlInlineBinaryData.java
+++ /dev/null
@@ -1,27 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
-public @interface XmlInlineBinaryData {
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlList.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlList.java
deleted file mode 100644
index d28b510..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlList.java
+++ /dev/null
@@ -1,28 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
-public @interface XmlList {
-
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlMimeType.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlMimeType.java
deleted file mode 100644
index f7f8ec3..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlMimeType.java
+++ /dev/null
@@ -1,29 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
-public @interface XmlMimeType {
-
-    String value();
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlMixed.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlMixed.java
deleted file mode 100644
index ac052fe..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlMixed.java
+++ /dev/null
@@ -1,27 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.FIELD, ElementType.METHOD})
-public @interface XmlMixed {
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlNs.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlNs.java
deleted file mode 100644
index c43f6f9..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlNs.java
+++ /dev/null
@@ -1,31 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {})
-public @interface XmlNs {
-
-    String namespaceURI();
-
-    String prefix();
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlNsForm.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlNsForm.java
deleted file mode 100644
index 60e93f9..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlNsForm.java
+++ /dev/null
@@ -1,25 +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 javax.xml.bind.annotation;
-
-public enum XmlNsForm {
-
-    UNQUALIFIED,
-    QUALIFIED,
-    UNSET
-    
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlRegistry.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlRegistry.java
deleted file mode 100644
index 06733ec..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlRegistry.java
+++ /dev/null
@@ -1,27 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
-public @interface XmlRegistry {
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlRootElement.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlRootElement.java
deleted file mode 100644
index 981043d..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlRootElement.java
+++ /dev/null
@@ -1,31 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
-public @interface XmlRootElement {
-
-    String name() default "##default";
-
-    String namespace() default "##default";
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlSchema.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlSchema.java
deleted file mode 100644
index 9541225..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlSchema.java
+++ /dev/null
@@ -1,39 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.PACKAGE)
-public @interface XmlSchema {
-
-    XmlNsForm attributeFormDefault() default XmlNsForm.UNSET;
-
-    XmlNsForm elementFormDefault() default XmlNsForm.UNSET;
-
-    String namespace() default "";
-
-    XmlNs[] xmlns() default {};
-
-    String location() default NO_LOCATION;
-
-    static final String NO_LOCATION = "##generate";
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlSchemaType.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlSchemaType.java
deleted file mode 100644
index 0ab565a..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlSchemaType.java
+++ /dev/null
@@ -1,36 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.FIELD, ElementType.METHOD, ElementType.PACKAGE})
-public @interface XmlSchemaType {
-
-    final class DEFAULT {
-    }
-
-    String name();
-
-    String namespace() default "http://www.w3.org/2001/XMLSchema";
-
-    Class type() default DEFAULT.class;
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlSchemaTypes.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlSchemaTypes.java
deleted file mode 100644
index 0dc20e1..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlSchemaTypes.java
+++ /dev/null
@@ -1,29 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.PACKAGE)
-public @interface XmlSchemaTypes {
-
-    XmlSchemaType[] value();
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlSeeAlso.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlSeeAlso.java
deleted file mode 100644
index 8a2f1c9..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlSeeAlso.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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ElementType.TYPE})
-public @interface XmlSeeAlso {
-
-    Class[] value();
-
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlTransient.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlTransient.java
deleted file mode 100644
index 74179a1..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlTransient.java
+++ /dev/null
@@ -1,27 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
-public @interface XmlTransient {
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlType.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlType.java
deleted file mode 100644
index 596fc96..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlType.java
+++ /dev/null
@@ -1,40 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
-public @interface XmlType {
-
-    final class DEFAULT {
-    }
-
-    Class factoryClass() default DEFAULT.class;
-
-    String factoryMethod() default "";
-
-    String name() default "##default";
-
-    String namespace() default "##default";
-
-    String[] propOrder() default "";
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlValue.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlValue.java
deleted file mode 100644
index ee9a41d..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/XmlValue.java
+++ /dev/null
@@ -1,27 +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 javax.xml.bind.annotation;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.FIELD, ElementType.METHOD})
-public @interface XmlValue {
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/adapters/CollapsedStringAdapter.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/adapters/CollapsedStringAdapter.java
deleted file mode 100644
index 4266ab6..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/adapters/CollapsedStringAdapter.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 javax.xml.bind.annotation.adapters;
-
-public class CollapsedStringAdapter extends XmlAdapter<String, String> {
-
-    public String marshal(String v) {
-        return v;
-    }
-
-    public String unmarshal(String v) {
-        if(v == null) {
-            return null;
-        }
-        int len = v.length();
-        int s;
-        for (s = 0; s < len && !isWhiteSpace(v.charAt(s)); s++);
-        if (s == len) {
-            return v;
-        }
-        StringBuffer result = new StringBuffer(len);
-        if (s != 0) {
-            for(int i = 0; i < s; i++) {
-                result.append(v.charAt(i));
-            }
-            result.append(' ');
-        }
-        boolean inStripMode = true;
-        for (int i = s + 1; i < len; i++) {
-            char ch = v.charAt(i);
-            boolean b = isWhiteSpace(ch);
-            if (inStripMode && b) {
-                continue;
-            }
-            inStripMode = b;
-            result.append(inStripMode ? ' ' : ch);
-        }
-        len = result.length();
-        if (len > 0 && result.charAt(len - 1) == ' ') {
-            result.setLength(len - 1);
-        }
-        return result.toString();
-    }
-
-    protected static boolean isWhiteSpace(char ch) {
-        if (ch > ' ') {
-            return false;
-        } else {
-            return ch == '\t' || ch == '\n' || ch == '\r' || ch == ' ';
-        }
-    }
-
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/adapters/HexBinaryAdapter.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/adapters/HexBinaryAdapter.java
deleted file mode 100644
index a3359f1..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/adapters/HexBinaryAdapter.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 javax.xml.bind.annotation.adapters;
-
-import javax.xml.bind.DatatypeConverter;
-
-public final class HexBinaryAdapter extends XmlAdapter<String, byte[]> {
-
-    public String marshal(byte[] v) {
-        return DatatypeConverter.printHexBinary(v);
-    }
-
-    public byte[] unmarshal(String v) {
-        return DatatypeConverter.parseHexBinary(v);
-    }
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/adapters/NormalizedStringAdapter.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/adapters/NormalizedStringAdapter.java
deleted file mode 100644
index f0071e9..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/adapters/NormalizedStringAdapter.java
+++ /dev/null
@@ -1,52 +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 javax.xml.bind.annotation.adapters;
-
-public final class NormalizedStringAdapter extends XmlAdapter<String, String> {
-
-    public String marshal(String v) {
-        return v;
-    }
-
-    public String unmarshal(String v) {
-        if (v == null) {
-            return null;
-        }
-        int i;
-        for (i = v.length() - 1; i >= 0 && !isWhiteSpaceExceptSpace(v.charAt(i)); i--);
-        if (i < 0) {
-            return v;
-        }
-        char buf[] = v.toCharArray();
-        buf[i--] = ' ';
-        for(; i >= 0; i--) {
-            if(isWhiteSpaceExceptSpace(buf[i])) {
-                buf[i] = ' ';
-            }
-        }
-        return new String(buf);
-    }
-
-    protected static boolean isWhiteSpaceExceptSpace(char ch) {
-        if (ch >= ' ') {
-            return false;
-        } else {
-            return ch == '\t' || ch == '\n' || ch == '\r';
-        }
-    }
-
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/adapters/XmlAdapter.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/adapters/XmlAdapter.java
deleted file mode 100644
index 0a1c2fe..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/adapters/XmlAdapter.java
+++ /dev/null
@@ -1,27 +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 javax.xml.bind.annotation.adapters;
-
-public abstract class XmlAdapter<ValueType, BoundType> {
-
-    protected XmlAdapter() {
-    }
-
-    public abstract ValueType marshal(BoundType v) throws Exception;
-
-    public abstract BoundType unmarshal(ValueType v) throws Exception;
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/adapters/XmlJavaTypeAdapter.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/adapters/XmlJavaTypeAdapter.java
deleted file mode 100644
index cb8e530..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/adapters/XmlJavaTypeAdapter.java
+++ /dev/null
@@ -1,34 +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 javax.xml.bind.annotation.adapters;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.PACKAGE, ElementType.FIELD, ElementType.METHOD, ElementType.TYPE, ElementType.PARAMETER})
-public @interface XmlJavaTypeAdapter {
-
-    final class DEFAULT {
-    }
-
-    Class<? extends XmlAdapter> value();
-
-    Class type() default DEFAULT.class;
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/adapters/XmlJavaTypeAdapters.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/adapters/XmlJavaTypeAdapters.java
deleted file mode 100644
index a3c85ce..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/annotation/adapters/XmlJavaTypeAdapters.java
+++ /dev/null
@@ -1,29 +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 javax.xml.bind.annotation.adapters;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.PACKAGE})
-public @interface XmlJavaTypeAdapters {
-
-    XmlJavaTypeAdapter[] value();
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/attachment/AttachmentMarshaller.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/attachment/AttachmentMarshaller.java
deleted file mode 100644
index 6a768b3..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/attachment/AttachmentMarshaller.java
+++ /dev/null
@@ -1,32 +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 javax.xml.bind.attachment;
-
-import javax.activation.DataHandler;
-
-public abstract class AttachmentMarshaller {
-
-    public abstract String addMtomAttachment(byte[] data, int offset, int length, String mimeType, String elementNamespace, String elementLocalName);
-
-    public abstract String addMtomAttachment(DataHandler data, String elementNamespace, String elementLocalName);
-
-    public abstract String addSwaRefAttachment(DataHandler data);
-
-    public boolean isXOPPackage() {
-        return false;
-    }
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/attachment/AttachmentUnmarshaller.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/attachment/AttachmentUnmarshaller.java
deleted file mode 100644
index d67426b..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/attachment/AttachmentUnmarshaller.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 javax.xml.bind.attachment;
-
-import javax.activation.DataHandler;
-
-public abstract class AttachmentUnmarshaller {
-
-    public abstract byte[] getAttachmentAsByteArray(String cid);
-
-    public abstract DataHandler getAttachmentAsDataHandler(String cid);
-
-    public boolean isXOPPackage() {
-        return false;
-    }
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/helpers/AbstractMarshallerImpl.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/helpers/AbstractMarshallerImpl.java
deleted file mode 100644
index a00dcb3..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/helpers/AbstractMarshallerImpl.java
+++ /dev/null
@@ -1,302 +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 javax.xml.bind.helpers;
-
-import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
-import java.io.Writer;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.BufferedOutputStream;
-import java.io.IOException;
-
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Marshaller;
-import javax.xml.bind.PropertyException;
-import javax.xml.bind.ValidationEventHandler;
-import javax.xml.bind.annotation.adapters.XmlAdapter;
-import javax.xml.bind.attachment.AttachmentMarshaller;
-import javax.xml.stream.XMLEventWriter;
-import javax.xml.stream.XMLStreamWriter;
-import javax.xml.transform.dom.DOMResult;
-import javax.xml.transform.sax.SAXResult;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.Result;
-import javax.xml.validation.Schema;
-
-import org.w3c.dom.Node;
-
-import org.xml.sax.ContentHandler;
-
-public abstract class AbstractMarshallerImpl implements Marshaller {
-
-    static String aliases[] = {
-            "UTF-8", "UTF8",
-            "UTF-16", "Unicode",
-            "UTF-16BE", "UnicodeBigUnmarked",
-            "UTF-16LE", "UnicodeLittleUnmarked",
-            "US-ASCII", "ASCII",
-            "TIS-620", "TIS620",
-            "ISO-10646-UCS-2", "Unicode",
-            "EBCDIC-CP-US", "cp037",
-            "EBCDIC-CP-CA", "cp037",
-            "EBCDIC-CP-NL", "cp037",
-            "EBCDIC-CP-WT", "cp037",
-            "EBCDIC-CP-DK", "cp277",
-            "EBCDIC-CP-NO", "cp277",
-            "EBCDIC-CP-FI", "cp278",
-            "EBCDIC-CP-SE", "cp278",
-            "EBCDIC-CP-IT", "cp280",
-            "EBCDIC-CP-ES", "cp284",
-            "EBCDIC-CP-GB", "cp285",
-            "EBCDIC-CP-FR", "cp297",
-            "EBCDIC-CP-AR1", "cp420",
-            "EBCDIC-CP-HE", "cp424",
-            "EBCDIC-CP-BE", "cp500",
-            "EBCDIC-CP-CH", "cp500",
-            "EBCDIC-CP-ROECE", "cp870",
-            "EBCDIC-CP-YU", "cp870",
-            "EBCDIC-CP-IS", "cp871",
-            "EBCDIC-CP-AR2", "cp918"
-    };
-
-    private ValidationEventHandler eventHandler = new DefaultValidationEventHandler();
-    private String encoding = "UTF-8";
-    private String schemaLocation;
-    private String noNSSchemaLocation;
-    private boolean formattedOutput;
-    private boolean fragment;
-
-    public void marshal(Object obj, File file) throws JAXBException {
-        checkNotNull(obj, "obj", file, "file");
-        try {
-            OutputStream os = new BufferedOutputStream(new FileOutputStream(file));
-            try {
-                marshal(obj, new StreamResult(os));
-            } finally {
-                os.close();
-            }
-        } catch (IOException e) {
-            throw new JAXBException(e);
-        }
-    }
-
-    public final void marshal(Object obj, OutputStream os) throws JAXBException {
-        checkNotNull(obj, "obj", os, "os");
-        marshal(obj, new StreamResult(os));
-    }
-
-    public final void marshal(Object obj, Writer w) throws JAXBException {
-        checkNotNull(obj, "obj", w, "writer");
-        marshal(obj, new StreamResult(w));
-    }
-
-    public final void marshal(Object obj, ContentHandler handler) throws JAXBException {
-        checkNotNull(obj, "obj", handler, "handler");
-        marshal(obj, new SAXResult(handler));
-    }
-
-    public final void marshal(Object obj, Node node) throws JAXBException {
-        checkNotNull(obj, "obj", node, "node");
-        marshal(obj, new DOMResult(node));
-    }
-
-    public Node getNode(Object obj) throws JAXBException {
-        checkNotNull(obj, "obj", "foo", "bar");
-        throw new UnsupportedOperationException();
-    }
-
-    protected String getEncoding() {
-        return encoding;
-    }
-
-    protected void setEncoding(String encoding) {
-        this.encoding = encoding;
-    }
-
-    protected String getSchemaLocation() {
-        return schemaLocation;
-    }
-
-    protected void setSchemaLocation(String location) {
-        schemaLocation = location;
-    }
-
-    protected String getNoNSSchemaLocation() {
-        return noNSSchemaLocation;
-    }
-
-    protected void setNoNSSchemaLocation(String location) {
-        noNSSchemaLocation = location;
-    }
-
-    protected boolean isFormattedOutput() {
-        return formattedOutput;
-    }
-
-    protected void setFormattedOutput(boolean v) {
-        formattedOutput = v;
-    }
-
-    protected boolean isFragment() {
-        return fragment;
-    }
-
-    protected void setFragment(boolean v) {
-        fragment = v;
-    }
-
-    protected String getJavaEncoding(String encoding) throws UnsupportedEncodingException {
-        try {
-            "dummy".getBytes(encoding);
-            return encoding;
-        }
-        catch (UnsupportedEncodingException e) {
-        }
-        for (int i = 0; i < aliases.length; i += 2) {
-            if (encoding.equals(aliases[i])) {
-                "dummy".getBytes(aliases[i + 1]);
-                return aliases[i + 1];
-            }
-        }
-        throw new UnsupportedEncodingException(encoding);
-    }
-
-    public void setProperty(String name, Object value) throws PropertyException {
-        if (name == null) {
-            throw new IllegalArgumentException("name must not be null");
-        }
-        if (JAXB_ENCODING.equals(name)) {
-            checkString(name, value);
-            setEncoding((String) value);
-        } else if (JAXB_FORMATTED_OUTPUT.equals(name)) {
-            checkBoolean(name, value);
-            setFormattedOutput(((Boolean) value).booleanValue());
-        } else if (JAXB_NO_NAMESPACE_SCHEMA_LOCATION.equals(name)) {
-            checkString(name, value);
-            setNoNSSchemaLocation((String) value);
-        } else if (JAXB_SCHEMA_LOCATION.equals(name)) {
-            checkString(name, value);
-            setSchemaLocation((String) value);
-        } else if (JAXB_FRAGMENT.equals(name)) {
-            checkBoolean(name, value);
-            setFragment(((Boolean) value).booleanValue());
-        } else {
-            throw new PropertyException(name, value);
-        }
-    }
-
-    public Object getProperty(String name) throws PropertyException {
-        if (name == null) {
-            throw new IllegalArgumentException("name must not be null");
-        }
-        if (JAXB_ENCODING.equals(name)) {
-            return getEncoding();
-        } else if (JAXB_FORMATTED_OUTPUT.equals(name)) {
-            return isFormattedOutput() ? Boolean.TRUE : Boolean.FALSE;
-        } else if (JAXB_NO_NAMESPACE_SCHEMA_LOCATION.equals(name)) {
-            return getNoNSSchemaLocation();
-        } else if (JAXB_SCHEMA_LOCATION.equals(name)) {
-            return getSchemaLocation();
-        } else if (JAXB_FRAGMENT.equals(name)) {
-            return isFragment() ? Boolean.TRUE : Boolean.FALSE;
-        } else {
-            throw new PropertyException(name);
-        }
-    }
-
-    public ValidationEventHandler getEventHandler() throws JAXBException {
-        return eventHandler;
-    }
-
-    public void setEventHandler(ValidationEventHandler handler) throws JAXBException {
-        if (handler == null) {
-            eventHandler = new DefaultValidationEventHandler();
-        } else {
-            eventHandler = handler;
-        }
-    }
-
-    private void checkBoolean(String name, Object value) throws PropertyException {
-        if (!(value instanceof Boolean)) {
-            throw new PropertyException(name + " must be a boolean");
-        }
-    }
-
-    private void checkString(String name, Object value) throws PropertyException {
-        if (!(value instanceof String)) {
-            throw new PropertyException(name + " must be a string");
-        }
-    }
-
-    private void checkNotNull(Object o1, String o1Name, Object o2, String o2Name) {
-        if (o1 == null) {
-            throw new IllegalArgumentException(o1Name + " must not be null");
-        }
-        if (o2 == null) {
-            throw new IllegalArgumentException(o2Name + " must not be null");
-        }
-    }
-
-    public void marshal(Object obj, XMLEventWriter writer)
-            throws JAXBException {
-        throw new UnsupportedOperationException();
-    }
-
-    public void marshal(Object obj, XMLStreamWriter writer) throws JAXBException {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setSchema(Schema schema) {
-        throw new UnsupportedOperationException();
-    }
-
-    public Schema getSchema() {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setAdapter(XmlAdapter adapter) {
-        if (adapter == null) {
-            throw new IllegalArgumentException();
-        }
-        setAdapter((Class<XmlAdapter>) adapter.getClass(), adapter);
-    }
-
-    public <A extends XmlAdapter> void setAdapter(Class<A> type, A adapter) {
-        throw new UnsupportedOperationException();
-    }
-
-    public <A extends XmlAdapter> A getAdapter(Class<A> type) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setAttachmentMarshaller(AttachmentMarshaller am) {
-        throw new UnsupportedOperationException();
-    }
-
-    public AttachmentMarshaller getAttachmentMarshaller() {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setListener(javax.xml.bind.Marshaller.Listener listener) {
-        throw new UnsupportedOperationException();
-    }
-
-    public javax.xml.bind.Marshaller.Listener getListener() {
-        throw new UnsupportedOperationException();
-    }
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/helpers/AbstractUnmarshallerImpl.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/helpers/AbstractUnmarshallerImpl.java
deleted file mode 100644
index fe14154..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/helpers/AbstractUnmarshallerImpl.java
+++ /dev/null
@@ -1,256 +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 javax.xml.bind.helpers;
-
-import java.io.File;
-import java.io.InputStream;
-import java.io.Reader;
-import java.net.URL;
-import java.net.MalformedURLException;
-
-import javax.xml.bind.Unmarshaller;
-import javax.xml.bind.ValidationEventHandler;
-import javax.xml.bind.UnmarshallerHandler;
-import javax.xml.bind.JAXBElement;
-import javax.xml.bind.UnmarshalException;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.PropertyException;
-import javax.xml.bind.attachment.AttachmentUnmarshaller;
-import javax.xml.bind.annotation.adapters.XmlAdapter;
-import javax.xml.validation.Schema;
-import javax.xml.transform.Source;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.transform.sax.SAXSource;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.stream.XMLEventReader;
-import javax.xml.stream.XMLStreamReader;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParserFactory;
-
-import org.w3c.dom.Node;
-
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-
-public abstract class AbstractUnmarshallerImpl implements Unmarshaller {
-
-    protected boolean validating;
-    private ValidationEventHandler eventHandler;
-    private XMLReader reader;
-
-    protected UnmarshalException createUnmarshalException(SAXException e) {
-        Exception nested = e.getException();
-        if (nested instanceof UnmarshalException) {
-            return (UnmarshalException)nested;
-        } else if(nested instanceof RuntimeException) {
-            throw (RuntimeException)nested;
-        } else if (nested != null) {
-            return new UnmarshalException(nested);
-        } else {
-            return new UnmarshalException(e);
-        }
-    }
-
-    protected XMLReader getXMLReader() throws JAXBException {
-        if (reader == null) {
-            try {
-                SAXParserFactory parserFactory = SAXParserFactory.newInstance();
-                parserFactory.setNamespaceAware(true);
-                parserFactory.setValidating(false);
-                reader = parserFactory.newSAXParser().getXMLReader();
-            } catch(ParserConfigurationException e) {
-                throw new JAXBException(e);
-            } catch(SAXException e) {
-                throw new JAXBException(e);
-            }
-        }
-        return reader;
-    }
-
-    public <A extends XmlAdapter> A getAdapter(Class<A> type) {
-        throw new UnsupportedOperationException();
-    }
-
-    public AttachmentUnmarshaller getAttachmentUnmarshaller() {
-        throw new UnsupportedOperationException();
-    }
-
-    public ValidationEventHandler getEventHandler() throws JAXBException {
-        return eventHandler;
-    }
-
-    public Listener getListener() {
-        throw new UnsupportedOperationException();
-    }
-
-    public Object getProperty(String name) throws PropertyException {
-        if(name == null) {
-            throw new IllegalArgumentException("name must not be null");
-        }
-        throw new PropertyException(name);
-    }
-
-    public Schema getSchema() {
-        throw new UnsupportedOperationException();
-    }
-
-    public boolean isValidating() throws JAXBException {
-        return validating;
-    }
-
-    public <A extends XmlAdapter> void setAdapter(Class<A> type, A adapter) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setAdapter(XmlAdapter adapter) {
-        if (adapter == null) {
-            throw new IllegalArgumentException();
-        }
-        setAdapter((Class<XmlAdapter>) adapter.getClass(), adapter);
-    }
-
-    public void setAttachmentUnmarshaller(AttachmentUnmarshaller au) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setEventHandler(ValidationEventHandler handler) throws JAXBException {
-        if (handler == null) {
-            handler = new DefaultValidationEventHandler();
-        }
-        eventHandler = handler;
-    }
-
-    public void setListener(Listener listener) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setProperty(String name, Object value) throws PropertyException {
-        if(name == null) {
-            throw new IllegalArgumentException("name must not be null");
-        }
-        throw new PropertyException(name, value);
-    }
-
-    public void setSchema(Schema schema) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setValidating(boolean validating) throws JAXBException {
-        this.validating = validating;
-    }
-
-    public final Object unmarshal(File file) throws JAXBException {
-        if (file == null) {
-            throw new IllegalArgumentException("file must not be null");
-        }
-        try
-        {
-            String path = file.getAbsolutePath();
-            if (File.separatorChar != '/') {
-                path = path.replace(File.separatorChar, '/');
-            }
-            if (!path.startsWith("/")) {
-                path = "/" + path;
-            }
-            if (!path.endsWith("/") && file.isDirectory()) {
-                path = path + "/";
-            }
-            return unmarshal(new URL("file", "", path));
-        }
-        catch(MalformedURLException e) {
-            throw new IllegalArgumentException(e.getMessage());
-        }
-    }
-
-    public final Object unmarshal(InputSource source) throws JAXBException {
-        if (source == null) {
-            throw new IllegalArgumentException("source must not be null");
-        }
-        return unmarshal(getXMLReader(), source);
-    }
-
-    public final Object unmarshal(InputStream is) throws JAXBException {
-        if (is == null) {
-            throw new IllegalArgumentException("is must not be null");
-        }
-        return unmarshal(new InputSource(is));
-    }
-
-    public <T> JAXBElement<T> unmarshal(Node node, Class<T> declaredType) throws JAXBException {
-        throw new UnsupportedOperationException();
-    }
-
-    public final Object unmarshal(Reader reader) throws JAXBException {
-        if (reader == null) {
-            throw new IllegalArgumentException("reader must not be null");
-        }
-        return unmarshal(new InputSource(reader));
-    }
-
-    public Object unmarshal(Source source) throws JAXBException {
-        if (source == null) {
-            throw new IllegalArgumentException("source must not be null");
-        } else if (source instanceof SAXSource) {
-            SAXSource saxSource = (SAXSource) source;
-            XMLReader reader = saxSource.getXMLReader();
-            if (reader == null) {
-                reader = getXMLReader();
-            }
-            return unmarshal(reader, saxSource.getInputSource());
-        } else if (source instanceof StreamSource) {
-            StreamSource ss = (StreamSource) source;
-            InputSource is = new InputSource();
-            is.setSystemId(ss.getSystemId());
-            is.setByteStream(ss.getInputStream());
-            is.setCharacterStream(ss.getReader());
-            return unmarshal(is);
-        } else if (source instanceof DOMSource)
-            return unmarshal(((DOMSource) source).getNode());
-        else
-            throw new IllegalArgumentException();
-    }
-
-    protected abstract Object unmarshal(XMLReader xmlreader, InputSource inputsource) throws JAXBException;
-
-    public <T> JAXBElement<T> unmarshal(Source source, Class<T> declaredType) throws JAXBException {
-        throw new UnsupportedOperationException();
-    }
-
-    public final Object unmarshal(URL url) throws JAXBException {
-        if(url == null) {
-            throw new IllegalArgumentException("url must not be null");
-        }
-        return unmarshal(new InputSource(url.toExternalForm()));
-    }
-
-    public Object unmarshal(XMLEventReader reader) throws JAXBException {
-        throw new UnsupportedOperationException();
-    }
-
-    public <T> JAXBElement<T> unmarshal(XMLEventReader reader, Class<T> declaredType) throws JAXBException {
-        throw new UnsupportedOperationException();
-    }
-
-    public Object unmarshal(XMLStreamReader reader) throws JAXBException {
-        throw new UnsupportedOperationException();
-    }
-
-    public <T> JAXBElement<T> unmarshal(XMLStreamReader reader, Class<T> declaredType) throws JAXBException {
-        throw new UnsupportedOperationException();
-    }
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/helpers/DefaultValidationEventHandler.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/helpers/DefaultValidationEventHandler.java
deleted file mode 100644
index d54d458..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/helpers/DefaultValidationEventHandler.java
+++ /dev/null
@@ -1,82 +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 javax.xml.bind.helpers;
-
-import java.net.URL;
-
-import javax.xml.bind.ValidationEventHandler;
-import javax.xml.bind.ValidationEvent;
-import javax.xml.bind.ValidationEventLocator;
-
-import org.w3c.dom.Node;
-
-public class DefaultValidationEventHandler implements ValidationEventHandler {
-
-    public boolean handleEvent(ValidationEvent event) {
-        if (event == null) {
-            throw new IllegalArgumentException();
-        }
-        String severity = null;
-        boolean retVal = false;
-        switch(event.getSeverity()) {
-        case ValidationEvent.WARNING:
-            severity = "[WARNING]: ";
-            retVal = true;
-            break;
-
-        case ValidationEvent.ERROR:
-            severity = "[ERROR]: ";
-            retVal = false;
-            break;
-
-        case ValidationEvent.FATAL_ERROR:
-            severity = "[FATAL_ERROR]: ";
-            retVal = false;
-            break;
-        }
-        String location = getLocation(event);
-        System.out.println("DefaultValidationEventHandler " + severity + " " + event.getMessage() + "\n     Location: " + location);
-        return retVal;
-    }
-
-    private String getLocation(ValidationEvent event) {
-        StringBuffer msg = new StringBuffer();
-        ValidationEventLocator locator = event.getLocator();
-        if (locator != null) {
-            URL url = locator.getURL();
-            Object obj = locator.getObject();
-            Node node = locator.getNode();
-            int line = locator.getLineNumber();
-            if(url != null || line != -1) {
-                msg.append("line ").append(line);
-                if(url != null) {
-                    msg.append(" of ").append(url);
-                }
-            } else {
-                if (obj != null) {
-                    msg.append(" obj: ").append(obj.toString());
-                } else if(node != null) {
-                    msg.append(" node: ").append(node.toString());
-                }
-            }
-        } else {
-            msg.append("unavailable");
-        }
-        return msg.toString();
-    }
-
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/helpers/NotIdentifiableEventImpl.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/helpers/NotIdentifiableEventImpl.java
deleted file mode 100644
index 8a08cdd..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/helpers/NotIdentifiableEventImpl.java
+++ /dev/null
@@ -1,31 +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 javax.xml.bind.helpers;
-
-import javax.xml.bind.NotIdentifiableEvent;
-import javax.xml.bind.ValidationEventLocator;
-
-public class NotIdentifiableEventImpl extends ValidationEventImpl implements NotIdentifiableEvent {
-
-    public NotIdentifiableEventImpl(int severity, String message, ValidationEventLocator locator) {
-        super(severity, message, locator);
-    }
-
-    public NotIdentifiableEventImpl(int severity, String message, ValidationEventLocator locator, Throwable linkedException) {
-        super(severity, message, locator, linkedException);
-    }
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/helpers/ParseConversionEventImpl.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/helpers/ParseConversionEventImpl.java
deleted file mode 100644
index 5e88c93..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/helpers/ParseConversionEventImpl.java
+++ /dev/null
@@ -1,31 +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 javax.xml.bind.helpers;
-
-import javax.xml.bind.ParseConversionEvent;
-import javax.xml.bind.ValidationEventLocator;
-
-public class ParseConversionEventImpl extends ValidationEventImpl implements ParseConversionEvent {
-
-    public ParseConversionEventImpl(int severity, String message, ValidationEventLocator locator) { 
-        super(severity, message, locator);
-    }
-
-    public ParseConversionEventImpl(int severity, String message, ValidationEventLocator locator, Throwable linkedException) {
-        super(severity, message, locator, linkedException);
-    }
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/helpers/PrintConversionEventImpl.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/helpers/PrintConversionEventImpl.java
deleted file mode 100644
index b0eb10f..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/helpers/PrintConversionEventImpl.java
+++ /dev/null
@@ -1,31 +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 javax.xml.bind.helpers;
-
-import javax.xml.bind.PrintConversionEvent;
-import javax.xml.bind.ValidationEventLocator;
-
-public class PrintConversionEventImpl extends ValidationEventImpl implements PrintConversionEvent {
-
-    public PrintConversionEventImpl(int severity, String message, ValidationEventLocator locator) {
-        super(severity, message, locator);
-    }
-
-    public PrintConversionEventImpl(int severity, String message, ValidationEventLocator locator, Throwable linkedException) {
-        super(severity, message, locator, linkedException);
-    }
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/helpers/ValidationEventImpl.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/helpers/ValidationEventImpl.java
deleted file mode 100644
index ca5e8b1..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/helpers/ValidationEventImpl.java
+++ /dev/null
@@ -1,94 +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 javax.xml.bind.helpers;
-
-import javax.xml.bind.ValidationEvent;
-import javax.xml.bind.ValidationEventLocator;
-
-public class ValidationEventImpl implements ValidationEvent {
-
-    private int severity;
-    private String message;
-    private Throwable linkedException;
-    private ValidationEventLocator locator;
-
-    public ValidationEventImpl(int severity, String message, ValidationEventLocator locator) {
-        this(severity, message, locator, null);
-    }
-
-    public ValidationEventImpl(int severity, String message, ValidationEventLocator locator, Throwable linkedException) {
-        setSeverity(severity);
-        this.message = message;
-        this.locator = locator;
-        this.linkedException = linkedException;
-    }
-
-    public int getSeverity() {
-        return severity;
-    }
-
-    public void setSeverity(int severity) {
-        if (severity != 0 && severity != 1 && severity != 2) {
-            throw new IllegalArgumentException("Illegal severity");
-        }
-        this.severity = severity;
-    }
-
-    public String getMessage() {
-        return message;
-    }
-
-    public void setMessage(String message) {
-        this.message = message;
-    }
-
-    public Throwable getLinkedException() {
-        return linkedException;
-    }
-
-    public void setLinkedException(Throwable linkedException) {
-        this.linkedException = linkedException;
-    }
-
-    public ValidationEventLocator getLocator() {
-        return locator;
-    }
-
-    public void setLocator(ValidationEventLocator locator) {
-        this.locator = locator;
-    }
-
-    public String toString() {
-        String s;
-        switch (getSeverity()) {
-            case WARNING:
-                s = "WARNING";
-                break;
-            case ERROR:
-                s = "ERROR";
-                break;
-            case FATAL_ERROR:
-                s = "FATAL_ERROR";
-                break;
-            default:
-                s = String.valueOf(getSeverity());
-                break;
-        }
-        return "[severity=" + s + ", message=" + getMessage() + ", locator=" + getLocator() + "]";
-    }
-
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/helpers/ValidationEventLocatorImpl.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/helpers/ValidationEventLocatorImpl.java
deleted file mode 100644
index b1ddf78..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/helpers/ValidationEventLocatorImpl.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 javax.xml.bind.helpers;
-
-import java.net.URL;
-import java.net.MalformedURLException;
-
-import javax.xml.bind.ValidationEventLocator;
-
-import org.w3c.dom.Node;
-
-import org.xml.sax.SAXParseException;
-import org.xml.sax.Locator;
-
-public class ValidationEventLocatorImpl implements ValidationEventLocator {
-
-    private URL url;
-    private int offset = -1;
-    private int lineNumber = -1;
-    private int columnNumber = -1;
-    private Object object;
-    private Node node;
-
-    public ValidationEventLocatorImpl() {
-    }
-
-    public ValidationEventLocatorImpl(Locator loc) {
-        if (loc == null) {
-            throw new IllegalArgumentException("loc must not be null");
-        }
-        url = toURL(loc.getSystemId());
-        columnNumber = loc.getColumnNumber();
-        lineNumber = loc.getLineNumber();
-    }
-
-    public ValidationEventLocatorImpl(SAXParseException e) {
-        if (e == null) {
-            throw new IllegalArgumentException("e must not be null");
-        }
-        url = toURL(e.getSystemId());
-        columnNumber = e.getColumnNumber();
-        lineNumber = e.getLineNumber();
-    }
-
-    public ValidationEventLocatorImpl(Node node) {
-        if (node == null) {
-            throw new IllegalArgumentException("node must not be null");
-        }
-        this.node = node;
-    }
-
-    public ValidationEventLocatorImpl(Object object) {
-        if (object == null) {
-            throw new IllegalArgumentException("object must not be null");
-        }
-        this.object = object;
-    }
-
-    private static URL toURL(String systemId) {
-        try {
-            return new URL(systemId);
-        }
-        catch (MalformedURLException e) {
-            return null;
-        }
-    }
-
-    public URL getURL() {
-        return url;
-    }
-
-    public void setURL(URL url) {
-        this.url = url;
-    }
-
-    public int getOffset() {
-        return offset;
-    }
-
-    public void setOffset(int offset) {
-        this.offset = offset;
-    }
-
-    public int getLineNumber() {
-        return lineNumber;
-    }
-
-    public void setLineNumber(int lineNumber) {
-        this.lineNumber = lineNumber;
-    }
-
-    public int getColumnNumber() {
-        return columnNumber;
-    }
-
-    public void setColumnNumber(int columnNumber) {
-        this.columnNumber = columnNumber;
-    }
-
-    public Object getObject() {
-        return object;
-    }
-
-    public void setObject(Object object) {
-        this.object = object;
-    }
-
-    public Node getNode() {
-        return node;
-    }
-
-    public void setNode(Node node) {
-        this.node = node;
-    }
-
-    public String toString() {
-        return "[node=" + getNode() + ", " +
-                "object=" + getObject() + ", " +
-                "url=" + getURL() + ", " +
-                "line=" + String.valueOf(getLineNumber()) + "," +
-                "col=" + String.valueOf(getColumnNumber()) + "," +
-                "offset=" + String.valueOf(getOffset()) + "]";
-    }
-
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/util/JAXBResult.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/util/JAXBResult.java
deleted file mode 100644
index 1584b41..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/util/JAXBResult.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 javax.xml.bind.util;
-
-import javax.xml.transform.Result;
-import javax.xml.transform.sax.SAXResult;
-import javax.xml.bind.UnmarshallerHandler;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Unmarshaller;
-
-public class JAXBResult extends SAXResult {
-
-    private final UnmarshallerHandler unmarshallerHandler;
-
-    public JAXBResult(JAXBContext context) throws JAXBException {
-        if (context == null) {
-            throw new JAXBException("context must not be null");
-        }
-        unmarshallerHandler = context.createUnmarshaller().getUnmarshallerHandler();
-        super.setHandler(unmarshallerHandler);
-    }
-
-    public JAXBResult(Unmarshaller unmarshaller) throws JAXBException {
-        if (unmarshaller == null) {
-            throw new JAXBException("unmarshaller must not be null");
-        }
-        unmarshallerHandler = unmarshaller.getUnmarshallerHandler();
-        super.setHandler(unmarshallerHandler);
-    }
-
-    public Object getResult() throws JAXBException {
-        return unmarshallerHandler.getResult();
-    }
-
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/util/JAXBSource.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/util/JAXBSource.java
deleted file mode 100644
index abd6457..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/util/JAXBSource.java
+++ /dev/null
@@ -1,165 +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 javax.xml.bind.util;
-
-import javax.xml.transform.Source;
-import javax.xml.transform.sax.SAXSource;
-import javax.xml.bind.Marshaller;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-
-import org.xml.sax.XMLReader;
-import org.xml.sax.SAXNotRecognizedException;
-import org.xml.sax.EntityResolver;
-import org.xml.sax.DTDHandler;
-import org.xml.sax.ContentHandler;
-import org.xml.sax.ErrorHandler;
-import org.xml.sax.SAXException;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXParseException;
-import org.xml.sax.helpers.XMLFilterImpl;
-import org.xml.sax.ext.LexicalHandler;
-
-public class JAXBSource extends SAXSource {
-
-    public JAXBSource(JAXBContext context, Object contentObject) throws JAXBException {
-        if (context == null) {
-            throw new JAXBException("context must not be null");
-        }
-        if (contentObject == null) {
-            throw new JAXBException("contentObject must not be null");
-        }
-        setXMLReader(new Reader(context.createMarshaller(), contentObject));
-        setInputSource(new InputSource());
-    }
-
-    public JAXBSource(final Marshaller marshaller, final Object contentObject) throws JAXBException {
-        if (marshaller == null) {
-            throw new JAXBException("marshaller must not be null");
-        }
-        if (contentObject == null) {
-            throw new JAXBException("contentObject must not be null");
-        }
-        setXMLReader(new Reader(marshaller, contentObject));
-        setInputSource(new InputSource());
-    }
-
-    private static class Reader implements XMLReader {
-
-        private LexicalHandler lexicalHandler;
-        private EntityResolver entityResolver;
-        private DTDHandler dtdHandler;
-        private XMLFilterImpl repeater;
-        private ErrorHandler errorHandler;
-        private final Marshaller marshaller;
-        private final Object contentObject;
-
-        public Reader(Marshaller marshaller, Object contentObject) {
-            this.marshaller = marshaller;
-            this.contentObject = contentObject;
-            repeater = new XMLFilterImpl();
-        }
-
-        public boolean getFeature(String name) throws SAXNotRecognizedException {
-            if (name.equals("http://xml.org/sax/features/namespaces")) {
-                return true;
-            }
-            if (name.equals("http://xml.org/sax/features/namespace-prefixes")) {
-                return false;
-            }
-            throw new SAXNotRecognizedException(name);
-        }
-
-        public void setFeature(String name, boolean value) throws SAXNotRecognizedException {
-            if (name.equals("http://xml.org/sax/features/namespaces") && value) {
-                return;
-            }
-            if (name.equals("http://xml.org/sax/features/namespace-prefixes") && !value) {
-                return;
-            }
-            throw new SAXNotRecognizedException(name);
-        }
-
-        public Object getProperty(String name) throws SAXNotRecognizedException {
-            if("http://xml.org/sax/properties/lexical-handler".equals(name)) {
-                return lexicalHandler;
-            }
-            throw new SAXNotRecognizedException(name);
-        }
-
-        public void setProperty(String name, Object value) throws SAXNotRecognizedException {
-            if("http://xml.org/sax/properties/lexical-handler".equals(name)) {
-                lexicalHandler = (LexicalHandler) value;
-                return;
-            }
-            throw new SAXNotRecognizedException(name);
-        }
-
-        public void setEntityResolver(EntityResolver resolver) {
-            entityResolver = resolver;
-        }
-
-        public EntityResolver getEntityResolver() {
-            return entityResolver;
-        }
-
-        public void setDTDHandler(DTDHandler handler) {
-            dtdHandler = handler;
-        }
-
-        public DTDHandler getDTDHandler() {
-            return dtdHandler;
-        }
-
-        public void setContentHandler(ContentHandler handler) {
-            repeater.setContentHandler(handler);
-        }
-
-        public ContentHandler getContentHandler() {
-            return repeater.getContentHandler();
-        }
-
-        public void setErrorHandler(ErrorHandler handler) {
-            errorHandler = handler;
-        }
-
-        public ErrorHandler getErrorHandler() {
-            return errorHandler;
-        }
-
-        public void parse(InputSource input) throws SAXException {
-            parse();
-        }
-
-        public void parse(String systemId) throws SAXException {
-            parse();
-        }
-
-        public void parse() throws SAXException {
-            try {
-                marshaller.marshal(contentObject, repeater);
-            } catch(JAXBException e) {
-                SAXParseException se = new SAXParseException(e.getMessage(), null, null, -1, -1, e);
-                if (errorHandler != null) {
-                    errorHandler.fatalError(se);
-                }
-                throw se;
-            }
-        }
-
-    }
-}
diff --git a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/util/ValidationEventCollector.java b/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/util/ValidationEventCollector.java
deleted file mode 100644
index e4cc436..0000000
--- a/trunk/jaxb-api-2.1/src/main/java/javax/xml/bind/util/ValidationEventCollector.java
+++ /dev/null
@@ -1,44 +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 javax.xml.bind.util;
-
-import java.util.ArrayList;
-
-import javax.xml.bind.ValidationEventHandler;
-import javax.xml.bind.ValidationEvent;
-
-public class ValidationEventCollector implements ValidationEventHandler {
-
-    private ArrayList<ValidationEvent> events = new ArrayList<ValidationEvent>();
-
-    public ValidationEvent[] getEvents() {
-        return events.toArray(new ValidationEvent[events.size()]);
-    }
-
-    public boolean handleEvent(ValidationEvent event) {
-        events.add(event);
-        return event.getSeverity() != ValidationEvent.FATAL_ERROR;
-    }
-
-    public boolean hasEvents() {
-        return !events.isEmpty();
-    }
-
-    public void reset() {
-        events.clear();
-    }
-}
diff --git a/trunk/jaxb-api-2.2/pom.xml b/trunk/jaxb-api-2.2/pom.xml
deleted file mode 100644
index 5ce9c4a..0000000
--- a/trunk/jaxb-api-2.2/pom.xml
+++ /dev/null
@@ -1,186 +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.specs</groupId>
-        <artifactId>specs</artifactId>
-        <version>2.1.0</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.specs</groupId>
-    <artifactId>org.apache.servicemix.specs.jaxb-api-2.2</artifactId>
-    <packaging>bundle</packaging>
-    <version>2.1.0</version>
-    <name>Apache ServiceMix :: Specs :: JAXB API 2.2</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.stax-api-1.0</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-activation_1.1_spec</artifactId>
-            <version>1.0.2</version>
-        </dependency>
-        <dependency>
-            <groupId>javax.xml.bind</groupId>
-            <artifactId>jaxb-api</artifactId>
-            <version>2.2.1</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Description>${project.description}</Bundle-Description>
-                        <Export-Package>javax.xml.bind*;version=2.2.1;-split-package:=merge-first;-noimport:=true</Export-Package>
-                        <Import-Package>*</Import-Package>
-                        <Private-Package>org.apache.servicemix.specs.locator;-split-package:=merge-first</Private-Package>
-                        <Bundle-Activator>org.apache.servicemix.specs.locator.Activator</Bundle-Activator>
-                        <Implementation-Title>Apache ServiceMix</Implementation-Title>
-                        <Implementation-Version>${project.version}</Implementation-Version>
-                    </instructions>
-                    <unpackBundle>true</unpackBundle>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <artifactSet>
-                                <includes>
-                                    <include>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</include>
-                                    <include>javax.xml.bind:jaxb-api</include>
-                                </includes>
-                            </artifactSet>
-                            <filters>
-                                <filter>
-                                    <artifact>javax.xml.bind:jaxb-api</artifact>
-                                    <excludes>
-                                        <exclude>javax/**</exclude>
-                                    </excludes>
-                                </filter>
-                                <filter>
-                                    <artifact>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</artifact>
-                                    <excludes>
-                                        <exclude>org/**</exclude>
-                                    </excludes>
-                                </filter>
-                            </filters>
-                            <createSourcesJar>${createSourcesJar}</createSourcesJar>
-                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-                            <createDependencyReducedPom>true</createDependencyReducedPom>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>deploy</id>
-            <properties>
-                <createSourcesJar>true</createSourcesJar>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-source-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>attach-sources</id>
-                                <phase>process-classes</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-dependency-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>unpack-sources</id>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>unpack</goal>
-                                </goals>
-                                <configuration>
-                                    <artifactItems>
-                                        <artifactItem>
-                                            <groupId>org.apache.servicemix.specs</groupId>
-                                            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                    </artifactItems>
-                                    <outputDirectory>${project.build.directory}/sources</outputDirectory>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>package</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <minmemory>128m</minmemory>
-                            <maxmemory>512m</maxmemory>
-                            <sourcepath>${project.build.directory}/sources</sourcepath>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
diff --git a/trunk/jaxb-api-2.2/src/main/java/javax/xml/bind/ContextFinder.java b/trunk/jaxb-api-2.2/src/main/java/javax/xml/bind/ContextFinder.java
deleted file mode 100644
index a0bd4ba..0000000
--- a/trunk/jaxb-api-2.2/src/main/java/javax/xml/bind/ContextFinder.java
+++ /dev/null
@@ -1,520 +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 javax.xml.bind;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.UnsupportedEncodingException;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.net.URL;
-import java.util.Map;
-import java.util.Properties;
-import java.util.StringTokenizer;
-import java.util.logging.ConsoleHandler;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-
-import static javax.xml.bind.JAXBContext.JAXB_CONTEXT_FACTORY;
-
-//import java.lang.reflect.InvocationTargetException;
-
-/**
- * This class is package private and therefore is not exposed as part of the 
- * JAXB API.
- *
- * This code is designed to implement the JAXB 1.0 spec pluggability feature
- *
- * @author <ul><li>Ryan Shoemaker, Sun Microsystems, Inc.</li></ul>
- * @see JAXBContext
- */
-class ContextFinder {
-    private static final Logger logger;
-    static {
-        logger = Logger.getLogger("javax.xml.bind");
-        try {
-            if (AccessController.doPrivileged(new GetPropertyAction("jaxb.debug")) != null) {
-                // disconnect the logger from a bigger framework (if any)
-                // and take the matters into our own hands
-                logger.setUseParentHandlers(false);
-                logger.setLevel(Level.ALL);
-                ConsoleHandler handler = new ConsoleHandler();
-                handler.setLevel(Level.ALL);
-                logger.addHandler(handler);
-            } else {
-                // don't change the setting of this logger
-                // to honor what other frameworks
-                // have done on configurations.
-            }
-        } catch(Throwable t) {
-            // just to be extra safe. in particular System.getProperty may throw
-            // SecurityException.
-        }
-    }
-
-    /**
-     * If the {@link InvocationTargetException} wraps an exception that shouldn't be wrapped,
-     * throw the wrapped exception.
-     */
-    private static void handleInvocationTargetException(InvocationTargetException x) throws JAXBException {
-        Throwable t = x.getTargetException();
-        if( t != null ) {
-            if( t instanceof JAXBException )
-                // one of our exceptions, just re-throw
-                throw (JAXBException)t;
-            if( t instanceof RuntimeException )
-                // avoid wrapping exceptions unnecessarily
-                throw (RuntimeException)t;
-            if( t instanceof Error )
-                throw (Error)t;
-        }
-    }
-
-
-    /**
-     * Determine if two types (JAXBContext in this case) will generate a ClassCastException.
-     *
-     * For example, (targetType)originalType
-     *
-     * @param originalType
-     *          The Class object of the type being cast
-     * @param targetType
-     *          The Class object of the type that is being cast to
-     * @return JAXBException to be thrown.
-     */
-    private static JAXBException handleClassCastException(Class originalType, Class targetType) {
-        final URL targetTypeURL = which(targetType);
-
-        ClassLoader cl = originalType.getClassLoader() != null ? originalType.getClassLoader() : ClassLoader.getSystemClassLoader();
-        return new JAXBException(Messages.format(Messages.ILLEGAL_CAST,
-                // we don't care where the impl class is, we want to know where JAXBContext lives in the impl
-                // class' ClassLoader
-                cl.getResource("javax/xml/bind/JAXBContext.class"),
-                targetTypeURL));
-    }
-
-    /**
-     * Create an instance of a class using the specified ClassLoader
-     */
-    static JAXBContext newInstance( String contextPath,
-                               String className, 
-                               ClassLoader classLoader,
-                               Map properties )
-        throws JAXBException
-    {
-        try {
-            Class spiClass = safeLoadClass(className,classLoader);
-
-            /*
-             * javax.xml.bind.context.factory points to a class which has a
-             * static method called 'createContext' that
-             * returns a javax.xml.JAXBContext.
-             */
-
-            Object context = null;
-
-            // first check the method that takes Map as the third parameter.
-            // this is added in 2.0.
-            try {
-                Method m = spiClass.getMethod("createContext",String.class,ClassLoader.class,Map.class);
-                // Throw an early exception instead of having an exception thrown in the createContext method
-                if (m.getReturnType() != JAXBContext.class) {
-                    throw handleClassCastException(m.getReturnType(), JAXBContext.class);
-                }
-                // any failure in invoking this method would be considered fatal
-                context = m.invoke(null,contextPath,classLoader,properties);
-            } catch (NoSuchMethodException e) {
-                // it's not an error for the provider not to have this method.
-            }
-
-            if(context==null) {
-                // try the old method that doesn't take properties. compatible with 1.0.
-                // it is an error for an implementation not to have both forms of the createContext method.
-                Method m = spiClass.getMethod("createContext",String.class,ClassLoader.class);
-                // Throw an early exception instead of having an exception thrown in the createContext method
-                if (m.getReturnType() != JAXBContext.class) {
-                    throw handleClassCastException(m.getReturnType(), JAXBContext.class);
-                }
-                // any failure in invoking this method would be considered fatal
-                context = m.invoke(null,contextPath,classLoader);
-            }
-
-            if(!(context instanceof JAXBContext)) {
-                // the cast would fail, so generate an exception with a nice message
-                throw handleClassCastException(context.getClass(), JAXBContext.class);
-            }
-            return (JAXBContext)context;
-        } catch (ClassNotFoundException x) {
-            throw new JAXBException(
-                Messages.format( Messages.PROVIDER_NOT_FOUND, className ),
-                x);
-        } catch (InvocationTargetException x) {
-            handleInvocationTargetException(x);
-            // for other exceptions, wrap the internal target exception
-            // with a JAXBException
-            Throwable e = x;
-            if(x.getTargetException()!=null)
-                e = x.getTargetException();
-
-            throw new JAXBException( Messages.format( Messages.COULD_NOT_INSTANTIATE, className, e ), e );
-        } catch (RuntimeException x) {
-            // avoid wrapping RuntimeException to JAXBException,
-            // because it indicates a bug in this code.
-            throw x;
-        } catch (Exception x) {
-            // can't catch JAXBException because the method is hidden behind
-            // reflection.  Root element collisions detected in the call to
-            // createContext() are reported as JAXBExceptions - just re-throw it
-            // some other type of exception - just wrap it
-            throw new JAXBException(
-                Messages.format( Messages.COULD_NOT_INSTANTIATE, className, x ),
-                x);
-        }
-    }
-
-
-    /**
-     * Create an instance of a class using the specified ClassLoader
-     */
-    static JAXBContext newInstance(
-                              Class[] classes,
-                              Map properties,
-                              String className) throws JAXBException {
-        ClassLoader cl = Thread.currentThread().getContextClassLoader();
-        Class spi;
-        try {
-            spi = safeLoadClass(className,cl);
-        } catch (ClassNotFoundException e) {
-            throw new JAXBException(e);
-        }
-
-        if(logger.isLoggable(Level.FINE)) {
-            // extra check to avoid costly which operation if not logged
-            logger.fine("loaded "+className+" from "+which(spi));
-        }
-
-        Method m;
-        try {
-            m = spi.getMethod("createContext", Class[].class, Map.class);
-        } catch (NoSuchMethodException e) {
-            throw new JAXBException(e);
-        }
-        // Fallback for JAXB 1.0 compatibility (at least JAXB TCK tests are using that feature)
-        try {
-            Object context = m.invoke(null, classes, properties);
-            if(!(context instanceof JAXBContext)) {
-                // the cast would fail, so generate an exception with a nice message
-                throw handleClassCastException(context.getClass(), JAXBContext.class);
-            }
-            return (JAXBContext)context;
-        } catch (IllegalAccessException e) {
-            throw new JAXBException(e);
-        } catch (InvocationTargetException e) {
-            handleInvocationTargetException(e);
-
-            Throwable x = e;
-            if (e.getTargetException() != null)
-                x = e.getTargetException();
-
-            throw new JAXBException(x);
-        }
-    }
-
-
-    static JAXBContext find(String factoryId, String contextPath, ClassLoader classLoader, Map properties ) throws JAXBException {
-
-        // TODO: do we want/need another layer of searching in $java.home/lib/jaxb.properties like JAXP?
-
-        final String jaxbContextFQCN = JAXBContext.class.getName();
-
-        // search context path for jaxb.properties first
-        StringBuilder propFileName;
-        StringTokenizer packages = new StringTokenizer( contextPath, ":" );
-        String factoryClassName;
-
-        if(!packages.hasMoreTokens())
-            // no context is specified
-            throw new JAXBException(Messages.format(Messages.NO_PACKAGE_IN_CONTEXTPATH));
-
-
-        logger.fine("Searching jaxb.properties");
-
-        while( packages.hasMoreTokens() ) {
-            String packageName = packages.nextToken(":").replace('.','/');
-            // com.acme.foo - > com/acme/foo/jaxb.properties
-             propFileName = new StringBuilder().append(packageName).append("/jaxb.properties");
-
-            Properties props = loadJAXBProperties( classLoader, propFileName.toString() );
-            if (props != null) {
-                if (props.containsKey(factoryId)) {
-                    factoryClassName = props.getProperty(factoryId);
-                    return newInstance( contextPath, factoryClassName, classLoader, properties );
-                } else {
-                    throw new JAXBException(Messages.format(Messages.MISSING_PROPERTY, packageName, factoryId));
-                }
-            }
-        }
-
-        logger.fine("Searching the system property");
-
-        // search for a system property second (javax.xml.bind.JAXBContext)
-        factoryClassName = AccessController.doPrivileged(new GetPropertyAction(jaxbContextFQCN));
-        if(  factoryClassName != null ) {
-            return newInstance( contextPath, factoryClassName, classLoader, properties );
-        }
-
-        logger.fine("Searching META-INF/services");
-
-        // search META-INF services next
-        BufferedReader r;
-        try {
-            final StringBuilder resource = new StringBuilder().append("META-INF/services/").append(jaxbContextFQCN);
-            final InputStream resourceStream =
-                    classLoader.getResourceAsStream(resource.toString());
-            
-            if (resourceStream != null) {
-                r = new BufferedReader(new InputStreamReader(resourceStream, "UTF-8"));
-                factoryClassName = r.readLine().trim();
-                r.close();
-                return newInstance(contextPath, factoryClassName, classLoader, properties);
-            } else {
-                logger.fine("Unable to load:" + resource.toString());
-            }
-        } catch (UnsupportedEncodingException e) {
-            // should never happen
-            throw new JAXBException(e);
-        } catch (IOException e) {
-            throw new JAXBException(e);
-        }
-
-        // else no provider found
-        logger.fine("Trying to create the platform default provider");
-        return newInstance(contextPath, PLATFORM_DEFAULT_FACTORY_CLASS, classLoader, properties);
-    }
-
-    // TODO: log each step in the look up process
-    static JAXBContext find( Class[] classes, Map properties ) throws JAXBException {
-
-        // TODO: do we want/need another layer of searching in $java.home/lib/jaxb.properties like JAXP?
-
-        final String jaxbContextFQCN = JAXBContext.class.getName();
-        String factoryClassName;
-
-        // search for jaxb.properties in the class loader of each class first
-        for (final Class c : classes) {
-            // this classloader is used only to load jaxb.properties, so doing this should be safe.
-            ClassLoader classLoader = AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
-                public ClassLoader run() {
-                    return c.getClassLoader();
-                }
-            });
-            Package pkg = c.getPackage();
-            if(pkg==null)
-                continue;       // this is possible for primitives, arrays, and classes that are loaded by poorly implemented ClassLoaders
-            String packageName = pkg.getName().replace('.', '/');
-
-            // TODO: do we want to optimize away searching the same package?  org.Foo, org.Bar, com.Baz
-            //       classes from the same package might come from different class loades, so it might be a bad idea
-
-            // TODO: it's easier to look things up from the class
-            // c.getResourceAsStream("jaxb.properties");
-
-            // build the resource name and use the property loader code
-            String resourceName = packageName+"/jaxb.properties";
-            logger.fine("Trying to locate "+resourceName);
-            Properties props = loadJAXBProperties(classLoader, resourceName);
-            if (props == null) {
-                logger.fine("  not found");
-            } else {
-                logger.fine("  found");
-                if (props.containsKey(JAXB_CONTEXT_FACTORY)) {
-                    // trim() seems redundant, but adding to satisfy customer complaint
-                    factoryClassName = props.getProperty(JAXB_CONTEXT_FACTORY).trim();
-                    return newInstance(classes, properties, factoryClassName);
-                } else {
-                    throw new JAXBException(Messages.format(Messages.MISSING_PROPERTY, packageName, JAXB_CONTEXT_FACTORY));
-                }
-            }
-        }
-
-        // search for a system property second (javax.xml.bind.JAXBContext)
-        logger.fine("Checking system property "+jaxbContextFQCN);
-        factoryClassName = AccessController.doPrivileged(new GetPropertyAction(jaxbContextFQCN));
-        if(  factoryClassName != null ) {
-            logger.fine("  found "+factoryClassName);
-            return newInstance( classes, properties, factoryClassName );
-        }
-        logger.fine("  not found");
-
-        // search META-INF services next
-        logger.fine("Checking META-INF/services");
-        BufferedReader r;
-        try {
-            final String resource = new StringBuilder("META-INF/services/").append(jaxbContextFQCN).toString();
-            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-            URL resourceURL;
-            if(classLoader==null)
-                resourceURL = ClassLoader.getSystemResource(resource);
-            else
-                resourceURL = classLoader.getResource(resource);
-
-            if (resourceURL != null) {
-                logger.fine("Reading "+resourceURL);
-                r = new BufferedReader(new InputStreamReader(resourceURL.openStream(), "UTF-8"));
-                factoryClassName = r.readLine().trim();
-                return newInstance(classes, properties, factoryClassName);
-            } else {
-                logger.fine("Unable to find: " + resource);
-            }
-        } catch (UnsupportedEncodingException e) {
-            // should never happen
-            throw new JAXBException(e);
-        } catch (IOException e) {
-            throw new JAXBException(e);
-        }
-
-        // else no provider found
-        logger.fine("Trying to create the platform default provider");
-        return newInstance(classes, properties, PLATFORM_DEFAULT_FACTORY_CLASS);
-    }
-
-
-    private static Properties loadJAXBProperties( ClassLoader classLoader,
-                                                  String propFileName ) 
-        throws JAXBException {
-                                            
-        Properties props = null;
-                                                    
-        try {
-            URL url;
-            if(classLoader==null)
-                url = ClassLoader.getSystemResource(propFileName);
-            else
-                url = classLoader.getResource( propFileName );
-
-            if( url != null ) {
-                logger.fine("loading props from "+url);
-                props = new Properties();
-                InputStream is = url.openStream();
-                props.load( is );
-                is.close();
-            } 
-        } catch( IOException ioe ) {
-            logger.log(Level.FINE,"Unable to load "+propFileName,ioe);
-            throw new JAXBException( ioe.toString(), ioe );
-        }
-        
-        return props;
-    }
-
-
-    /**
-     * Search the given ClassLoader for an instance of the specified class and
-     * return a string representation of the URL that points to the resource.
-     *
-     * @param clazz
-     *          The class to search for
-     * @param loader
-     *          The ClassLoader to search.  If this parameter is null, then the
-     *          system class loader will be searched
-     * @return
-     *          the URL for the class or null if it wasn't found
-     */
-    static URL which(Class clazz, ClassLoader loader) {
-
-        String classnameAsResource = clazz.getName().replace('.', '/') + ".class";
-
-        if(loader == null) {
-            loader = ClassLoader.getSystemClassLoader();
-        }
-
-        return loader.getResource(classnameAsResource);
-    }
-
-    /**
-     * Get the URL for the Class from it's ClassLoader.
-     *
-     * Convenience method for {@link #which(Class, ClassLoader)}.
-     *
-     * Equivalent to calling: which(clazz, clazz.getClassLoader())
-     *
-     * @param clazz
-     *          The class to search for
-     * @return
-     *          the URL for the class or null if it wasn't found
-     */
-    static URL which(Class clazz) {
-        return which(clazz, clazz.getClassLoader());
-    }
-
-    /**
-     * When JAXB is in J2SE, rt.jar has to have a JAXB implementation.
-     * However, rt.jar cannot have META-INF/services/javax.xml.bind.JAXBContext
-     * because if it has, it will take precedence over any file that applications have
-     * in their jar files.
-     *
-     * <p>
-     * When the user bundles his own JAXB implementation, we'd like to use it, and we
-     * want the platform default to be used only when there's no other JAXB provider.
-     *
-     * <p>
-     * For this reason, we have to hard-code the class name into the API.
-     */
-    private static final String PLATFORM_DEFAULT_FACTORY_CLASS = "com.sun.xml.internal.bind.v2.ContextFactory";
-
-    /**
-     * Loads the class, provided that the calling thread has an access to the class being loaded.
-     */
-    private static Class safeLoadClass(String className, ClassLoader classLoader) throws ClassNotFoundException {
-       // using Osig locator to load the spi class 
-       try {
-           Class spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(JAXBContext.class);
-           if (spiClass != null) {
-               return spiClass;
-           }
-       } catch (Throwable t) {
-       }
-       logger.fine("Trying to load "+className);
-       try {
-          // make sure that the current thread has an access to the package of the given name.
-          SecurityManager s = System.getSecurityManager();
-          if (s != null) {
-              int i = className.lastIndexOf('.');
-              if (i != -1) {
-                  s.checkPackageAccess(className.substring(0,i));
-              }
-          }
- 
-          if (classLoader == null) {
-              return Class.forName(className);
-          } else {
-              return classLoader.loadClass(className);
-          }
-       } catch (SecurityException se) {
-           // anyone can access the platform default factory class without permission
-           if (PLATFORM_DEFAULT_FACTORY_CLASS.equals(className)) {
-              return Class.forName(className);
-           }
-           throw se;
-       }
-    }
-
-}
diff --git a/trunk/jaxp-api-1.3/pom.xml b/trunk/jaxp-api-1.3/pom.xml
deleted file mode 100644
index bf58ff9..0000000
--- a/trunk/jaxp-api-1.3/pom.xml
+++ /dev/null
@@ -1,183 +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.specs</groupId>
-        <artifactId>specs</artifactId>
-        <version>2.1.0</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.specs</groupId>
-    <artifactId>org.apache.servicemix.specs.jaxp-api-1.3</artifactId>
-    <packaging>bundle</packaging>
-    <version>2.1.0</version>
-    <name>Apache ServiceMix :: Specs :: JAXP API 1.3</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>xml-apis</groupId>
-            <artifactId>xml-apis</artifactId>
-            <version>1.3.04</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-              <groupId>org.apache.maven.plugins</groupId>
-              <artifactId>maven-compiler-plugin</artifactId>
-              <inherited>true</inherited>
-              <configuration>
-                <compilerArgument>-Xbootclasspath/p:${settings.localRepository}/xml-apis/xml-apis/1.3.04/xml-apis-1.3.04.jar</compilerArgument>
-              </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Description>${project.description}</Bundle-Description>
-                        <Export-Package>
-                            javax.xml*;version=1.3;-split-package:=merge-first,
-                            org.w3c.dom*;version=1.0;-split-package:=merge-first,
-                            org.xml.sax*;version=2.0.2;-split-package:=merge-first,
-                        </Export-Package>
-                        <Import-Package>
-                            *
-                        </Import-Package>
-                        <Private-Package>org.apache.servicemix.specs.locator;-split-package:=merge-first</Private-Package>
-                        <Bundle-Activator>org.apache.servicemix.specs.locator.Activator</Bundle-Activator>
-                        <Implementation-Title>Apache ServiceMix</Implementation-Title>
-                        <Implementation-Version>${project.version}</Implementation-Version>
-                    </instructions>
-                    <unpackBundle>true</unpackBundle>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <artifactSet>
-                                <includes>
-                                    <include>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</include>
-                                </includes>
-                            </artifactSet>
-                            <filters>
-                                <filter>
-                                    <artifact>${project.groupId}:${project.artifactId}</artifact>
-                                    <excludes>
-                                        <exclude>org/apache/servicemix/**</exclude>
-                                    </excludes>
-                                </filter>
-                            </filters>
-                            <createSourcesJar>${createSourcesJar}</createSourcesJar>
-                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-                            <createDependencyReducedPom>true</createDependencyReducedPom>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>deploy</id>
-            <properties>
-                <createSourcesJar>true</createSourcesJar>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-source-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>attach-sources</id>
-                                <phase>process-classes</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-dependency-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>unpack-sources</id>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>unpack</goal>
-                                </goals>
-                                <configuration>
-                                    <artifactItems>
-                                        <artifactItem>
-                                            <groupId>org.apache.servicemix.specs</groupId>
-                                            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                    </artifactItems>
-                                    <outputDirectory>${project.build.directory}/sources</outputDirectory>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>package</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <minmemory>128m</minmemory>
-                            <maxmemory>512m</maxmemory>
-                            <sourcepath>${project.build.directory}/sources</sourcepath>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
diff --git a/trunk/jaxp-api-1.3/src/main/java/javax/xml/datatype/FactoryFinder.java b/trunk/jaxp-api-1.3/src/main/java/javax/xml/datatype/FactoryFinder.java
deleted file mode 100644
index 14f3b90..0000000
--- a/trunk/jaxp-api-1.3/src/main/java/javax/xml/datatype/FactoryFinder.java
+++ /dev/null
@@ -1,397 +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.
- */
-
-// $Id: FactoryFinder.java 446598 2006-09-15 12:55:40Z jeremias $
-
-package javax.xml.datatype;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.util.Properties;
-
-/**
- * <p>Implement pluggabile Datatypes.</p>
- * 
- * <p>This class is duplicated for each JAXP subpackage so keep it in
- * sync.  It is package private for secure class loading.</p>
- *
- * @author <a href="mailto:Jeff.Suttor@Sun.com">Jeff Suttor</a>
- * @version $Revision: 446598 $, $Date: 2006-09-15 08:55:40 -0400 (Fri, 15 Sep 2006) $
- * @since 1.5
- */
-final class FactoryFinder {
-	
-	/**
-	 * <p>Name of class to display in output messages.</p>
-	 */
-	private static final String CLASS_NAME = "javax.xml.datatype.FactoryFinder";
-	
-    /**
-     * <p>Debug flag to trace loading process.</p>
-     */
-    private static boolean debug = false;
-    
-    /**
-     * <p>Cache properties for performance.</p>
-     */
-	private static Properties cacheProps = new Properties();
-	
-	/**
-	 * <p>First time requires initialization overhead.</p>
-	 */
-	private static boolean firstTime = true;
-    
-    /**
-     * Default columns per line.
-     */
-    private static final int DEFAULT_LINE_LENGTH = 80;
-	
-	/**
-	 * <p>Check to see if debugging enabled by property.</p>
-	 * 
-	 * <p>Use try/catch block to support applets, which throws
-     * SecurityException out of this code.</p>
-	 * 
-	 */
-    static {
-        try {
-            String val = SecuritySupport.getSystemProperty("jaxp.debug");
-            // Allow simply setting the prop to turn on debug
-            debug = val != null && (! "false".equals(val));
-        } catch (Exception x) {
-            debug = false;
-        }
-    }
-    
-    private FactoryFinder() {}
-
-	/**
-	 * <p>Output debugging messages.</p>
-	 * 
-	 * @param msg <code>String</code> to print to <code>stderr</code>.
-	 */
-    private static void debugPrintln(String msg) {
-        if (debug) {
-            System.err.println(
-            	CLASS_NAME
-            	+ ":"
-            	+ msg);
-        }
-    }
-
-    /**
-     * <p>Find the appropriate <code>ClassLoader</code> to use.</p>
-     * 
-     * <p>The context ClassLoader is prefered.</p>
-     * 
-     * @return <code>ClassLoader</code> to use.
-     * 
-     * @throws ConfigurationError If a valid <code>ClassLoader</code> cannot be identified. 
-     */
-    private static ClassLoader findClassLoader()
-        throws ConfigurationError {
-        ClassLoader classLoader;
-
-        // Figure out which ClassLoader to use for loading the provider
-        // class.  If there is a Context ClassLoader then use it.
-
-        classLoader = SecuritySupport.getContextClassLoader();            
-
-        if (debug) debugPrintln(
-            "Using context class loader: "
-            + classLoader);
-
-        if (classLoader == null) {
-            // if we have no Context ClassLoader
-            // so use the current ClassLoader
-            classLoader = FactoryFinder.class.getClassLoader();
-            if (debug) debugPrintln(
-                "Using the class loader of FactoryFinder: "
-                + classLoader);                
-        }
-                    
-        return classLoader;
-    }
-
-    /**
-     * <p>Create an instance of a class using the specified ClassLoader.</p>
-     * 
-     * @param className Name of class to create.
-     * @param classLoader ClassLoader to use to create named class.
-     * 
-     * @return New instance of specified class created using the specified ClassLoader.
-     * 
-     * @throws ConfigurationError If class could not be created.
-     */
-    private static Object newInstance(
-    	String className,
-        ClassLoader classLoader)
-        throws ConfigurationError {
-        	
-        try {
-            Class spiClass;
-            if (classLoader == null) {
-                spiClass = Class.forName(className);
-            } else {
-                spiClass = classLoader.loadClass(className);
-            }
-            
-            if (debug) {
-            	debugPrintln("Loaded " + className + " from " + which(spiClass));
-            }
-             
-            return spiClass.newInstance();
-        } catch (ClassNotFoundException x) {
-            throw new ConfigurationError(
-                "Provider " + className + " not found", x);
-        } catch (Exception x) {
-            throw new ConfigurationError(
-                "Provider " + className + " could not be instantiated: " + x,
-                x);
-        }
-    }
-
-    /**
-     * Finds the implementation Class object in the specified order.  Main
-     * entry point.
-     * Package private so this code can be shared.
-     *
-     * @param factoryId Name of the factory to find, same as a property name
-     * @param fallbackClassName Implementation class name, if nothing else is found.  Use null to mean no fallback.
-     *
-     * @return Class Object of factory, never null
-     * 
-     * @throws ConfigurationError If Class cannot be found.
-     */
-    static Object find(String factoryId, String fallbackClassName)
-        throws ConfigurationError {
-        	
-        ClassLoader classLoader = findClassLoader();
-
-        try {
-            // If we are deployed into an OSGi environment, leverage it
-            Class factoryClass = FactoryFinder.class.getClassLoader().loadClass(factoryId);
-            Class spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(factoryClass, factoryId);
-            if (spiClass != null) {
-                return spiClass.newInstance();
-            }
-        } catch (Throwable e) {
-        }
-
-        // Use the system property first
-        try {
-            String systemProp = SecuritySupport.getSystemProperty(factoryId);
-            if (systemProp != null) {
-                if (debug) debugPrintln("found " + systemProp + " in the system property " + factoryId);
-                return newInstance(systemProp, classLoader);
-            }
-        } catch (SecurityException se) {
-        	; // NOP, explicitly ignore SecurityException
-        }
-
-        // try to read from $java.home/lib/jaxp.properties
-        try {
-            String javah = SecuritySupport.getSystemProperty("java.home");
-            String configFile = javah + File.separator + "lib" + File.separator + "jaxp.properties";
-			String factoryClassName = null;
-			if (firstTime) {
-				synchronized (cacheProps) {
-					if (firstTime) {
-						File f = new File(configFile);
-						firstTime = false;
-						if (SecuritySupport.doesFileExist(f)) {
-							if (debug) debugPrintln("Read properties file " + f);
-							cacheProps.load(SecuritySupport.getFileInputStream(f));
-						}
-					}
-				}
-			}
-			factoryClassName = cacheProps.getProperty(factoryId);
-            if (debug) debugPrintln("found " + factoryClassName + " in $java.home/jaxp.properties"); 
-			
-			if (factoryClassName != null) {
-				return newInstance(factoryClassName, classLoader);
-			}
-        } catch (Exception ex) {
-            if (debug) {
-            	ex.printStackTrace();
-            } 
-        }
-        
-        // Try Jar Service Provider Mechanism
-        Object provider = findJarServiceProvider(factoryId);
-        if (provider != null) {
-            return provider;
-        }
-
-        if (fallbackClassName == null) {
-            throw new ConfigurationError(
-                "Provider for " + factoryId + " cannot be found", null);
-        }
-
-        if (debug) debugPrintln("loaded from fallback value: " + fallbackClassName);
-        return newInstance(fallbackClassName, classLoader);
-    }
-
-    /*
-     * Try to find provider using Jar Service Provider Mechanism
-     *
-     * @return instance of provider class if found or null
-     */
-    private static Object findJarServiceProvider(String factoryId)
-        throws ConfigurationError
-    {
-
-        String serviceId = "META-INF/services/" + factoryId;
-        InputStream is = null;
-
-        // First try the Context ClassLoader
-        ClassLoader cl = SecuritySupport.getContextClassLoader();
-        if (cl != null) {
-            is = SecuritySupport.getResourceAsStream(cl, serviceId);
-
-            // If no provider found then try the current ClassLoader
-            if (is == null) {
-                cl = FactoryFinder.class.getClassLoader();
-                is = SecuritySupport.getResourceAsStream(cl, serviceId);
-            }
-        } else {
-            // No Context ClassLoader, try the current
-            // ClassLoader
-            cl = FactoryFinder.class.getClassLoader();
-            is = SecuritySupport.getResourceAsStream(cl, serviceId);
-        }
-
-        if (is == null) {
-            // No provider found
-            return null;
-        }
-
-        if (debug) debugPrintln("found jar resource=" + serviceId +
-               " using ClassLoader: " + cl);
-
-        BufferedReader rd;
-        try {
-            rd = new BufferedReader(new InputStreamReader(is, "UTF-8"), DEFAULT_LINE_LENGTH);
-        } catch (java.io.UnsupportedEncodingException e) {
-            rd = new BufferedReader(new InputStreamReader(is), DEFAULT_LINE_LENGTH);
-        }
-        
-        String factoryClassName = null;
-        try {
-            // XXX Does not handle all possible input as specified by the
-            // Jar Service Provider specification
-            factoryClassName = rd.readLine();
-        } 
-        catch (IOException x) {
-            // No provider found
-            return null;
-        }
-        finally {
-            try { 
-                // try to close the reader. 
-                rd.close(); 
-            } 
-            // Ignore the exception. 
-            catch (IOException exc) {}
-        }
-
-        if (factoryClassName != null &&
-            ! "".equals(factoryClassName)) {
-            if (debug) debugPrintln("found in resource, value="
-                   + factoryClassName);
-
-            return newInstance(factoryClassName, cl);
-        }
-
-        // No provider found
-        return null;
-    }
-    
-	/**
-	 * <p>Configuration Error.</p>
-	 */
-    static class ConfigurationError extends Error {
-        
-        private static final long serialVersionUID = -3644413026244211347L;
-    	
-    	/**
-    	 * <p>Exception that caused the error.</p>
-    	 */
-        private Exception exception;
-
-        /**
-         * <p>Construct a new instance with the specified detail string and
-         * exception.</p>
-         * 
-         * @param msg Detail message for this error.
-         * @param x Exception that caused the error.
-         */
-        ConfigurationError(String msg, Exception x) {
-            super(msg);
-            this.exception = x;
-        }
-
-		/**
-		 * <p>Get the Exception that caused the error.</p>
-		 * 
-		 * @return Exception that caused the error.
-		 */
-        Exception getException() {
-            return exception;
-        }
-    }
-
-
-
-    /**
-     * Returns the location where the given Class is loaded from.
-     * 
-     * @param clazz Class to find load location.
-     * 
-     * @return Location where class would be loaded from.
-     */
-    private static String which(Class clazz) {
-        try {
-            String classnameAsResource = clazz.getName().replace('.', '/') + ".class";
-    
-            ClassLoader loader = clazz.getClassLoader();
-            
-            URL it;
-    
-            if (loader != null) {
-            	it = loader.getResource(classnameAsResource);
-            } else {
-            	it = ClassLoader.getSystemResource(classnameAsResource);
-            } 
-    
-            if (it != null) {
-            	return it.toString();
-            } 
-        } catch (Throwable t) {
-            // work defensively.
-            if (debug) {
-            	t.printStackTrace();
-            } 
-        }
-        return "unknown location";
-    }
-}
diff --git a/trunk/jaxp-api-1.3/src/main/java/javax/xml/datatype/SecuritySupport.java b/trunk/jaxp-api-1.3/src/main/java/javax/xml/datatype/SecuritySupport.java
deleted file mode 100644
index da82748..0000000
--- a/trunk/jaxp-api-1.3/src/main/java/javax/xml/datatype/SecuritySupport.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.
- */
-
-// $Id: SecuritySupport.java 446598 2006-09-15 12:55:40Z jeremias $
-
-package javax.xml.datatype;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.InputStream;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-
-/**
- * This class is duplicated for each JAXP subpackage so keep it in sync.
- * It is package private and therefore is not exposed as part of the JAXP
- * API.
- *
- * Security related methods that only work on J2SE 1.2 and newer.
- */
-final class SecuritySupport  {
-    
-    private SecuritySupport() {}
-    
-    static ClassLoader getContextClassLoader() {
-	return (ClassLoader)
-		AccessController.doPrivileged(new PrivilegedAction() {
-	    public Object run() {
-		ClassLoader cl = null;
-		try {
-		    cl = Thread.currentThread().getContextClassLoader();
-		} catch (SecurityException ex) { }
-		return cl;
-	    }
-	});
-    }
-
-    static String getSystemProperty(final String propName) {
-	return (String)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    return System.getProperty(propName);
-                }
-            });
-    }
-
-    static FileInputStream getFileInputStream(final File file)
-        throws FileNotFoundException
-    {
-	try {
-            return (FileInputStream)
-                AccessController.doPrivileged(new PrivilegedExceptionAction() {
-                    public Object run() throws FileNotFoundException {
-                        return new FileInputStream(file);
-                    }
-                });
-	} catch (PrivilegedActionException e) {
-	    throw (FileNotFoundException)e.getException();
-	}
-    }
-
-    static InputStream getResourceAsStream(final ClassLoader cl,
-                                           final String name)
-    {
-        return (InputStream)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    InputStream ris;
-                    if (cl == null) {
-                        ris = ClassLoader.getSystemResourceAsStream(name);
-                    } else {
-                        ris = cl.getResourceAsStream(name);
-                    }
-                    return ris;
-                }
-            });
-    }
-
-    static boolean doesFileExist(final File f) {
-    return ((Boolean)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    return f.exists() ? Boolean.TRUE : Boolean.FALSE;
-                }
-            })).booleanValue();
-    }
-
-}
diff --git a/trunk/jaxp-api-1.3/src/main/java/javax/xml/parsers/FactoryFinder.java b/trunk/jaxp-api-1.3/src/main/java/javax/xml/parsers/FactoryFinder.java
deleted file mode 100644
index 6345034..0000000
--- a/trunk/jaxp-api-1.3/src/main/java/javax/xml/parsers/FactoryFinder.java
+++ /dev/null
@@ -1,339 +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.
- */
-
-// $Id: FactoryFinder.java 446598 2006-09-15 12:55:40Z jeremias $
-
-package javax.xml.parsers;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.Properties;
-
-/**
- * This class is duplicated for each JAXP subpackage so keep it in
- * sync.  It is package private.
- *
- * This code is designed to implement the JAXP 1.1 spec pluggability
- * feature and is designed to run on JDK version 1.1 and later including
- * JVMs that perform early linking like the Microsoft JVM in IE 5.  Note
- * however that it must be compiled on a JDK version 1.2 or later system
- * since it calls Thread#getContextClassLoader().  The code also runs both
- * as part of an unbundled jar file and when bundled as part of the JDK.
- */
-final class FactoryFinder {
-    
-    /** Temp debug code - this will be removed after we test everything
-     */
-    private static boolean debug = false;
-    static Properties cacheProps= new Properties();
-    static boolean firstTime = true;
-    
-    /**
-     * Default columns per line.
-     */
-    private static final int DEFAULT_LINE_LENGTH = 80;
-
-    // Define system property "jaxp.debug" to get output
-    static {
-        // Use try/catch block to support applets, which throws
-        // SecurityException out of this code.
-        try {
-            String val = SecuritySupport.getSystemProperty("jaxp.debug");
-            // Allow simply setting the prop to turn on debug
-            debug = val != null && (! "false".equals(val));
-        } catch (SecurityException se) {
-            debug = false;
-        }
-    }
-    
-    private FactoryFinder() {}
-
-    private static void dPrint(String msg) {
-        if (debug) {
-            System.err.println("JAXP: " + msg);
-        }
-    }
-    
-    /**
-     * Create an instance of a class using the specified ClassLoader and
-     * optionally fall back to the current ClassLoader if not found.
-     *
-     * @param className Name of the concrete class corresponding to the
-     * service provider
-     *
-     * @param cl ClassLoader to use to load the class, null means to use
-     * the bootstrap ClassLoader
-     *
-     * @param doFallback true if the current ClassLoader should be tried as
-     * a fallback if the class is not found using cl
-     */
-    private static Object newInstance(String className, ClassLoader cl,
-                                      boolean doFallback)
-        throws ConfigurationError
-    {
-        // assert(className != null);
-
-        try {
-            Class providerClass;
-            if (cl == null) {
-                // If classloader is null Use the bootstrap ClassLoader.  
-                // Thus Class.forName(String) will use the current
-                // ClassLoader which will be the bootstrap ClassLoader.
-                providerClass = Class.forName(className);
-            } else {
-                try {
-                    providerClass = cl.loadClass(className);
-                } catch (ClassNotFoundException x) {
-                    if (doFallback) {
-                        // Fall back to current classloader
-                        cl = FactoryFinder.class.getClassLoader();
-                        if (cl != null) {
-                            providerClass = cl.loadClass(className);
-                        }
-                        else {
-                            providerClass = Class.forName(className);
-                        }
-                    } else {
-                        throw x;
-                    }
-                }
-            }
-                        
-            Object instance = providerClass.newInstance();
-            if (debug) dPrint("created new instance of " + providerClass +
-                   " using ClassLoader: " + cl);
-            return instance;
-        } catch (ClassNotFoundException x) {
-            throw new ConfigurationError(
-                "Provider " + className + " not found", x);
-        } catch (Exception x) {
-            throw new ConfigurationError(
-                "Provider " + className + " could not be instantiated: " + x,
-                x);
-        }
-    }
-    
-    /**
-     * Finds the implementation Class object in the specified order.  Main
-     * entry point.
-     * @return Class object of factory, never null
-     *
-     * @param factoryId             Name of the factory to find, same as
-     *                              a property name
-     * @param fallbackClassName     Implementation class name, if nothing else
-     *                              is found.  Use null to mean no fallback.
-     *
-     * Package private so this code can be shared.
-     */
-    static Object find(String factoryId, String fallbackClassName)
-        throws ConfigurationError
-    {        
-
-        // Figure out which ClassLoader to use for loading the provider
-        // class.  If there is a Context ClassLoader then use it.
-        
-        ClassLoader classLoader = SecuritySupport.getContextClassLoader();
-        
-        if (classLoader == null) {
-            // if we have no Context ClassLoader
-            // so use the current ClassLoader
-            classLoader = FactoryFinder.class.getClassLoader();
-        }
-
-        if (debug) dPrint("find factoryId =" + factoryId);
-        
-        try {
-            // If we are deployed into an OSGi environment, leverage it
-            Class factoryClass = FactoryFinder.class.getClassLoader().loadClass(factoryId);
-            Class spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(factoryClass, factoryId);
-            if (spiClass != null) {
-                return spiClass.newInstance();
-            }
-        } catch (Throwable e) {
-        }
-
-        // Use the system property first
-        try {
-            String systemProp = SecuritySupport.getSystemProperty(factoryId);
-            if( systemProp!=null) {                
-                if (debug) dPrint("found system property, value=" + systemProp);
-                return newInstance(systemProp, classLoader, true );
-            }
-        } catch (SecurityException se) {
-            //if first option fails due to any reason we should try next option in the
-            //look up algorithm.
-        }
-
-        // try to read from $java.home/lib/jaxp.properties
-        try {
-            String javah = SecuritySupport.getSystemProperty("java.home");
-            String configFile = javah + File.separator +
-                "lib" + File.separator + "jaxp.properties";
-            String factoryClassName = null;
-            if(firstTime){
-                synchronized(cacheProps){
-                    if(firstTime){
-                        File f=new File( configFile );
-                        firstTime = false;
-                        if(SecuritySupport.doesFileExist(f)){
-                            if (debug) dPrint("Read properties file "+f);
-                            //cacheProps.load( new FileInputStream(f));
-                            cacheProps.load(SecuritySupport.getFileInputStream(f));
-                        }
-                    }
-                }
-            }
-            factoryClassName = cacheProps.getProperty(factoryId);            
-
-            if(factoryClassName != null){
-                if (debug) dPrint("found in $java.home/jaxp.properties, value=" + factoryClassName);
-                return newInstance(factoryClassName, classLoader, true);
-            }
-        } catch(Exception ex ) {
-            if( debug ) ex.printStackTrace();
-        }
-
-        // Try Jar Service Provider Mechanism
-        Object provider = findJarServiceProvider(factoryId);
-        if (provider != null) {
-            return provider;
-        }
-        if (fallbackClassName == null) {
-            throw new ConfigurationError(
-                "Provider for " + factoryId + " cannot be found", null);
-        }
-
-        if (debug) dPrint("loaded from fallback value: " + fallbackClassName);
-        return newInstance(fallbackClassName, classLoader, true);
-    }
-    
-    /*
-     * Try to find provider using Jar Service Provider Mechanism
-     *
-     * @return instance of provider class if found or null
-     */
-    private static Object findJarServiceProvider(String factoryId)
-        throws ConfigurationError
-    {
-
-        String serviceId = "META-INF/services/" + factoryId;
-        InputStream is = null;
-
-        // First try the Context ClassLoader
-        ClassLoader cl = SecuritySupport.getContextClassLoader();
-        if (cl != null) {
-            is = SecuritySupport.getResourceAsStream(cl, serviceId);
-
-            // If no provider found then try the current ClassLoader
-            if (is == null) {
-                cl = FactoryFinder.class.getClassLoader();
-                is = SecuritySupport.getResourceAsStream(cl, serviceId);
-            }
-        } else {
-            // No Context ClassLoader, try the current
-            // ClassLoader
-            cl = FactoryFinder.class.getClassLoader();
-            is = SecuritySupport.getResourceAsStream(cl, serviceId);
-        }
-
-        if (is == null) {
-            // No provider found
-            return null;
-        }
-
-        if (debug) dPrint("found jar resource=" + serviceId +
-               " using ClassLoader: " + cl);
-
-        // Read the service provider name in UTF-8 as specified in
-        // the jar spec.  Unfortunately this fails in Microsoft
-        // VJ++, which does not implement the UTF-8
-        // encoding. Theoretically, we should simply let it fail in
-        // that case, since the JVM is obviously broken if it
-        // doesn't support such a basic standard.  But since there
-        // are still some users attempting to use VJ++ for
-        // development, we have dropped in a fallback which makes a
-        // second attempt using the platform's default encoding. In
-        // VJ++ this is apparently ASCII, which is a subset of
-        // UTF-8... and since the strings we'll be reading here are
-        // also primarily limited to the 7-bit ASCII range (at
-        // least, in English versions), this should work well
-        // enough to keep us on the air until we're ready to
-        // officially decommit from VJ++. [Edited comment from
-        // jkesselm]
-        BufferedReader rd;
-        try {
-            rd = new BufferedReader(new InputStreamReader(is, "UTF-8"), DEFAULT_LINE_LENGTH);
-        } catch (java.io.UnsupportedEncodingException e) {
-            rd = new BufferedReader(new InputStreamReader(is), DEFAULT_LINE_LENGTH);
-        }
-        
-        String factoryClassName = null;
-        try {
-            // XXX Does not handle all possible input as specified by the
-            // Jar Service Provider specification
-            factoryClassName = rd.readLine();
-        } 
-        catch (IOException x) {
-            // No provider found
-            return null;
-        }
-        finally {
-            try { 
-                // try to close the reader. 
-                rd.close(); 
-            } 
-            // Ignore the exception. 
-            catch (IOException exc) {}
-        }
-
-        if (factoryClassName != null &&
-            ! "".equals(factoryClassName)) {
-            if (debug) dPrint("found in resource, value="
-                   + factoryClassName);
-
-        // Note: here we do not want to fall back to the current
-        // ClassLoader because we want to avoid the case where the
-        // resource file was found using one ClassLoader and the
-        // provider class was instantiated using a different one.
-        return newInstance(factoryClassName, cl, false);
-        }
-
-        // No provider found
-        return null;
-    }
-
-    static class ConfigurationError extends Error {
-        private Exception exception;
-
-        /**
-         * Construct a new instance with the specified detail string and
-         * exception.
-         */
-        ConfigurationError(String msg, Exception x) {
-            super(msg);
-            this.exception = x;
-        }
-
-        Exception getException() {
-            return exception;
-        }
-    }
-
-}
diff --git a/trunk/jaxp-api-1.3/src/main/java/javax/xml/parsers/ScuritySupport.java b/trunk/jaxp-api-1.3/src/main/java/javax/xml/parsers/ScuritySupport.java
deleted file mode 100644
index 95e92be..0000000
--- a/trunk/jaxp-api-1.3/src/main/java/javax/xml/parsers/ScuritySupport.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.
- */
-
-// $Id: SecuritySupport.java,v 1.2.24.1 2005/03/29 23:25:08 jsuttor Exp $
-
-package javax.xml.parsers;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.InputStream;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-
-/**
- * This class is duplicated for each JAXP subpackage so keep it in sync.
- * It is package private and therefore is not exposed as part of the JAXP
- * API.
- *
- * Security related methods that only work on J2SE 1.2 and newer.
- */
-final class SecuritySupport  {
-    
-    private SecuritySupport() {}
-    
-    static ClassLoader getContextClassLoader() {
-	return (ClassLoader)
-		AccessController.doPrivileged(new PrivilegedAction() {
-	    public Object run() {
-		ClassLoader cl = null;
-		try {
-		    cl = Thread.currentThread().getContextClassLoader();
-		} catch (SecurityException ex) { }
-		return cl;
-	    }
-	});
-    }
-
-    static String getSystemProperty(final String propName) {
-	return (String)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    return System.getProperty(propName);
-                }
-            });
-    }
-
-    static FileInputStream getFileInputStream(final File file)
-        throws FileNotFoundException
-    {
-	try {
-            return (FileInputStream)
-                AccessController.doPrivileged(new PrivilegedExceptionAction() {
-                    public Object run() throws FileNotFoundException {
-                        return new FileInputStream(file);
-                    }
-                });
-	} catch (PrivilegedActionException e) {
-	    throw (FileNotFoundException)e.getException();
-	}
-    }
-
-    static InputStream getResourceAsStream(final ClassLoader cl,
-                                           final String name)
-    {
-        return (InputStream)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    InputStream ris;
-                    if (cl == null) {
-                        ris = ClassLoader.getSystemResourceAsStream(name);
-                    } else {
-                        ris = cl.getResourceAsStream(name);
-                    }
-                    return ris;
-                }
-            });
-    }
-
-    static boolean doesFileExist(final File f) {
-    return ((Boolean)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    return f.exists() ? Boolean.TRUE : Boolean.FALSE;
-                }
-            })).booleanValue();
-    }
-
-}
diff --git a/trunk/jaxp-api-1.3/src/main/java/javax/xml/transform/FactoryFinder.java b/trunk/jaxp-api-1.3/src/main/java/javax/xml/transform/FactoryFinder.java
deleted file mode 100644
index 7a89f11..0000000
--- a/trunk/jaxp-api-1.3/src/main/java/javax/xml/transform/FactoryFinder.java
+++ /dev/null
@@ -1,339 +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.
- */
-
-// $Id: FactoryFinder.java 446598 2006-09-15 12:55:40Z jeremias $
-
-package javax.xml.transform;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.Properties;
-
-/**
- * This class is duplicated for each JAXP subpackage so keep it in
- * sync.  It is package private.
- *
- * This code is designed to implement the JAXP 1.1 spec pluggability
- * feature and is designed to run on JDK version 1.1 and later including
- * JVMs that perform early linking like the Microsoft JVM in IE 5.  Note
- * however that it must be compiled on a JDK version 1.2 or later system
- * since it calls Thread#getContextClassLoader().  The code also runs both
- * as part of an unbundled jar file and when bundled as part of the JDK.
- */
-final class FactoryFinder {
-    
-    /** Temp debug code - this will be removed after we test everything
-     */
-    private static boolean debug = false;
-    static Properties cacheProps= new Properties();
-    static boolean firstTime = true;
-    
-    /**
-     * Default columns per line.
-     */
-    private static final int DEFAULT_LINE_LENGTH = 80;
-
-    // Define system property "jaxp.debug" to get output
-    static {
-        // Use try/catch block to support applets, which throws
-        // SecurityException out of this code.
-        try {
-            String val = SecuritySupport.getSystemProperty("jaxp.debug");
-            // Allow simply setting the prop to turn on debug
-            debug = val != null && (! "false".equals(val));
-        } catch (SecurityException se) {
-            debug = false;
-        }
-    }
-    
-    private FactoryFinder() {}
-
-    private static void dPrint(String msg) {
-        if (debug) {
-            System.err.println("JAXP: " + msg);
-        }
-    }
-    
-    /**
-     * Create an instance of a class using the specified ClassLoader and
-     * optionally fall back to the current ClassLoader if not found.
-     *
-     * @param className Name of the concrete class corresponding to the
-     * service provider
-     *
-     * @param cl ClassLoader to use to load the class, null means to use
-     * the bootstrap ClassLoader
-     *
-     * @param doFallback true if the current ClassLoader should be tried as
-     * a fallback if the class is not found using cl
-     */
-    private static Object newInstance(String className, ClassLoader cl,
-                                      boolean doFallback)
-        throws ConfigurationError
-    {
-        // assert(className != null);
-
-        try {
-            Class providerClass;
-            if (cl == null) {
-                // If classloader is null Use the bootstrap ClassLoader.  
-                // Thus Class.forName(String) will use the current
-                // ClassLoader which will be the bootstrap ClassLoader.
-                providerClass = Class.forName(className);
-            } else {
-                try {
-                    providerClass = cl.loadClass(className);
-                } catch (ClassNotFoundException x) {
-                    if (doFallback) {
-                        // Fall back to current classloader
-                        cl = FactoryFinder.class.getClassLoader();
-                        if (cl != null) {
-                            providerClass = cl.loadClass(className);
-                        }
-                        else {
-                            providerClass = Class.forName(className);
-                        }
-                    } else {
-                        throw x;
-                    }
-                }
-            }
-                        
-            Object instance = providerClass.newInstance();
-            if (debug) dPrint("created new instance of " + providerClass +
-                   " using ClassLoader: " + cl);
-            return instance;
-        } catch (ClassNotFoundException x) {
-            throw new ConfigurationError(
-                "Provider " + className + " not found", x);
-        } catch (Exception x) {
-            throw new ConfigurationError(
-                "Provider " + className + " could not be instantiated: " + x,
-                x);
-        }
-    }
-    
-    /**
-     * Finds the implementation Class object in the specified order.  Main
-     * entry point.
-     * @return Class object of factory, never null
-     *
-     * @param factoryId             Name of the factory to find, same as
-     *                              a property name
-     * @param fallbackClassName     Implementation class name, if nothing else
-     *                              is found.  Use null to mean no fallback.
-     *
-     * Package private so this code can be shared.
-     */
-    static Object find(String factoryId, String fallbackClassName)
-        throws ConfigurationError
-    {        
-
-        // Figure out which ClassLoader to use for loading the provider
-        // class.  If there is a Context ClassLoader then use it.
-        
-        ClassLoader classLoader = SecuritySupport.getContextClassLoader();
-        
-        if (classLoader == null) {
-            // if we have no Context ClassLoader
-            // so use the current ClassLoader
-            classLoader = FactoryFinder.class.getClassLoader();
-        }
-
-        if (debug) dPrint("find factoryId =" + factoryId);
-        
-        try {
-            // If we are deployed into an OSGi environment, leverage it
-            Class factoryClass = FactoryFinder.class.getClassLoader().loadClass(factoryId);
-            Class spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(factoryClass, factoryId);
-            if (spiClass != null) {
-                return spiClass.newInstance();
-            }
-        } catch (Throwable e) {
-        }
-
-        // Use the system property first
-        try {
-            String systemProp = SecuritySupport.getSystemProperty(factoryId);
-            if( systemProp!=null) {                
-                if (debug) dPrint("found system property, value=" + systemProp);
-                return newInstance(systemProp, classLoader, true );
-            }
-        } catch (SecurityException se) {
-            //if first option fails due to any reason we should try next option in the
-            //look up algorithm.
-        }
-
-        // try to read from $java.home/lib/jaxp.properties
-        try {
-            String javah = SecuritySupport.getSystemProperty("java.home");
-            String configFile = javah + File.separator +
-                "lib" + File.separator + "jaxp.properties";
-            String factoryClassName = null;
-            if(firstTime){
-                synchronized(cacheProps){
-                    if(firstTime){
-                        File f=new File( configFile );
-                        firstTime = false;
-                        if(SecuritySupport.doesFileExist(f)){
-                            if (debug) dPrint("Read properties file "+f);
-                            //cacheProps.load( new FileInputStream(f));
-                            cacheProps.load(SecuritySupport.getFileInputStream(f));
-                        }
-                    }
-                }
-            }
-            factoryClassName = cacheProps.getProperty(factoryId);            
-
-            if(factoryClassName != null){
-                if (debug) dPrint("found in $java.home/jaxp.properties, value=" + factoryClassName);
-                return newInstance(factoryClassName, classLoader, true);
-            }
-        } catch(Exception ex ) {
-            if( debug ) ex.printStackTrace();
-        }
-
-        // Try Jar Service Provider Mechanism
-        Object provider = findJarServiceProvider(factoryId);
-        if (provider != null) {
-            return provider;
-        }
-        if (fallbackClassName == null) {
-            throw new ConfigurationError(
-                "Provider for " + factoryId + " cannot be found", null);
-        }
-
-        if (debug) dPrint("loaded from fallback value: " + fallbackClassName);
-        return newInstance(fallbackClassName, classLoader, true);
-    }
-    
-    /*
-     * Try to find provider using Jar Service Provider Mechanism
-     *
-     * @return instance of provider class if found or null
-     */
-    private static Object findJarServiceProvider(String factoryId)
-        throws ConfigurationError
-    {
-
-        String serviceId = "META-INF/services/" + factoryId;
-        InputStream is = null;
-
-        // First try the Context ClassLoader
-        ClassLoader cl = SecuritySupport.getContextClassLoader();
-        if (cl != null) {
-            is = SecuritySupport.getResourceAsStream(cl, serviceId);
-
-            // If no provider found then try the current ClassLoader
-            if (is == null) {
-                cl = FactoryFinder.class.getClassLoader();
-                is = SecuritySupport.getResourceAsStream(cl, serviceId);
-            }
-        } else {
-            // No Context ClassLoader, try the current
-            // ClassLoader
-            cl = FactoryFinder.class.getClassLoader();
-            is = SecuritySupport.getResourceAsStream(cl, serviceId);
-        }
-
-        if (is == null) {
-            // No provider found
-            return null;
-        }
-
-        if (debug) dPrint("found jar resource=" + serviceId +
-               " using ClassLoader: " + cl);
-
-        // Read the service provider name in UTF-8 as specified in
-        // the jar spec.  Unfortunately this fails in Microsoft
-        // VJ++, which does not implement the UTF-8
-        // encoding. Theoretically, we should simply let it fail in
-        // that case, since the JVM is obviously broken if it
-        // doesn't support such a basic standard.  But since there
-        // are still some users attempting to use VJ++ for
-        // development, we have dropped in a fallback which makes a
-        // second attempt using the platform's default encoding. In
-        // VJ++ this is apparently ASCII, which is a subset of
-        // UTF-8... and since the strings we'll be reading here are
-        // also primarily limited to the 7-bit ASCII range (at
-        // least, in English versions), this should work well
-        // enough to keep us on the air until we're ready to
-        // officially decommit from VJ++. [Edited comment from
-        // jkesselm]
-        BufferedReader rd;
-        try {
-            rd = new BufferedReader(new InputStreamReader(is, "UTF-8"), DEFAULT_LINE_LENGTH);
-        } catch (java.io.UnsupportedEncodingException e) {
-            rd = new BufferedReader(new InputStreamReader(is), DEFAULT_LINE_LENGTH);
-        }
-        
-        String factoryClassName = null;
-        try {
-            // XXX Does not handle all possible input as specified by the
-            // Jar Service Provider specification
-            factoryClassName = rd.readLine();
-        } 
-        catch (IOException x) {
-            // No provider found
-            return null;
-        }
-        finally {
-            try { 
-                // try to close the reader. 
-                rd.close(); 
-            } 
-            // Ignore the exception. 
-            catch (IOException exc) {}
-        }
-
-        if (factoryClassName != null &&
-            ! "".equals(factoryClassName)) {
-            if (debug) dPrint("found in resource, value="
-                   + factoryClassName);
-
-        // Note: here we do not want to fall back to the current
-        // ClassLoader because we want to avoid the case where the
-        // resource file was found using one ClassLoader and the
-        // provider class was instantiated using a different one.
-        return newInstance(factoryClassName, cl, false);
-        }
-
-        // No provider found
-        return null;
-    }
-
-    static class ConfigurationError extends Error {
-        private Exception exception;
-
-        /**
-         * Construct a new instance with the specified detail string and
-         * exception.
-         */
-        ConfigurationError(String msg, Exception x) {
-            super(msg);
-            this.exception = x;
-        }
-
-        Exception getException() {
-            return exception;
-        }
-    }
-
-}
diff --git a/trunk/jaxp-api-1.3/src/main/java/javax/xml/transform/SecuritySupport.java b/trunk/jaxp-api-1.3/src/main/java/javax/xml/transform/SecuritySupport.java
deleted file mode 100644
index 570dc5e..0000000
--- a/trunk/jaxp-api-1.3/src/main/java/javax/xml/transform/SecuritySupport.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.
- */
-
-// $Id: SecuritySupport.java,v 1.2.24.1 2005/03/29 23:32:22 jsuttor Exp $
-
-package javax.xml.transform;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.InputStream;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-
-/**
- * This class is duplicated for each JAXP subpackage so keep it in sync.
- * It is package private and therefore is not exposed as part of the JAXP
- * API.
- *
- * Security related methods that only work on J2SE 1.2 and newer.
- */
-final class SecuritySupport  {
-    
-    private SecuritySupport() {}
-    
-    static ClassLoader getContextClassLoader() {
-	return (ClassLoader)
-		AccessController.doPrivileged(new PrivilegedAction() {
-	    public Object run() {
-		ClassLoader cl = null;
-		try {
-		    cl = Thread.currentThread().getContextClassLoader();
-		} catch (SecurityException ex) { }
-		return cl;
-	    }
-	});
-    }
-
-    static String getSystemProperty(final String propName) {
-	return (String)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    return System.getProperty(propName);
-                }
-            });
-    }
-
-    static FileInputStream getFileInputStream(final File file)
-        throws FileNotFoundException
-    {
-	try {
-            return (FileInputStream)
-                AccessController.doPrivileged(new PrivilegedExceptionAction() {
-                    public Object run() throws FileNotFoundException {
-                        return new FileInputStream(file);
-                    }
-                });
-	} catch (PrivilegedActionException e) {
-	    throw (FileNotFoundException)e.getException();
-	}
-    }
-
-    static InputStream getResourceAsStream(final ClassLoader cl,
-                                           final String name)
-    {
-        return (InputStream)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    InputStream ris;
-                    if (cl == null) {
-                        ris = ClassLoader.getSystemResourceAsStream(name);
-                    } else {
-                        ris = cl.getResourceAsStream(name);
-                    }
-                    return ris;
-                }
-            });
-    }
-
-    static boolean doesFileExist(final File f) {
-    return ((Boolean)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    return f.exists() ? Boolean.TRUE : Boolean.FALSE;
-                }
-            })).booleanValue();
-    }
-
-}
diff --git a/trunk/jaxp-api-1.3/src/main/java/javax/xml/validation/SchemaFactoryFinder.java b/trunk/jaxp-api-1.3/src/main/java/javax/xml/validation/SchemaFactoryFinder.java
deleted file mode 100644
index 65f981c..0000000
--- a/trunk/jaxp-api-1.3/src/main/java/javax/xml/validation/SchemaFactoryFinder.java
+++ /dev/null
@@ -1,471 +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.
- */
-// $Id: SchemaFactoryFinder.java 446598 2006-09-15 12:55:40Z jeremias $
-
-package javax.xml.validation;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-import java.util.Properties;
-
-/**
- * Implementation of {@link SchemaFactory#newInstance(String)}.
- * 
- * @author <a href="Kohsuke.Kawaguchi@Sun.com">Kohsuke Kawaguchi</a>
- * @version $Revision: 446598 $, $Date: 2006-09-15 08:55:40 -0400 (Fri, 15 Sep 2006) $
- * @since 1.5
- */
-final class SchemaFactoryFinder  {
-
-    /** debug support code. */
-    private static boolean debug = false;
-
-    /**
-     * <p>Cache properties for performance.</p>
-     */
-	private static Properties cacheProps = new Properties();
-    
-	/**
-	 * <p>First time requires initialization overhead.</p>
-	 */
-	private static boolean firstTime = true;
-    
-    /**
-     * Default columns per line.
-     */
-    private static final int DEFAULT_LINE_LENGTH = 80;
-    
-    static {
-        // Use try/catch block to support applets
-        try {
-            String val = SecuritySupport.getSystemProperty("jaxp.debug");
-            // Allow simply setting the prop to turn on debug
-            debug = val != null && (! "false".equals(val));
-        } catch (Exception _) {
-            debug = false;
-        }
-    }
-
-    /**
-     * <p>Conditional debug printing.</p>
-     * 
-     * @param msg to print
-     */
-    private static void debugPrintln(String msg) {
-        if (debug) {
-            System.err.println("JAXP: " + msg);
-        }
-    }
-    
-    /**
-     * <p><code>ClassLoader</code> to use to find <code>SchemaFactory</code>.</p>
-     */
-    private final ClassLoader classLoader;
-    
-    /**
-     * <p>Constructor that specifies <code>ClassLoader</code> to use
-     * to find <code>SchemaFactory</code>.</p>
-     * 
-     * @param loader
-     *      to be used to load resource, {@link SchemaFactory}, and
-     *      {@link SchemaFactoryLoader} implementations during
-     *      the resolution process.
-     *      If this parameter is null, the default system class loader
-     *      will be used.
-     */
-    public SchemaFactoryFinder(ClassLoader loader) {
-        this.classLoader = loader;
-        if( debug ) {
-            debugDisplayClassLoader();
-        }
-    }
-    
-    private void debugDisplayClassLoader() {
-        try {
-            if( classLoader == SecuritySupport.getContextClassLoader() ) {
-                debugPrintln("using thread context class loader ("+classLoader+") for search");
-                return;
-            }
-        } catch( Throwable _ ) {
-            ; // getContextClassLoader() undefined in JDK1.1 
-        }
-        
-        if( classLoader==ClassLoader.getSystemClassLoader() ) {
-            debugPrintln("using system class loader ("+classLoader+") for search");
-            return;
-        }
-
-        debugPrintln("using class loader ("+classLoader+") for search");
-    }
-    
-    /**
-     * <p>Creates a new {@link SchemaFactory} object for the specified
-     * schema language.</p>
-     * 
-     * @param schemaLanguage
-     *      See {@link SchemaFactory Schema Language} table in <code>SchemaFactory</code>
-     *      for the list of available schema languages.
-     * 
-     * @return <code>null</code> if the callee fails to create one.
-     * 
-     * @throws NullPointerException
-     *      If the <tt>schemaLanguage</tt> parameter is null.
-     */
-    public SchemaFactory newFactory(String schemaLanguage) {
-        if(schemaLanguage==null)        throw new NullPointerException();
-        SchemaFactory f = _newFactory(schemaLanguage);
-        if (debug) {
-            if (f != null) {
-                debugPrintln("factory '" + f.getClass().getName() + "' was found for " + schemaLanguage);
-            } else {
-                debugPrintln("unable to find a factory for " + schemaLanguage);
-            }
-        }
-        return f;
-    }
-    
-    /**
-     * <p>Lookup a <code>SchemaFactory</code> for the given <code>schemaLanguage</code>.</p>
-     * 
-     * @param schemaLanguage Schema language to lookup <code>SchemaFactory</code> for.
-     *  
-     * @return <code>SchemaFactory</code> for the given <code>schemaLanguage</code>.
-     */
-    private SchemaFactory _newFactory(String schemaLanguage) {
-        SchemaFactory sf;
-        String propertyName = SERVICE_CLASS.getName() + ":" + schemaLanguage;
-        
-        try {
-            // If we are deployed into an OSGi environment, leverage it
-            Class spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(SERVICE_CLASS);
-            if (spiClass != null) {
-                return (SchemaFactory) spiClass.newInstance();
-            }
-        } catch (Throwable e) {
-        }
-
-        // system property look up
-        try {
-            if (debug) debugPrintln("Looking up system property '"+propertyName+"'" );
-            String r = SecuritySupport.getSystemProperty(propertyName);
-            if (r != null) {
-                if (debug) debugPrintln("The value is '"+r+"'");
-                sf = createInstance(r);
-                if(sf!=null)    return sf;
-            } 
-            else if (debug) {
-                debugPrintln("The property is undefined.");
-            }
-        } catch( Throwable t ) {
-            if( debug ) {
-                debugPrintln("failed to look up system property '"+propertyName+"'" );
-                t.printStackTrace();
-            }
-        }
-
-        String javah = SecuritySupport.getSystemProperty( "java.home" );
-        String configFile = javah + File.separator +
-        "lib" + File.separator + "jaxp.properties";
-
-        String factoryClassName = null ;
-
-        // try to read from $java.home/lib/jaxp.properties
-        try {
-            if(firstTime){
-                synchronized(cacheProps){
-                    if(firstTime){
-                        File f=new File( configFile );
-                        firstTime = false;
-                        if(SecuritySupport.doesFileExist(f)){
-                            if (debug) debugPrintln("Read properties file " + f);                                
-                            cacheProps.load(SecuritySupport.getFileInputStream(f));
-                        }
-                    }
-                }
-            }
-            factoryClassName = cacheProps.getProperty(propertyName);            
-            if (debug) debugPrintln("found " + factoryClassName + " in $java.home/jaxp.properties"); 
-
-            if (factoryClassName != null) {
-                sf = createInstance(factoryClassName);
-                if(sf != null){
-                    return sf;
-                }
-            }
-        } catch (Exception ex) {
-            if (debug) {
-                ex.printStackTrace();
-            } 
-        }
-
-        /**
-        // try to read from $java.home/lib/jaxp.properties
-        try {
-            String javah = ss.getSystemProperty( "java.home" );
-            String configFile = javah + File.separator +
-            "lib" + File.separator + "jaxp.properties";
-            File f = new File( configFile );
-            if( ss.doesFileExist(f)) {
-                sf = loadFromProperty(
-                        propertyName,f.getAbsolutePath(), new FileInputStream(f));
-                if(sf!=null)    return sf;
-            } else {
-                debugPrintln("Tried to read "+ f.getAbsolutePath()+", but it doesn't exist.");
-            }
-        } catch(Throwable e) {
-            if( debug ) {
-                debugPrintln("failed to read $java.home/lib/jaxp.properties");
-                e.printStackTrace();
-            }
-        }
-         */
-        
-        // try META-INF/services files
-        Iterator sitr = createServiceFileIterator();
-        while(sitr.hasNext()) {
-            URL resource = (URL)sitr.next();
-            if (debug) debugPrintln("looking into " + resource);
-            try {
-                sf = loadFromServicesFile(schemaLanguage,resource.toExternalForm(),SecuritySupport.getURLInputStream(resource));
-                if(sf!=null)    return sf;
-            } catch(IOException e) {
-                if( debug ) {
-                    debugPrintln("failed to read "+resource);
-                    e.printStackTrace();
-                }
-            }
-        }
-        
-        // platform default
-        if (schemaLanguage.equals("http://www.w3.org/2001/XMLSchema")) {
-            if (debug) debugPrintln("attempting to use the platform default XML Schema validator");
-            return createInstance("org.apache.xerces.jaxp.validation.XMLSchemaFactory");
-        }
-        
-        if (debug) debugPrintln("all things were tried, but none was found. bailing out.");
-        return null;
-    }
-    
-    /**
-     * <p>Creates an instance of the specified and returns it.</p>
-     * 
-     * @param className
-     *      fully qualified class name to be instanciated.
-     * 
-     * @return null
-     *      if it fails. Error messages will be printed by this method. 
-     */
-     SchemaFactory createInstance( String className ) {
-        try {
-            if (debug) debugPrintln("instanciating "+className);
-            Class clazz;
-            if( classLoader!=null )
-                clazz = classLoader.loadClass(className);
-            else
-                clazz = Class.forName(className);
-            if(debug)       debugPrintln("loaded it from "+which(clazz));
-            Object o = clazz.newInstance();
-            
-            if( o instanceof SchemaFactory )
-                return (SchemaFactory)o;
-            
-            if (debug) debugPrintln(className+" is not assignable to "+SERVICE_CLASS.getName());
-        } catch( Throwable t ) {
-            debugPrintln("failed to instanciate "+className);
-            if(debug)   t.printStackTrace();
-        }
-        return null;
-    }
-    
-    /** Iterator that lazily computes one value and returns it. */
-    private static abstract class SingleIterator implements Iterator {
-        private boolean seen = false;
-        
-        public final void remove() { throw new UnsupportedOperationException(); }
-        public final boolean hasNext() { return !seen; }
-        public final Object next() {
-            if(seen)    throw new NoSuchElementException();
-            seen = true;
-            return value();
-        }
-        
-        protected abstract Object value();
-    }
-    
-    /**
-     * Returns an {@link Iterator} that enumerates all 
-     * the META-INF/services files that we care.
-     */
-    private Iterator createServiceFileIterator() {
-        if (classLoader == null) {
-            return new SingleIterator() {
-                protected Object value() {
-                    ClassLoader classLoader = SchemaFactoryFinder.class.getClassLoader();
-                    //return (ClassLoader.getSystemResource( SERVICE_ID ));
-                    return SecuritySupport.getResourceAsURL(classLoader, SERVICE_ID);
-                }
-            };
-        } else {
-            try {
-                //final Enumeration e = classLoader.getResources(SERVICE_ID);
-                final Enumeration e = SecuritySupport.getResources(classLoader, SERVICE_ID);
-                if(debug && !e.hasMoreElements()) {
-                    debugPrintln("no "+SERVICE_ID+" file was found");
-                }
-                
-                // wrap it into an Iterator.
-                return new Iterator() {
-                    public void remove() {
-                        throw new UnsupportedOperationException();
-                    }
-
-                    public boolean hasNext() {
-                        return e.hasMoreElements();
-                    }
-
-                    public Object next() {
-                        return e.nextElement();
-                    }
-                };
-            } catch (IOException e) {
-                if (debug) {
-                    debugPrintln("failed to enumerate resources "+SERVICE_ID);
-                    e.printStackTrace();
-                }
-                return new ArrayList().iterator();  // empty iterator
-            }
-        }
-    }
-    
-    /** Searches for a SchemaFactory for a given schema language in a META-INF/services file. */
-    private SchemaFactory loadFromServicesFile(String schemaLanguage, String resourceName, InputStream in) {
-
-        if (debug) debugPrintln("Reading "+resourceName );
-        
-        // Read the service provider name in UTF-8 as specified in
-        // the jar spec.  Unfortunately this fails in Microsoft
-        // VJ++, which does not implement the UTF-8
-        // encoding. Theoretically, we should simply let it fail in
-        // that case, since the JVM is obviously broken if it
-        // doesn't support such a basic standard.  But since there
-        // are still some users attempting to use VJ++ for
-        // development, we have dropped in a fallback which makes a
-        // second attempt using the platform's default encoding. In
-        // VJ++ this is apparently ASCII, which is a subset of
-        // UTF-8... and since the strings we'll be reading here are
-        // also primarily limited to the 7-bit ASCII range (at
-        // least, in English versions), this should work well
-        // enough to keep us on the air until we're ready to
-        // officially decommit from VJ++. [Edited comment from
-        // jkesselm]
-        BufferedReader rd;
-        try {
-            rd = new BufferedReader(new InputStreamReader(in, "UTF-8"), DEFAULT_LINE_LENGTH);
-        } catch (java.io.UnsupportedEncodingException e) {
-            rd = new BufferedReader(new InputStreamReader(in), DEFAULT_LINE_LENGTH);
-        }
-        
-        String factoryClassName = null;
-        SchemaFactory resultFactory = null;
-        // See spec for provider-configuration files: http://java.sun.com/j2se/1.5.0/docs/guide/jar/jar.html#Provider%20Configuration%20File
-        while (true) {
-            try {
-                factoryClassName = rd.readLine();   
-            } catch (IOException x) {
-                // No provider found
-                break;
-            }
-            if (factoryClassName != null) {
-                // Ignore comments in the provider-configuration file
-                int hashIndex = factoryClassName.indexOf('#');
-                if (hashIndex != -1) {
-                    factoryClassName = factoryClassName.substring(0, hashIndex);
-                }
-                
-                // Ignore leading and trailing whitespace
-                factoryClassName = factoryClassName.trim();
-                
-                // If there's no text left or if this was a blank line, go to the next one.
-                if (factoryClassName.length() == 0) {
-                    continue;
-                }
-                
-                try {
-                    // Found the right SchemaFactory if its isSchemaLanguageSupported(schemaLanguage) method returns true.
-                    SchemaFactory foundFactory = (SchemaFactory) createInstance(factoryClassName);
-                    if (foundFactory.isSchemaLanguageSupported(schemaLanguage)) {
-                        resultFactory = foundFactory;
-                        break;
-                    }
-                }
-                catch (Exception e) {}
-            }
-            else {
-                break;
-            }
-        }
-        
-        try {
-            // try to close the reader.
-            rd.close();
-        }
-        // Ignore the exception.
-        catch (IOException exc) {}
-        
-        return resultFactory;
-    }
-    
-    private static final Class SERVICE_CLASS = SchemaFactory.class;
-    private static final String SERVICE_ID = "META-INF/services/" + SERVICE_CLASS.getName();
-    
-    
-    
-    private static String which( Class clazz ) {
-        return which( clazz.getName(), clazz.getClassLoader() );
-    }
-
-    /**
-     * <p>Search the specified classloader for the given classname.</p>
-     *
-     * @param classname the fully qualified name of the class to search for
-     * @param loader the classloader to search
-     * 
-     * @return the source location of the resource, or null if it wasn't found
-     */
-    private static String which(String classname, ClassLoader loader) {
-
-        String classnameAsResource = classname.replace('.', '/') + ".class";
-        
-        if( loader==null )  loader = ClassLoader.getSystemClassLoader();
-        
-        //URL it = loader.getResource(classnameAsResource);
-        URL it = SecuritySupport.getResourceAsURL(loader, classnameAsResource);
-        if (it != null) {
-            return it.toString();
-        } else {
-            return null;
-        }
-    }
-}
diff --git a/trunk/jaxp-api-1.3/src/main/java/javax/xml/validation/SecuritySupport.java b/trunk/jaxp-api-1.3/src/main/java/javax/xml/validation/SecuritySupport.java
deleted file mode 100644
index fea9147..0000000
--- a/trunk/jaxp-api-1.3/src/main/java/javax/xml/validation/SecuritySupport.java
+++ /dev/null
@@ -1,160 +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.
- */
-// $Id: SecuritySupport.java 446598 2006-09-15 12:55:40Z jeremias $
-
-package javax.xml.validation;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-import java.util.Enumeration;
-
-/**
- * This class is duplicated for each JAXP subpackage so keep it in sync.
- * It is package private and therefore is not exposed as part of the JAXP
- * API.
- *
- * Security related methods that only work on J2SE 1.2 and newer.
- */
-final class SecuritySupport  {
-    
-    private SecuritySupport() {}
-    
-    static ClassLoader getContextClassLoader() {
-	return (ClassLoader)
-		AccessController.doPrivileged(new PrivilegedAction() {
-	    public Object run() {
-		ClassLoader cl = null;
-		try {
-		    cl = Thread.currentThread().getContextClassLoader();
-		} catch (SecurityException ex) { }
-		return cl;
-	    }
-	});
-    }
-
-    static String getSystemProperty(final String propName) {
-	return (String)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    return System.getProperty(propName);
-                }
-            });
-    }
-
-    static FileInputStream getFileInputStream(final File file)
-        throws FileNotFoundException
-    {
-	try {
-            return (FileInputStream)
-                AccessController.doPrivileged(new PrivilegedExceptionAction() {
-                    public Object run() throws FileNotFoundException {
-                        return new FileInputStream(file);
-                    }
-                });
-	} catch (PrivilegedActionException e) {
-	    throw (FileNotFoundException)e.getException();
-	}
-    }
-
-    static InputStream getURLInputStream(final URL url)
-        throws IOException
-    {
-	try {
-            return (InputStream)
-                AccessController.doPrivileged(new PrivilegedExceptionAction() {
-                    public Object run() throws IOException {
-                        return url.openStream();
-                    }
-                });
-	} catch (PrivilegedActionException e) {
-	    throw (IOException)e.getException();
-	}
-    }
-
-    static URL getResourceAsURL(final ClassLoader cl,
-                                final String name)
-    {
-        return (URL)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    URL url;
-                    if (cl == null) {
-                        url = ClassLoader.getSystemResource(name);
-                    } else {
-                        url = cl.getSystemResource(name);
-                    }
-                    return url;
-                }
-            });
-    }
-
-    static Enumeration getResources(final ClassLoader cl,
-                                    final String name) throws IOException
-    {
-        try{
-        return (Enumeration)
-            AccessController.doPrivileged(new PrivilegedExceptionAction() {
-                public Object run() throws IOException{
-                    Enumeration enumeration;
-                    if (cl == null) {
-                        enumeration = ClassLoader.getSystemResources(name);
-                    } else {
-                        enumeration = cl.getSystemResources(name);
-                    }
-                    return enumeration;
-                }
-            });
-        }catch(PrivilegedActionException e){
-            throw (IOException)e.getException();
-        }
-    }
-    
-    static InputStream getResourceAsStream(final ClassLoader cl,
-                                           final String name)
-    {
-        return (InputStream)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    InputStream ris;
-                    if (cl == null) {
-                        ris = ClassLoader.getSystemResourceAsStream(name);
-                    } else {
-                        ris = cl.getResourceAsStream(name);
-                    }
-                    return ris;
-                }
-            });
-    }
-
-    static boolean doesFileExist(final File f) {
-    return ((Boolean)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    return f.exists() ? Boolean.TRUE : Boolean.FALSE;
-                }
-            })).booleanValue();
-    }
-
-}
diff --git a/trunk/jaxp-api-1.3/src/main/java/javax/xml/xpath/SecuritySupport.java b/trunk/jaxp-api-1.3/src/main/java/javax/xml/xpath/SecuritySupport.java
deleted file mode 100644
index c392de1..0000000
--- a/trunk/jaxp-api-1.3/src/main/java/javax/xml/xpath/SecuritySupport.java
+++ /dev/null
@@ -1,160 +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.
- */
-// $Id: SecuritySupport.java 446598 2006-09-15 12:55:40Z jeremias $
-
-package javax.xml.xpath;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-import java.util.Enumeration;
-
-/**
- * This class is duplicated for each JAXP subpackage so keep it in sync.
- * It is package private and therefore is not exposed as part of the JAXP
- * API.
- *
- * Security related methods that only work on J2SE 1.2 and newer.
- */
-final class SecuritySupport  {
-    
-    private SecuritySupport() {}
-    
-    static ClassLoader getContextClassLoader() {
-	return (ClassLoader)
-		AccessController.doPrivileged(new PrivilegedAction() {
-	    public Object run() {
-		ClassLoader cl = null;
-		try {
-		    cl = Thread.currentThread().getContextClassLoader();
-		} catch (SecurityException ex) { }
-		return cl;
-	    }
-	});
-    }
-
-    static String getSystemProperty(final String propName) {
-	return (String)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    return System.getProperty(propName);
-                }
-            });
-    }
-
-    static FileInputStream getFileInputStream(final File file)
-        throws FileNotFoundException
-    {
-	try {
-            return (FileInputStream)
-                AccessController.doPrivileged(new PrivilegedExceptionAction() {
-                    public Object run() throws FileNotFoundException {
-                        return new FileInputStream(file);
-                    }
-                });
-	} catch (PrivilegedActionException e) {
-	    throw (FileNotFoundException)e.getException();
-	}
-    }
-
-    static InputStream getURLInputStream(final URL url)
-        throws IOException
-    {
-	try {
-            return (InputStream)
-                AccessController.doPrivileged(new PrivilegedExceptionAction() {
-                    public Object run() throws IOException {
-                        return url.openStream();
-                    }
-                });
-	} catch (PrivilegedActionException e) {
-	    throw (IOException)e.getException();
-	}
-    }
-
-    static URL getResourceAsURL(final ClassLoader cl,
-                                final String name)
-    {
-        return (URL)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    URL url;
-                    if (cl == null) {
-                        url = ClassLoader.getSystemResource(name);
-                    } else {
-                        url = cl.getSystemResource(name);
-                    }
-                    return url;
-                }
-            });
-    }
-
-    static Enumeration getResources(final ClassLoader cl,
-                                    final String name) throws IOException
-    {
-        try{
-        return (Enumeration)
-            AccessController.doPrivileged(new PrivilegedExceptionAction() {
-                public Object run() throws IOException{
-                    Enumeration enumeration;
-                    if (cl == null) {
-                        enumeration = ClassLoader.getSystemResources(name);
-                    } else {
-                        enumeration = cl.getSystemResources(name);
-                    }
-                    return enumeration;
-                }
-            });
-        }catch(PrivilegedActionException e){
-            throw (IOException)e.getException();
-        }
-    }
-    
-    static InputStream getResourceAsStream(final ClassLoader cl,
-                                           final String name)
-    {
-        return (InputStream)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    InputStream ris;
-                    if (cl == null) {
-                        ris = ClassLoader.getSystemResourceAsStream(name);
-                    } else {
-                        ris = cl.getResourceAsStream(name);
-                    }
-                    return ris;
-                }
-            });
-    }
-
-    static boolean doesFileExist(final File f) {
-    return ((Boolean)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    return f.exists() ? Boolean.TRUE : Boolean.FALSE;
-                }
-            })).booleanValue();
-    }
-
-}
diff --git a/trunk/jaxp-api-1.3/src/main/java/javax/xml/xpath/XPathFactoryFinder.java b/trunk/jaxp-api-1.3/src/main/java/javax/xml/xpath/XPathFactoryFinder.java
deleted file mode 100644
index f5e80a1..0000000
--- a/trunk/jaxp-api-1.3/src/main/java/javax/xml/xpath/XPathFactoryFinder.java
+++ /dev/null
@@ -1,437 +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.
- */
-// $Id: XPathFactoryFinder.java 446598 2006-09-15 12:55:40Z jeremias $
-
-package javax.xml.xpath;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-import java.util.Properties;
-
-import javax.xml.validation.SchemaFactory;
-
-/**
- * Implementation of {@link XPathFactory#newInstance(String)}.
- * 
- * @author <a href="Kohsuke.Kawaguchi@Sun.com">Kohsuke Kawaguchi</a>
- * @version $Revision: 446598 $, $Date: 2006-09-15 08:55:40 -0400 (Fri, 15 Sep 2006) $
- * @since 1.5
- */
-final class XPathFactoryFinder {
-    
-    /** debug support code. */
-    private static boolean debug = false;
-    
-    /**
-     * Default columns per line.
-     */
-    private static final int DEFAULT_LINE_LENGTH = 80;
-    
-    static {
-        // Use try/catch block to support applets
-        try {
-            String val = SecuritySupport.getSystemProperty("jaxp.debug");
-            // Allow simply setting the prop to turn on debug
-            debug = val != null && (! "false".equals(val));
-        } catch (Exception _) {
-            debug = false;
-        }
-    }
-
-    /**
-     * <p>Cache properties for performance.</p>
-     */
-	private static Properties cacheProps = new Properties();
-    
-	/**
-	 * <p>First time requires initialization overhead.</p>
-	 */
-	private static boolean firstTime = true;
-    
-    /**
-     * <p>Conditional debug printing.</p>
-     * 
-     * @param msg to print
-     */
-    private static void debugPrintln(String msg) {
-        if (debug) {
-            System.err.println("JAXP: " + msg);
-        }
-    }
-    
-    /**
-     * <p><code>ClassLoader</code> to use to find <code>SchemaFactory</code>.</p>
-     */
-    private final ClassLoader classLoader;
-    
-    /**
-     * <p>Constructor that specifies <code>ClassLoader</code> to use
-     * to find <code>SchemaFactory</code>.</p>
-     * 
-     * @param loader
-     *      to be used to load resource, {@link SchemaFactory}, and
-     *      {@link SchemaFactoryLoader} implementations during
-     *      the resolution process.
-     *      If this parameter is null, the default system class loader
-     *      will be used.
-     */
-    public XPathFactoryFinder(ClassLoader loader) {
-        this.classLoader = loader;
-        if( debug ) {
-            debugDisplayClassLoader();
-        }
-    }
-    
-    private void debugDisplayClassLoader() {
-        try {
-            if( classLoader == SecuritySupport.getContextClassLoader() ) {
-                debugPrintln("using thread context class loader ("+classLoader+") for search");
-                return;
-            }
-        } catch( Throwable _ ) {
-            ; // getContextClassLoader() undefined in JDK1.1 
-        }
-        
-        if( classLoader==ClassLoader.getSystemClassLoader() ) {
-            debugPrintln("using system class loader ("+classLoader+") for search");
-            return;
-        }
-
-        debugPrintln("using class loader ("+classLoader+") for search");
-    }
-    
-    /**
-     * <p>Creates a new {@link XPathFactory} object for the specified
-     * schema language.</p>
-     * 
-     * @param uri
-     *       Identifies the underlying object model.
-     * 
-     * @return <code>null</code> if the callee fails to create one.
-     * 
-     * @throws NullPointerException
-     *      If the parameter is null.
-     */
-    public XPathFactory newFactory(String uri) {
-        if(uri==null)        throw new NullPointerException();
-        XPathFactory f = _newFactory(uri);
-        if (debug) {
-            if (f != null) {
-                debugPrintln("factory '" + f.getClass().getName() + "' was found for " + uri);
-            } else {
-                debugPrintln("unable to find a factory for " + uri);
-            }
-        }
-        return f;
-    }
-    
-    /**
-     * <p>Lookup a {@link XPathFactory} for the given object model.</p>
-     * 
-     * @param uri identifies the object model.
-     *  
-     * @return {@link XPathFactory} for the given object model.
-     */
-    private XPathFactory _newFactory(String uri) {
-        XPathFactory sf;
-        
-        String propertyName = SERVICE_CLASS.getName() + ":" + uri;
-        
-        try {
-            // If we are deployed into an OSGi environment, leverage it
-            Class spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(SERVICE_CLASS);
-            if (spiClass != null) {
-                return (XPathFactory) spiClass.newInstance();
-            }
-        } catch (Throwable e) {
-        }
-
-        // system property look up
-        try {
-            if (debug) debugPrintln("Looking up system property '"+propertyName+"'" );
-            String r = SecuritySupport.getSystemProperty(propertyName);
-            if(r!=null) {
-                if (debug) debugPrintln("The value is '"+r+"'");
-                sf = createInstance(r);
-                if(sf!=null)    return sf;
-            } 
-            else if (debug) {
-                debugPrintln("The property is undefined.");
-            }
-        } catch( Throwable t ) {
-            if( debug ) {
-                debugPrintln("failed to look up system property '"+propertyName+"'" );
-                t.printStackTrace();
-            }
-        }
-        
-        String javah = SecuritySupport.getSystemProperty( "java.home" );
-        String configFile = javah + File.separator +
-        "lib" + File.separator + "jaxp.properties";
-
-        String factoryClassName = null ;
-
-        // try to read from $java.home/lib/jaxp.properties
-        try {
-            if(firstTime){
-                synchronized(cacheProps){
-                    if(firstTime){
-                        File f=new File( configFile );
-                        firstTime = false;
-                        if(SecuritySupport.doesFileExist(f)){
-                            if (debug) debugPrintln("Read properties file " + f);                                
-                            cacheProps.load(SecuritySupport.getFileInputStream(f));
-                        }
-                    }
-                }
-            }
-            factoryClassName = cacheProps.getProperty(propertyName);            
-            if (debug) debugPrintln("found " + factoryClassName + " in $java.home/jaxp.properties"); 
-
-            if (factoryClassName != null) {
-                sf = createInstance(factoryClassName);
-                if(sf != null){
-                    return sf;
-                }
-            }
-        } catch (Exception ex) {
-            if (debug) {
-                ex.printStackTrace();
-            } 
-        }
-                    
-        // try META-INF/services files
-        Iterator sitr = createServiceFileIterator();
-        while(sitr.hasNext()) {
-            URL resource = (URL)sitr.next();
-            if (debug) debugPrintln("looking into " + resource);
-            try {
-                sf = loadFromServicesFile(uri, resource.toExternalForm(), SecuritySupport.getURLInputStream(resource));
-                if(sf!=null)    return sf;
-            } catch(IOException e) {
-                if( debug ) {
-                    debugPrintln("failed to read "+resource);
-                    e.printStackTrace();
-                }
-            }
-        }
-        
-        // platform default
-        if(uri.equals(XPathFactory.DEFAULT_OBJECT_MODEL_URI)) {
-            if (debug) debugPrintln("attempting to use the platform default W3C DOM XPath lib");
-            return createInstance("org.apache.xpath.jaxp.XPathFactoryImpl");
-        }
-        
-        if (debug) debugPrintln("all things were tried, but none was found. bailing out.");
-        return null;
-    }
-    
-    /**
-     * <p>Creates an instance of the specified and returns it.</p>
-     * 
-     * @param className
-     *      fully qualified class name to be instanciated.
-     * 
-     * @return null
-     *      if it fails. Error messages will be printed by this method. 
-     */
-    private XPathFactory createInstance( String className ) {
-        try {
-            if (debug) debugPrintln("instanciating "+className);
-            Class clazz;
-            if( classLoader!=null )
-                clazz = classLoader.loadClass(className);
-            else
-                clazz = Class.forName(className);
-            if(debug)       debugPrintln("loaded it from "+which(clazz));
-            Object o = clazz.newInstance();
-            
-            if( o instanceof XPathFactory )
-                return (XPathFactory)o;
-            
-            if (debug) debugPrintln(className+" is not assignable to "+SERVICE_CLASS.getName());
-        } catch( Throwable t ) {
-            if (debug) {
-                debugPrintln("failed to instanciate "+className);
-                t.printStackTrace();
-            }
-        }
-        return null;
-    }
-    
-    /** Iterator that lazily computes one value and returns it. */
-    private static abstract class SingleIterator implements Iterator {
-        private boolean seen = false;
-        
-        public final void remove() { throw new UnsupportedOperationException(); }
-        public final boolean hasNext() { return !seen; }
-        public final Object next() {
-            if(seen)    throw new NoSuchElementException();
-            seen = true;
-            return value();
-        }
-        
-        protected abstract Object value();
-    }
-    
-    /** Searches for a XPathFactory for a given uri in a META-INF/services file. */
-    private XPathFactory loadFromServicesFile(String uri, String resourceName, InputStream in) {
-
-        if (debug) debugPrintln("Reading " + resourceName );
-        
-        BufferedReader rd;
-        try {
-            rd = new BufferedReader(new InputStreamReader(in, "UTF-8"), DEFAULT_LINE_LENGTH);
-        } catch (java.io.UnsupportedEncodingException e) {
-            rd = new BufferedReader(new InputStreamReader(in), DEFAULT_LINE_LENGTH);
-        }
-        
-        String factoryClassName = null;
-        XPathFactory resultFactory = null;
-        // See spec for provider-configuration files: http://java.sun.com/j2se/1.5.0/docs/guide/jar/jar.html#Provider%20Configuration%20File
-        while (true) {
-            try {
-                factoryClassName = rd.readLine();   
-            } catch (IOException x) {
-                // No provider found
-                break;
-            }
-            if (factoryClassName != null) {
-                // Ignore comments in the provider-configuration file
-                int hashIndex = factoryClassName.indexOf('#');
-                if (hashIndex != -1) {
-                    factoryClassName = factoryClassName.substring(0, hashIndex);
-                }
-                
-                // Ignore leading and trailing whitespace
-                factoryClassName = factoryClassName.trim();
-                
-                // If there's no text left or if this was a blank line, go to the next one.
-                if (factoryClassName.length() == 0) {
-                    continue;
-                }
-                
-                try {
-                    // Found the right XPathFactory if its isObjectModelSupported(String uri) method returns true.
-                    XPathFactory foundFactory = (XPathFactory) createInstance(factoryClassName);
-                    if (foundFactory.isObjectModelSupported(uri)) {
-                        resultFactory = foundFactory;
-                        break;
-                    }
-                }
-                catch (Exception e) {}
-            }
-            else {
-                break;
-            }
-        }
-        
-        try {
-            // try to close the reader.
-            rd.close();
-        }
-        // Ignore the exception.
-        catch (IOException exc) {}
-        
-        return resultFactory;
-    }
-        
-    /**
-     * Returns an {@link Iterator} that enumerates all 
-     * the META-INF/services files that we care.
-     */
-    private Iterator createServiceFileIterator() {
-        if (classLoader == null) {
-            return new SingleIterator() {
-                protected Object value() {
-                    ClassLoader classLoader = XPathFactoryFinder.class.getClassLoader();
-                    return SecuritySupport.getResourceAsURL(classLoader, SERVICE_ID);
-                    //return (ClassLoader.getSystemResource( SERVICE_ID ));
-                }
-            };
-        } else {
-            try {
-                //final Enumeration e = classLoader.getResources(SERVICE_ID);
-                final Enumeration e = SecuritySupport.getResources(classLoader, SERVICE_ID);
-                if (debug && !e.hasMoreElements()) {
-                    debugPrintln("no "+SERVICE_ID+" file was found");
-                }
-                
-                // wrap it into an Iterator.
-                return new Iterator() {
-                    public void remove() {
-                        throw new UnsupportedOperationException();
-                    }
-
-                    public boolean hasNext() {
-                        return e.hasMoreElements();
-                    }
-
-                    public Object next() {
-                        return e.nextElement();
-                    }
-                };
-            } catch (IOException e) {
-                if (debug) {
-                    debugPrintln("failed to enumerate resources "+SERVICE_ID);
-                    e.printStackTrace();
-                }
-                return new ArrayList().iterator();  // empty iterator
-            }
-        }
-    }
-    
-    private static final Class SERVICE_CLASS = XPathFactory.class;
-    private static final String SERVICE_ID = "META-INF/services/" + SERVICE_CLASS.getName();
-    
-    
-    
-    private static String which( Class clazz ) {
-        return which( clazz.getName(), clazz.getClassLoader() );
-    }
-
-    /**
-     * <p>Search the specified classloader for the given classname.</p>
-     *
-     * @param classname the fully qualified name of the class to search for
-     * @param loader the classloader to search
-     * 
-     * @return the source location of the resource, or null if it wasn't found
-     */
-    private static String which(String classname, ClassLoader loader) {
-
-        String classnameAsResource = classname.replace('.', '/') + ".class";
-        
-        if( loader==null )  loader = ClassLoader.getSystemClassLoader();
-        
-        //URL it = loader.getResource(classnameAsResource);
-        URL it = SecuritySupport.getResourceAsURL(loader, classnameAsResource);
-        if (it != null) {
-            return it.toString();
-        } else {
-            return null;
-        }
-    }
-}
diff --git a/trunk/jaxp-api-1.3/src/main/java/org/w3c/dom/html/HTMLDOMImplementation.java b/trunk/jaxp-api-1.3/src/main/java/org/w3c/dom/html/HTMLDOMImplementation.java
deleted file mode 100644
index 9828407..0000000
--- a/trunk/jaxp-api-1.3/src/main/java/org/w3c/dom/html/HTMLDOMImplementation.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 2000 World Wide Web Consortium,
- * (Massachusetts Institute of Technology, Institut National de
- * Recherche en Informatique et en Automatique, Keio University). All
- * Rights Reserved. This program is distributed under the W3C's Software
- * Intellectual Property License. This program is distributed in the
- * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more
- * details.
- */
-
-package org.w3c.dom.html;
-
-import org.w3c.dom.DOMImplementation;
-
-/**
- *  The <code>HTMLDOMImplementation</code> interface extends the 
- * <code>DOMImplementation</code> interface with a method for creating an 
- * HTML document instance.
- * <p>See also the <a href='http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510'>Document Object Model (DOM) Level 2 Specification</a>.
- * @since DOM Level 2
- */
-public interface HTMLDOMImplementation extends DOMImplementation {
-    /**
-     *  Creates an <code>HTMLDocument</code> object with the minimal tree made 
-     * of the following elements: <code>HTML</code> , <code>HEAD</code> , 
-     * <code>TITLE</code> , and <code>BODY</code> .
-     * @param title  The title of the document to be set as the content of the 
-     *   <code>TITLE</code> element, through a child <code>Text</code> node.
-     * @return  A new <code>HTMLDocument</code> object.
-     */
-    public HTMLDocument createHTMLDocument(String title);
-
-}
-
diff --git a/trunk/jaxp-api-1.3/src/main/java/org/xml/sax/helpers/SecuritySupport.java b/trunk/jaxp-api-1.3/src/main/java/org/xml/sax/helpers/SecuritySupport.java
deleted file mode 100644
index 38767de..0000000
--- a/trunk/jaxp-api-1.3/src/main/java/org/xml/sax/helpers/SecuritySupport.java
+++ /dev/null
@@ -1,93 +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.xml.sax.helpers;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.InputStream;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-
-/**
- * This class is duplicated for each JAXP subpackage so keep it in sync.
- * It is package private and therefore is not exposed as part of the JAXP
- * API.
- *
- * Security related methods that only work on J2SE 1.2 and newer.
- */
-final class SecuritySupport {
-    
-    private SecuritySupport() {}
-
-    static ClassLoader getContextClassLoader() {
-	return (ClassLoader)
-		AccessController.doPrivileged(new PrivilegedAction() {
-	    public Object run() {
-		ClassLoader cl = null;
-		try {
-		    cl = Thread.currentThread().getContextClassLoader();
-		} catch (SecurityException ex) { }
-		return cl;
-	    }
-	});
-    }
-
-    static String getSystemProperty(final String propName) {
-	return (String)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    return System.getProperty(propName);
-                }
-            });
-    }
-
-    static FileInputStream getFileInputStream(final File file)
-        throws FileNotFoundException
-    {
-	try {
-            return (FileInputStream)
-                AccessController.doPrivileged(new PrivilegedExceptionAction() {
-                    public Object run() throws FileNotFoundException {
-                        return new FileInputStream(file);
-                    }
-                });
-	} catch (PrivilegedActionException e) {
-	    throw (FileNotFoundException)e.getException();
-	}
-    }
-
-    static InputStream getResourceAsStream(final ClassLoader cl,
-                                           final String name)
-    {
-        return (InputStream)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    InputStream ris;
-                    if (cl == null) {
-                        ris = ClassLoader.getSystemResourceAsStream(name);
-                    } else {
-                        ris = cl.getResourceAsStream(name);
-                    }
-                    return ris;
-                }
-            });
-    }
-}
diff --git a/trunk/jaxp-api-1.3/src/main/java/org/xml/sax/helpers/XMLReaderFactory.java b/trunk/jaxp-api-1.3/src/main/java/org/xml/sax/helpers/XMLReaderFactory.java
deleted file mode 100644
index a6e5947..0000000
--- a/trunk/jaxp-api-1.3/src/main/java/org/xml/sax/helpers/XMLReaderFactory.java
+++ /dev/null
@@ -1,264 +0,0 @@
-// XMLReaderFactory.java - factory for creating a new reader.
-// http://www.saxproject.org
-// Written by David Megginson
-// and by David Brownell
-// NO WARRANTY!  This class is in the Public Domain.
-// $Id: XMLReaderFactory.java 670295 2008-06-22 01:46:43Z mrglavas $
-
-package org.xml.sax.helpers;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import org.xml.sax.XMLReader;
-import org.xml.sax.SAXException;
-
-
-/**
- * Factory for creating an XML reader.
- *
- * <blockquote>
- * <em>This module, both source code and documentation, is in the
- * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
- * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
- * for further information.
- * </blockquote>
- *
- * <p>This class contains static methods for creating an XML reader
- * from an explicit class name, or based on runtime defaults:</p>
- *
- * <pre>
- * try {
- *   XMLReader myReader = XMLReaderFactory.createXMLReader();
- * } catch (SAXException e) {
- *   System.err.println(e.getMessage());
- * }
- * </pre>
- *
- * <p><strong>Note to Distributions bundled with parsers:</strong>
- * You should modify the implementation of the no-arguments
- * <em>createXMLReader</em> to handle cases where the external
- * configuration mechanisms aren't set up.  That method should do its
- * best to return a parser when one is in the class path, even when
- * nothing bound its class name to <code>org.xml.sax.driver</code> so
- * those configuration mechanisms would see it.</p>
- *
- * @since SAX 2.0
- * @author David Megginson, David Brownell
- * @version 2.0.1 (sax2r2)
- */
-final public class XMLReaderFactory
-{
-    /**
-     * Private constructor.
-     *
-     * <p>This constructor prevents the class from being instantiated.</p>
-     */
-    private XMLReaderFactory ()
-    {
-    }
-    
-    private static final String property = "org.xml.sax.driver";
-    
-    /**
-     * Default columns per line.
-     */
-    private static final int DEFAULT_LINE_LENGTH = 80;
-    
-    /**
-     * Attempt to create an XMLReader from system defaults.
-     * In environments which can support it, the name of the XMLReader
-     * class is determined by trying each these options in order, and
-     * using the first one which succeeds:</p> <ul>
-     *
-     * <li>If the system property <code>org.xml.sax.driver</code>
-     * has a value, that is used as an XMLReader class name. </li>
-     *
-     * <li>The JAR "Services API" is used to look for a class name
-     * in the <em>META-INF/services/org.xml.sax.driver</em> file in
-     * jarfiles available to the runtime.</li>
-     *
-     * <li> SAX parser distributions are strongly encouraged to provide
-     * a default XMLReader class name that will take effect only when
-     * previous options (on this list) are not successful.</li>
-     *
-     * <li>Finally, if {@link ParserFactory#makeParser()} can
-     * return a system default SAX1 parser, that parser is wrapped in
-     * a {@link ParserAdapter}.  (This is a migration aid for SAX1
-     * environments, where the <code>org.xml.sax.parser</code> system
-     * property will often be usable.) </li>
-     *
-     * </ul>
-     *
-     * <p> In environments such as small embedded systems, which can not
-     * support that flexibility, other mechanisms to determine the default
-     * may be used. </p>
-     *
-     * <p>Note that many Java environments allow system properties to be
-     * initialized on a command line.  This means that <em>in most cases</em>
-     * setting a good value for that property ensures that calls to this
-     * method will succeed, except when security policies intervene.
-     * This will also maximize application portability to older SAX
-     * environments, with less robust implementations of this method.
-     * </p>
-     *
-     * @return A new XMLReader.
-     * @exception org.xml.sax.SAXException If no default XMLReader class
-     *            can be identified and instantiated.
-     * @see #createXMLReader(java.lang.String)
-     */
-    public static XMLReader createXMLReader ()
-    throws SAXException
-    {
-        String		className = null;
-        ClassLoader	loader = NewInstance.getClassLoader ();
-        
-        // 1. try the JVM-instance-wide system property
-        try { className = SecuritySupport.getSystemProperty (property); }
-        catch (Exception e) { /* normally fails for applets */ }
-        
-        // 2. if that fails, try META-INF/services/
-        if (className == null || className.length() == 0) {
-            String      service = "META-INF/services/" + property;
-            
-	        try {
-	            // If we are deployed into an OSGi environment, leverage it
-	            Class<? extends XMLReader> spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(XMLReader.class, property);
-	            if (spiClass != null) {
-	                return spiClass.newInstance();
-	            }
-	        } catch (Throwable e) {
-	        }
-
-            InputStream is = null;
-            className = null;
-            
-            // First try the Context ClassLoader
-            ClassLoader cl = SecuritySupport.getContextClassLoader();
-            if (cl != null) {
-                is = SecuritySupport.getResourceAsStream(cl, service);
-                
-                // If no provider found then try the current ClassLoader
-                if (is == null) {
-                    cl = XMLReaderFactory.class.getClassLoader();
-                    is = SecuritySupport.getResourceAsStream(cl, service);
-                }
-            } else {
-                // No Context ClassLoader or JDK 1.1 so try the current
-                // ClassLoader
-                cl = XMLReaderFactory.class.getClassLoader();
-                is = SecuritySupport.getResourceAsStream(cl, service);
-            }
-            
-            if (is != null) {
-                
-                // Read the service provider name in UTF-8 as specified in
-                // the jar spec.  Unfortunately this fails in Microsoft
-                // VJ++, which does not implement the UTF-8
-                // encoding. Theoretically, we should simply let it fail in
-                // that case, since the JVM is obviously broken if it
-                // doesn't support such a basic standard.  But since there
-                // are still some users attempting to use VJ++ for
-                // development, we have dropped in a fallback which makes a
-                // second attempt using the platform's default encoding. In
-                // VJ++ this is apparently ASCII, which is a subset of
-                // UTF-8... and since the strings we'll be reading here are
-                // also primarily limited to the 7-bit ASCII range (at
-                // least, in English versions), this should work well
-                // enough to keep us on the air until we're ready to
-                // officially decommit from VJ++. [Edited comment from
-                // jkesselm]
-                BufferedReader rd;
-                try {
-                    rd = new BufferedReader(new InputStreamReader(is, "UTF-8"), DEFAULT_LINE_LENGTH);
-                } catch (java.io.UnsupportedEncodingException e) {
-                    rd = new BufferedReader(new InputStreamReader(is), DEFAULT_LINE_LENGTH);
-                }
-                
-                try {
-                    // XXX Does not handle all possible input as specified by the
-                    // Jar Service Provider specification
-                    className = rd.readLine();
-                } 
-                catch (Exception x) {
-                    // No provider found
-                } 
-                finally {
-                    try { 
-                        // try to close the reader. 
-                        rd.close(); 
-                    } 
-                    // Ignore the exception. 
-                    catch (IOException exc) {}
-                }
-            }
-        }
-        
-        // 3. Distro-specific fallback
-        if (className == null) {
-            // BEGIN DISTRIBUTION-SPECIFIC
-            
-            // EXAMPLE:
-            // className = "com.example.sax.XmlReader";
-            // or a $JAVA_HOME/jre/lib/*properties setting...
-            className = "org.apache.xerces.parsers.SAXParser";
-            
-            // END DISTRIBUTION-SPECIFIC
-        }
-        
-        // do we know the XMLReader implementation class yet?
-        if (className != null)
-            return loadClass (loader, className);
-        
-        // 4. panic -- adapt any SAX1 parser
-        try {
-            return new ParserAdapter (ParserFactory.makeParser ());
-        } catch (Exception e) {
-            throw new SAXException ("Can't create default XMLReader; "
-                    + "is system property org.xml.sax.driver set?");
-        }
-    }
-    
-    
-    /**
-     * Attempt to create an XML reader from a class name.
-     *
-     * <p>Given a class name, this method attempts to load
-     * and instantiate the class as an XML reader.</p>
-     *
-     * <p>Note that this method will not be usable in environments where
-     * the caller (perhaps an applet) is not permitted to load classes
-     * dynamically.</p>
-     *
-     * @return A new XML reader.
-     * @exception org.xml.sax.SAXException If the class cannot be
-     *            loaded, instantiated, and cast to XMLReader.
-     * @see #createXMLReader()
-     */
-    public static XMLReader createXMLReader (String className)
-    throws SAXException
-    {
-        return loadClass (NewInstance.getClassLoader (), className);
-    }
-    
-    private static XMLReader loadClass (ClassLoader loader, String className)
-    throws SAXException
-    {
-        try {
-            return (XMLReader) NewInstance.newInstance (loader, className);
-        } catch (ClassNotFoundException e1) {
-            throw new SAXException("SAX2 driver class " + className +
-                    " not found", e1);
-        } catch (IllegalAccessException e2) {
-            throw new SAXException("SAX2 driver class " + className +
-                    " found but cannot be loaded", e2);
-        } catch (InstantiationException e3) {
-            throw new SAXException("SAX2 driver class " + className +
-                    " loaded but cannot be instantiated (no empty public constructor?)",
-                    e3);
-        } catch (ClassCastException e4) {
-            throw new SAXException("SAX2 driver class " + className +
-                    " does not implement XMLReader", e4);
-        }
-    }
-}
diff --git a/trunk/jaxp-api-1.4/pom.xml b/trunk/jaxp-api-1.4/pom.xml
deleted file mode 100644
index eef582e..0000000
--- a/trunk/jaxp-api-1.4/pom.xml
+++ /dev/null
@@ -1,197 +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.specs</groupId>
-        <artifactId>specs</artifactId>
-        <version>2.1.0</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.specs</groupId>
-    <artifactId>org.apache.servicemix.specs.jaxp-api-1.4</artifactId>
-    <packaging>bundle</packaging>
-    <version>2.1.0</version>
-    <name>Apache ServiceMix :: Specs :: JAXP API 1.4</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.stax-api-1.2</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>xml-apis</groupId>
-            <artifactId>xml-apis</artifactId>
-            <version>1.4.01</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-              <groupId>org.apache.maven.plugins</groupId>
-              <artifactId>maven-compiler-plugin</artifactId>
-              <inherited>true</inherited>
-              <configuration>
-                <compilerArgument>-Xbootclasspath/p:${settings.localRepository}/xml-apis/xml-apis/1.4.01/xml-apis-1.4.01.jar</compilerArgument>
-              </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Description>${project.description}</Bundle-Description>
-                        <Export-Package>
-                            javax.xml.stream*;version=1.2;-split-package:=merge-first;-noimport:=true,
-                            javax.xml*;version=1.4;-split-package:=merge-first;-noimport:=true,
-                            org.w3c.dom*;version=1.0;-split-package:=merge-first;-noimport:=true,
-                            org.xml.sax*;version=2.0.2;-split-package:=merge-first;-noimport:=true,
-                        </Export-Package>
-                        <Import-Package>
-                            *
-                        </Import-Package>
-                        <Private-Package>org.apache.servicemix.specs.locator;-split-package:=merge-first</Private-Package>
-                        <Bundle-Activator>org.apache.servicemix.specs.locator.Activator</Bundle-Activator>
-                        <Implementation-Title>Apache ServiceMix</Implementation-Title>
-                        <Implementation-Version>${project.version}</Implementation-Version>
-                    </instructions>
-                    <unpackBundle>true</unpackBundle>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <artifactSet>
-                                <includes>
-                                    <include>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</include>
-                                    <include>xml-apis:xml-apis</include>
-                                </includes>
-                            </artifactSet>
-                            <filters>
-                                <filter>
-                                    <artifact>${project.groupId}:${project.artifactId}</artifact>
-                                    <excludes>
-                                        <exclude>org/apache/servicemix/**</exclude>
-                                    </excludes>
-                                </filter>
-                                <filter>
-                                    <artifact>xml-apis:xml-apis</artifact>
-                                    <excludes>
-                                        <exclude>javax/**</exclude>
-                                        <exclude>org/**</exclude>
-                                    </excludes>
-                                </filter>
-                            </filters>
-                            <createSourcesJar>${createSourcesJar}</createSourcesJar>
-                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-                            <createDependencyReducedPom>true</createDependencyReducedPom>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>deploy</id>
-            <properties>
-                <createSourcesJar>true</createSourcesJar>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-source-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>attach-sources</id>
-                                <phase>process-classes</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-dependency-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>unpack-sources</id>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>unpack</goal>
-                                </goals>
-                                <configuration>
-                                    <artifactItems>
-                                        <artifactItem>
-                                            <groupId>org.apache.servicemix.specs</groupId>
-                                            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                    </artifactItems>
-                                    <outputDirectory>${project.build.directory}/sources</outputDirectory>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>package</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <minmemory>128m</minmemory>
-                            <maxmemory>512m</maxmemory>
-                            <sourcepath>${project.build.directory}/sources</sourcepath>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
diff --git a/trunk/jaxp-api-1.4/src/main/java/javax/xml/datatype/DatatypeFactory.java b/trunk/jaxp-api-1.4/src/main/java/javax/xml/datatype/DatatypeFactory.java
deleted file mode 100644
index a566901..0000000
--- a/trunk/jaxp-api-1.4/src/main/java/javax/xml/datatype/DatatypeFactory.java
+++ /dev/null
@@ -1,1016 +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.
- */
-
-//$Id: DatatypeFactory.java 884950 2009-11-27 18:46:18Z mrglavas $
-
-package javax.xml.datatype;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.GregorianCalendar;
-
-/**
- * <p>Factory that creates new <code>javax.xml.datatype</code> <code>Object</code>s that map XML to/from Java <code>Object</code>s.</p>
- * 
- * <p id="DatatypeFactory.newInstance">{@link #newInstance()} is used to create a new <code>DatatypeFactory</code>.
- * The following implementation resolution mechanisms are used in the following order:</p>
- * <ol>
- *    <li>
- *      If the system property specified by {@link #DATATYPEFACTORY_PROPERTY}, "<code>javax.xml.datatype.DatatypeFactory</code>",
- *      exists, a class with the name of the property's value is instantiated.
- *      Any Exception thrown during the instantiation process is wrapped as a {@link javax.xml.datatype.DatatypeConfigurationException}.
- *    </li>
- *    <li>
- *      If the file ${JAVA_HOME}/lib/jaxp.properties exists, it is loaded in a {@link java.util.Properties} <code>Object</code>.
- *      The <code>Properties</code> <code>Object </code> is then queried for the property as documented in the prior step
- *      and processed as documented in the prior step.
- *    </li>
- *    <li>
- *      The services resolution mechanism is used, e.g. <code>META-INF/services/java.xml.datatype.DatatypeFactory</code>.
- *      Any Exception thrown during the instantiation process is wrapped as a {@link javax.xml.datatype.DatatypeConfigurationException}.
- *    </li>
- *    <li>
- *      The final mechanism is to attempt to instantiate the <code>Class</code> specified by
- *      {@link #DATATYPEFACTORY_IMPLEMENTATION_CLASS}, "<code>javax.xml.datatype.DatatypeFactoryImpl</code>".
- *      Any Exception thrown during the instantiation process is wrapped as a {@link javax.xml.datatype.DatatypeConfigurationException}.
- *    </li>
- * </ol>
- *
- * @author <a href="mailto:Joseph.Fialli@Sun.COM">Joseph Fialli</a>
- * @author <a href="mailto:Jeff.Suttor@Sun.com">Jeff Suttor</a>
- * @version $Revision: 884950 $, $Date: 2009-11-27 13:46:18 -0500 (Fri, 27 Nov 2009) $
- * @since 1.5
- */
-public abstract class DatatypeFactory {
-
-    /**
-     * <p>Default property name as defined in JSR 206: Java(TM) API for XML Processing (JAXP) 1.3.</p>
-     *
-     * <p>Default value is <code>javax.xml.datatype.DatatypeFactory</code>.</p>
-     */
-    public static final String DATATYPEFACTORY_PROPERTY = "javax.xml.datatype.DatatypeFactory";
-
-    /**
-     * <p>Default implementation class name as defined in JSR 206: Java(TM) API for XML Processing (JAXP) 1.3.</p>
-     *
-     * <p>Default value is <code>org.apache.xerces.jaxp.datatype.DatatypeFactoryImpl</code>.</p>
-     */
-    public static final String DATATYPEFACTORY_IMPLEMENTATION_CLASS = new String("com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl");
-
-    /**
-     * <p>Protected constructor to prevent instantiation outside of package.</p>
-     *
-     * <p>Use {@link #newInstance()} to create a <code>DatatypeFactory</code>.</p>
-     */
-    protected DatatypeFactory() {}
-
-    /**
-     * <p>Obtain a new instance of a <code>DatatypeFactory</code>.</p>
-     *
-     * <p>The implementation resolution mechanisms are <a href="#DatatypeFactory.newInstance">defined</a> in this
-     * <code>Class</code>'s documentation.</p>
-     *
-     * @return New instance of a <code>DocumentBuilderFactory</code>
-     *
-     * @throws javax.xml.datatype.DatatypeConfigurationException If the implementation is not
-     *   available or cannot be instantiated.
-     */
-    public static DatatypeFactory newInstance()
-        throws DatatypeConfigurationException {
-        try {
-            return (DatatypeFactory) FactoryFinder.find(
-                    /* The default property name according to the JAXP spec */
-                    DATATYPEFACTORY_PROPERTY,
-                    /* The fallback implementation class name */
-                    DATATYPEFACTORY_IMPLEMENTATION_CLASS);
-        }
-        catch (FactoryFinder.ConfigurationError e) {
-            throw new DatatypeConfigurationException(e.getMessage(), e.getException());
-        }
-    }
-
-    /**
-     * @return New instance of a <code>DocumentBuilderFactory</code>
-     *
-     * @throws javax.xml.datatype.DatatypeConfigurationException If the implementation is not
-     *   available or cannot be instantiated.
-     */
-    public static DatatypeFactory newInstance(String factoryClassName,
-            ClassLoader classLoader) throws DatatypeConfigurationException {
-        if (factoryClassName == null) {
-            throw new DatatypeConfigurationException("factoryClassName cannot be null.");
-        }
-        if (classLoader == null) {
-            classLoader = SecuritySupport.getContextClassLoader();
-        }
-        try {
-            return (DatatypeFactory) FactoryFinder.newInstance(factoryClassName, classLoader);
-        }
-        catch (FactoryFinder.ConfigurationError e) {
-            throw new DatatypeConfigurationException(e.getMessage(), e.getException());
-        }
-    }
-
-    /**
-     * <p>Obtain a new instance of a <code>Duration</code>
-     * specifying the <code>Duration</code> as its string representation, "PnYnMnDTnHnMnS",
-     * as defined in XML Schema 1.0 section 3.2.6.1.</p>
-     *
-     * <p>XML Schema Part 2: Datatypes, 3.2.6 duration, defines <code>duration</code> as:</p>
-     * <blockquote>
-     * duration represents a duration of time.
-     * The value space of duration is a six-dimensional space where the coordinates designate the
-     * Gregorian year, month, day, hour, minute, and second components defined in Section 5.5.3.2 of [ISO 8601], respectively.
-     * These components are ordered in their significance by their order of appearance i.e. as
-     * year, month, day, hour, minute, and second.
-     * </blockquote>
-     * <p>All six values are set and available from the created {@link javax.xml.datatype.Duration}</p>
-     *
-     * <p>The XML Schema specification states that values can be of an arbitrary size.
-     * Implementations may chose not to or be incapable of supporting arbitrarily large and/or small values.
-     * An {@link UnsupportedOperationException} will be thrown with a message indicating implementation limits
-     * if implementation capacities are exceeded.</p>
-     *
-     * @param lexicalRepresentation <code>String</code> representation of a <code>Duration</code>.
-     *
-     * @return New <code>Duration</code> created from parsing the <code>lexicalRepresentation</code>.
-     *
-     * @throws IllegalArgumentException If <code>lexicalRepresentation</code> is not a valid representation of a <code>Duration</code>.
-     * @throws UnsupportedOperationException If implementation cannot support requested values.
-     * @throws NullPointerException if <code>lexicalRepresentation</code> is <code>null</code>.
-     */
-    public abstract Duration newDuration(final String lexicalRepresentation);
-
-    /**
-     * <p>Obtain a new instance of a <code>Duration</code>
-     * specifying the <code>Duration</code> as milliseconds.</p>
-     *
-     * <p>XML Schema Part 2: Datatypes, 3.2.6 duration, defines <code>duration</code> as:</p>
-     * <blockquote>
-     * duration represents a duration of time.
-     * The value space of duration is a six-dimensional space where the coordinates designate the
-     * Gregorian year, month, day, hour, minute, and second components defined in Section 5.5.3.2 of [ISO 8601], respectively.
-     * These components are ordered in their significance by their order of appearance i.e. as
-     * year, month, day, hour, minute, and second.
-     * </blockquote>
-     * <p>All six values are set by computing their values from the specified milliseconds
-     * and are available using the <code>get</code> methods of  the created {@link javax.xml.datatype.Duration}.
-     * The values conform to and are defined by:</p>
-     * <ul>
-     *   <li>ISO 8601:2000(E) Section 5.5.3.2 Alternative format</li>
-     *   <li><a href="http://www.w3.org/TR/xmlschema-2/#isoformats">
-     *     W3C XML Schema 1.0 Part 2, Appendix D, ISO 8601 Date and Time Formats</a>
-     *   </li>
-     *   <li>{@link javax.xml.datatype.XMLGregorianCalendar}  Date/Time Datatype Field Mapping Between XML Schema 1.0 and Java Representation</li>
-     * </ul>
-     *
-     * <p>The default start instance is defined by {@link java.util.GregorianCalendar}'s use of the start of the epoch: i.e.,
-     * {@link java.util.Calendar#YEAR} = 1970,
-     * {@link java.util.Calendar#MONTH} = {@link java.util.Calendar#JANUARY},
-     * {@link java.util.Calendar#DATE} = 1, etc.
-     * This is important as there are variations in the Gregorian Calendar,
-     * e.g. leap years have different days in the month = {@link java.util.Calendar#FEBRUARY}
-     * so the result of {@link javax.xml.datatype.Duration#getMonths()} and {@link javax.xml.datatype.Duration#getDays()} can be influenced.</p>
-     *
-     * @param durationInMilliSeconds Duration in milliseconds to create.
-     *
-     * @return New <code>Duration</code> representing <code>durationInMilliSeconds</code>.
-     */
-    public abstract Duration newDuration(final long durationInMilliSeconds);
-
-    /**
-     * <p>Obtain a new instance of a <code>Duration</code>
-     * specifying the <code>Duration</code> as isPositive, years, months, days, hours, minutes, seconds.</p>
-     *
-     * <p>The XML Schema specification states that values can be of an arbitrary size.
-     * Implementations may chose not to or be incapable of supporting arbitrarily large and/or small values.
-     * An {@link UnsupportedOperationException} will be thrown with a message indicating implementation limits
-     * if implementation capacities are exceeded.</p>
-     *
-     * <p>A <code>null</code> value indicates that field is not set.</p>
-     *
-     * @param isPositive Set to <code>false</code> to create a negative duration. When the length
-     *   of the duration is zero, this parameter will be ignored.
-     * @param years of this <code>Duration</code>
-     * @param months of this <code>Duration</code>
-     * @param days of this <code>Duration</code>
-     * @param hours of this <code>Duration</code>
-     * @param minutes of this <code>Duration</code>
-     * @param seconds of this <code>Duration</code>
-     *
-     * @return New <code>Duration</code> created from the specified values.
-     *
-     * @throws IllegalArgumentException If values are not a valid representation of a <code>Duration</code>.
-     * @throws UnsupportedOperationException If implementation cannot support requested values.
-     */
-    public abstract Duration newDuration(
-            final boolean isPositive,
-            final BigInteger years,
-            final BigInteger months,
-            final BigInteger days,
-            final BigInteger hours,
-            final BigInteger minutes,
-            final BigDecimal seconds);
-
-    /**
-     * <p>Obtain a new instance of a <code>Duration</code>
-     * specifying the <code>Duration</code> as isPositive, years, months, days, hours, minutes, seconds.</p>
-     *
-     * <p>A {@link javax.xml.datatype.DatatypeConstants#FIELD_UNDEFINED} value indicates that field is not set.</p>
-     *
-     * @param isPositive Set to <code>false</code> to create a negative duration. When the length
-     *   of the duration is zero, this parameter will be ignored.
-     * @param years of this <code>Duration</code>
-     * @param months of this <code>Duration</code>
-     * @param days of this <code>Duration</code>
-     * @param hours of this <code>Duration</code>
-     * @param minutes of this <code>Duration</code>
-     * @param seconds of this <code>Duration</code>
-     *
-     * @return New <code>Duration</code> created from the specified values.
-     *
-     * @throws IllegalArgumentException If values are not a valid representation of a <code>Duration</code>.
-     *
-     * @see #newDuration(
-     *   boolean isPositive,
-     *   java.math.BigInteger years,
-     *   java.math.BigInteger months,
-     *   java.math.BigInteger days,
-     *   java.math.BigInteger hours,
-     *   java.math.BigInteger minutes,
-     *   java.math.BigDecimal seconds)
-     */
-    public Duration newDuration(
-            final boolean isPositive,
-            final int years,
-            final int months,
-            final int days,
-            final int hours,
-            final int minutes,
-            final int seconds) {
-
-        // years may not be set
-        BigInteger realYears = (years != DatatypeConstants.FIELD_UNDEFINED) ? BigInteger.valueOf((long) years) : null;
-
-        // months may not be set
-        BigInteger realMonths = (months != DatatypeConstants.FIELD_UNDEFINED) ? BigInteger.valueOf((long) months) : null;
-
-        // days may not be set
-        BigInteger realDays = (days != DatatypeConstants.FIELD_UNDEFINED) ? BigInteger.valueOf((long) days) : null;
-
-        // hours may not be set
-        BigInteger realHours = (hours != DatatypeConstants.FIELD_UNDEFINED) ? BigInteger.valueOf((long) hours) : null;
-
-        // minutes may not be set
-        BigInteger realMinutes = (minutes != DatatypeConstants.FIELD_UNDEFINED) ? BigInteger.valueOf((long) minutes) : null;
-
-        // seconds may not be set
-        BigDecimal realSeconds = (seconds != DatatypeConstants.FIELD_UNDEFINED) ? BigDecimal.valueOf((long) seconds) : null;
-
-        return newDuration(
-                isPositive,
-                realYears,
-                realMonths,
-                realDays,
-                realHours,
-                realMinutes,
-                realSeconds
-        );
-    }
-
-    /**
-     * <p>Create a <code>Duration</code> of type <code>xdt:dayTimeDuration</code> by parsing its <code>String</code> representation,
-     * "<em>PnDTnHnMnS</em>", <a href="http://www.w3.org/TR/xpath-datamodel#dt-dayTimeDuration">
-     *   XQuery 1.0 and XPath 2.0 Data Model, xdt:dayTimeDuration</a>.</p>
-     *
-     * <p>The datatype <code>xdt:dayTimeDuration</code> is a subtype of <code>xs:duration</code>
-     * whose lexical representation contains only day, hour, minute, and second components.
-     * This datatype resides in the namespace <code>http://www.w3.org/2003/11/xpath-datatypes</code>.</p>
-     *
-     * <p>All four values are set and available from the created {@link javax.xml.datatype.Duration}</p>
-     *
-     * <p>The XML Schema specification states that values can be of an arbitrary size.
-     * Implementations may chose not to or be incapable of supporting arbitrarily large and/or small values.
-     * An {@link UnsupportedOperationException} will be thrown with a message indicating implementation limits
-     * if implementation capacities are exceeded.</p>
-     *
-     * @param lexicalRepresentation Lexical representation of a duration.
-     *
-     * @return New <code>Duration</code> created using the specified <code>lexicalRepresentation</code>.
-     *
-     * @throws IllegalArgumentException If the given string does not conform to the aforementioned specification.
-     * @throws UnsupportedOperationException If implementation cannot support requested values.
-     * @throws NullPointerException If <code>lexicalRepresentation</code> is <code>null</code>.
-     */
-    public Duration newDurationDayTime(final String lexicalRepresentation) {
-        if (lexicalRepresentation == null) {
-            throw new NullPointerException("The lexical representation cannot be null.");
-        }
-        // The lexical representation must match the pattern [^YM]*(T.*)?
-        int pos = lexicalRepresentation.indexOf('T');
-        int length = (pos >= 0) ? pos : lexicalRepresentation.length();
-        for (int i = 0; i < length; ++i) {
-            char c = lexicalRepresentation.charAt(i);
-            if (c == 'Y' || c == 'M') {
-                throw new IllegalArgumentException("Invalid dayTimeDuration value: " + lexicalRepresentation);
-            }
-        }
-        return newDuration(lexicalRepresentation);
-    }
-
-    /**
-     * <p>Create a <code>Duration</code> of type <code>xdt:dayTimeDuration</code> using the specified milliseconds as defined in
-     * <a href="http://www.w3.org/TR/xpath-datamodel#dt-dayTimeDuration">
-     *   XQuery 1.0 and XPath 2.0 Data Model, xdt:dayTimeDuration</a>.</p>
-     *
-     * <p>The datatype <code>xdt:dayTimeDuration</code> is a subtype of <code>xs:duration</code>
-     * whose lexical representation contains only day, hour, minute, and second components.
-     * This datatype resides in the namespace <code>http://www.w3.org/2003/11/xpath-datatypes</code>.</p>
-     *
-     * <p>All four values are set by computing their values from the specified milliseconds
-     * and are available using the <code>get</code> methods of  the created {@link javax.xml.datatype.Duration}.
-     * The values conform to and are defined by:</p>
-     * <ul>
-     *   <li>ISO 8601:2000(E) Section 5.5.3.2 Alternative format</li>
-     *   <li><a href="http://www.w3.org/TR/xmlschema-2/#isoformats">
-     *     W3C XML Schema 1.0 Part 2, Appendix D, ISO 8601 Date and Time Formats</a>
-     *   </li>
-     *   <li>{@link javax.xml.datatype.XMLGregorianCalendar}  Date/Time Datatype Field Mapping Between XML Schema 1.0 and Java Representation</li>
-     * </ul>
-     *
-     * <p>The default start instance is defined by {@link java.util.GregorianCalendar}'s use of the start of the epoch: i.e.,
-     * {@link java.util.Calendar#YEAR} = 1970,
-     * {@link java.util.Calendar#MONTH} = {@link java.util.Calendar#JANUARY},
-     * {@link java.util.Calendar#DATE} = 1, etc.
-     * This is important as there are variations in the Gregorian Calendar,
-     * e.g. leap years have different days in the month = {@link java.util.Calendar#FEBRUARY}
-     * so the result of {@link javax.xml.datatype.Duration#getDays()} can be influenced.</p>
-     *
-     * <p>Any remaining milliseconds after determining the day, hour, minute and second are discarded.</p>
-     *
-     * @param durationInMilliseconds Milliseconds of <code>Duration</code> to create.
-     *
-     * @return New <code>Duration</code> created with the specified <code>durationInMilliseconds</code>.
-     *
-     * @see <a href="http://www.w3.org/TR/xpath-datamodel#dt-dayTimeDuration">
-     *   XQuery 1.0 and XPath 2.0 Data Model, xdt:dayTimeDuration</a>
-     */
-    public Duration newDurationDayTime(final long durationInMilliseconds) {
-        long _durationInMilliseconds = durationInMilliseconds;
-        if (_durationInMilliseconds == 0) {
-            return newDuration(true, DatatypeConstants.FIELD_UNDEFINED,
-                    DatatypeConstants.FIELD_UNDEFINED, 0, 0, 0, 0);
-        }
-        boolean tooLong = false;
-        final boolean isPositive;
-        if (_durationInMilliseconds < 0) {
-            isPositive = false;
-            if (_durationInMilliseconds == Long.MIN_VALUE) {
-                _durationInMilliseconds++;
-                tooLong = true;
-            }
-            _durationInMilliseconds *= -1;
-        }
-        else {
-            isPositive = true;
-        }
-
-        long val = _durationInMilliseconds;
-        int milliseconds = (int) (val % 60000L); // 60000 milliseconds per minute
-        if (tooLong) {
-            ++milliseconds;
-        }
-        if (milliseconds % 1000 == 0) {
-            int seconds = milliseconds / 1000;
-            val = val / 60000L;
-            int minutes = (int) (val % 60L); // 60 minutes per hour
-            val = val / 60L;
-            int hours = (int) (val % 24L); // 24 hours per day
-            long days = val / 24L;
-            if (days <= ((long) Integer.MAX_VALUE)) {
-                return newDuration(isPositive, DatatypeConstants.FIELD_UNDEFINED,
-                        DatatypeConstants.FIELD_UNDEFINED, (int) days, hours, minutes, seconds);
-            }
-            else {
-                return newDuration(isPositive, null, null,
-                        BigInteger.valueOf(days), BigInteger.valueOf(hours),
-                        BigInteger.valueOf(minutes), BigDecimal.valueOf(milliseconds, 3));
-            }
-        }
-
-        BigDecimal seconds = BigDecimal.valueOf(milliseconds, 3);
-        val = val / 60000L;
-        BigInteger minutes = BigInteger.valueOf(val % 60L); // 60 minutes per hour
-        val = val / 60L;
-        BigInteger hours = BigInteger.valueOf(val % 24L); // 24 hours per day
-        val = val / 24L;
-        BigInteger days = BigInteger.valueOf(val);
-        return newDuration(isPositive, null, null, days, hours, minutes, seconds);
-    }
-
-    /**
-     * <p>Create a <code>Duration</code> of type <code>xdt:dayTimeDuration</code> using the specified
-     * <code>day</code>, <code>hour</code>, <code>minute</code> and <code>second</code> as defined in
-     * <a href="http://www.w3.org/TR/xpath-datamodel#dt-dayTimeDuration">
-     *   XQuery 1.0 and XPath 2.0 Data Model, xdt:dayTimeDuration</a>.</p>
-     *
-     * <p>The datatype <code>xdt:dayTimeDuration</code> is a subtype of <code>xs:duration</code>
-     * whose lexical representation contains only day, hour, minute, and second components.
-     * This datatype resides in the namespace <code>http://www.w3.org/2003/11/xpath-datatypes</code>.</p>
-     *
-     * <p>The XML Schema specification states that values can be of an arbitrary size.
-     * Implementations may chose not to or be incapable of supporting arbitrarily large and/or small values.
-     * An {@link UnsupportedOperationException} will be thrown with a message indicating implementation limits
-     * if implementation capacities are exceeded.</p>
-     *
-     * <p>A <code>null</code> value indicates that field is not set.</p>
-     *
-     * @param isPositive Set to <code>false</code> to create a negative duration. When the length
-     *   of the duration is zero, this parameter will be ignored.
-     * @param day Day of <code>Duration</code>.
-     * @param hour Hour of <code>Duration</code>.
-     * @param minute Minute of <code>Duration</code>.
-     * @param second Second of <code>Duration</code>.
-     *
-     * @return New <code>Duration</code> created with the specified <code>day</code>, <code>hour</code>, <code>minute</code>
-     * and <code>second</code>.
-     *
-     * @throws IllegalArgumentException If any values would create an invalid <code>Duration</code>.
-     * @throws UnsupportedOperationException If implementation cannot support requested values.
-     */
-    public Duration newDurationDayTime(
-            final boolean isPositive,
-            final BigInteger day,
-            final BigInteger hour,
-            final BigInteger minute,
-            final BigInteger second) {
-
-        return newDuration(
-                isPositive,
-                null,  // years
-                null, // months
-                day,
-                hour,
-                minute,
-                (second != null)? new BigDecimal(second):null
-        );
-    }
-
-    /**
-     * <p>Create a <code>Duration</code> of type <code>xdt:dayTimeDuration</code> using the specified
-     * <code>day</code>, <code>hour</code>, <code>minute</code> and <code>second</code> as defined in
-     * <a href="http://www.w3.org/TR/xpath-datamodel#dt-dayTimeDuration">
-     *   XQuery 1.0 and XPath 2.0 Data Model, xdt:dayTimeDuration</a>.</p>
-     *
-     * <p>The datatype <code>xdt:dayTimeDuration</code> is a subtype of <code>xs:duration</code>
-     * whose lexical representation contains only day, hour, minute, and second components.
-     * This datatype resides in the namespace <code>http://www.w3.org/2003/11/xpath-datatypes</code>.</p>
-     *
-     * <p>A {@link javax.xml.datatype.DatatypeConstants#FIELD_UNDEFINED} value indicates that field is not set.</p>
-     *
-     * @param isPositive Set to <code>false</code> to create a negative duration. When the length
-     *   of the duration is zero, this parameter will be ignored.
-     * @param day Day of <code>Duration</code>.
-     * @param hour Hour of <code>Duration</code>.
-     * @param minute Minute of <code>Duration</code>.
-     * @param second Second of <code>Duration</code>.
-     *
-     * @return New <code>Duration</code> created with the specified <code>day</code>, <code>hour</code>, <code>minute</code>
-     * and <code>second</code>.
-     *
-     * @throws IllegalArgumentException If any values would create an invalid <code>Duration</code>.
-     */
-    public Duration newDurationDayTime(
-            final boolean isPositive,
-            final int day,
-            final int hour,
-            final int minute,
-            final int second) {
-        return newDuration(isPositive,
-                DatatypeConstants.FIELD_UNDEFINED, DatatypeConstants.FIELD_UNDEFINED,
-                day, hour, minute, second);
-    }
-
-    /**
-     * <p>Create a <code>Duration</code> of type <code>xdt:yearMonthDuration</code> by parsing its <code>String</code> representation,
-     * "<em>PnYnM</em>", <a href="http://www.w3.org/TR/xpath-datamodel#dt-yearMonthDuration">
-     *   XQuery 1.0 and XPath 2.0 Data Model, xdt:yearMonthDuration</a>.</p>
-     *
-     * <p>The datatype <code>xdt:yearMonthDuration</code> is a subtype of <code>xs:duration</code>
-     * whose lexical representation contains only year and month components.
-     * This datatype resides in the namespace {@link javax.xml.XMLConstants#W3C_XPATH_DATATYPE_NS_URI}.</p>
-     *
-     * <p>Both values are set and available from the created {@link javax.xml.datatype.Duration}</p>
-     *
-     * <p>The XML Schema specification states that values can be of an arbitrary size.
-     * Implementations may chose not to or be incapable of supporting arbitrarily large and/or small values.
-     * An {@link UnsupportedOperationException} will be thrown with a message indicating implementation limits
-     * if implementation capacities are exceeded.</p>
-     *
-     * @param lexicalRepresentation Lexical representation of a duration.
-     *
-     * @return New <code>Duration</code> created using the specified <code>lexicalRepresentation</code>.
-     *
-     * @throws IllegalArgumentException If the <code>lexicalRepresentation</code> does not conform to the specification.
-     * @throws UnsupportedOperationException If implementation cannot support requested values.
-     * @throws NullPointerException If <code>lexicalRepresentation</code> is <code>null</code>.
-     */
-    public Duration newDurationYearMonth(final String lexicalRepresentation) {
-        if (lexicalRepresentation == null) {
-            throw new NullPointerException("The lexical representation cannot be null.");
-        }
-        // The lexical representation must match the pattern [^DT]*.
-        int length = lexicalRepresentation.length();
-        for (int i = 0; i < length; ++i) {
-            char c = lexicalRepresentation.charAt(i);
-            if (c == 'D' || c == 'T') {
-                throw new IllegalArgumentException("Invalid yearMonthDuration value: " + lexicalRepresentation);
-            }
-        }
-        return newDuration(lexicalRepresentation);
-    }
-
-    /**
-     * <p>Create a <code>Duration</code> of type <code>xdt:yearMonthDuration</code> using the specified milliseconds as defined in
-     * <a href="http://www.w3.org/TR/xpath-datamodel#dt-yearMonthDuration">
-     *   XQuery 1.0 and XPath 2.0 Data Model, xdt:yearMonthDuration</a>.</p>
-     *
-     * <p>The datatype <code>xdt:yearMonthDuration</code> is a subtype of <code>xs:duration</code>
-     * whose lexical representation contains only year and month components.
-     * This datatype resides in the namespace {@link javax.xml.XMLConstants#W3C_XPATH_DATATYPE_NS_URI}.</p>
-     *
-     * <p>Both values are set by computing their values from the specified milliseconds
-     * and are available using the <code>get</code> methods of  the created {@link javax.xml.datatype.Duration}.
-     * The values conform to and are defined by:</p>
-     * <ul>
-     *   <li>ISO 8601:2000(E) Section 5.5.3.2 Alternative format</li>
-     *   <li><a href="http://www.w3.org/TR/xmlschema-2/#isoformats">
-     *     W3C XML Schema 1.0 Part 2, Appendix D, ISO 8601 Date and Time Formats</a>
-     *   </li>
-     *   <li>{@link javax.xml.datatype.XMLGregorianCalendar}  Date/Time Datatype Field Mapping Between XML Schema 1.0 and Java Representation</li>
-     * </ul>
-     *
-     * <p>The default start instance is defined by {@link java.util.GregorianCalendar}'s use of the start of the epoch: i.e.,
-     * {@link java.util.Calendar#YEAR} = 1970,
-     * {@link java.util.Calendar#MONTH} = {@link java.util.Calendar#JANUARY},
-     * {@link java.util.Calendar#DATE} = 1, etc.
-     * This is important as there are variations in the Gregorian Calendar,
-     * e.g. leap years have different days in the month = {@link java.util.Calendar#FEBRUARY}
-     * so the result of {@link javax.xml.datatype.Duration#getMonths()} can be influenced.</p>
-     *
-     * <p>Any remaining milliseconds after determining the year and month are discarded.</p>
-     *
-     * @param durationInMilliseconds Milliseconds of <code>Duration</code> to create.
-     *
-     * @return New <code>Duration</code> created using the specified <code>durationInMilliseconds</code>.
-     */
-    public Duration newDurationYearMonth(final long durationInMilliseconds) {
-
-        return newDuration(durationInMilliseconds);
-    }
-
-    /**
-     * <p>Create a <code>Duration</code> of type <code>xdt:yearMonthDuration</code> using the specified
-     * <code>year</code> and <code>month</code> as defined in
-     * <a href="http://www.w3.org/TR/xpath-datamodel#dt-yearMonthyDuration">
-     *   XQuery 1.0 and XPath 2.0 Data Model, xdt:yearMonthDuration</a>.</p>
-     *
-     * <p>The XML Schema specification states that values can be of an arbitrary size.
-     * Implementations may chose not to or be incapable of supporting arbitrarily large and/or small values.
-     * An {@link UnsupportedOperationException} will be thrown with a message indicating implementation limits
-     * if implementation capacities are exceeded.</p>
-     *
-     * <p>A <code>null</code> value indicates that field is not set.</p>
-     *
-     * @param isPositive Set to <code>false</code> to create a negative duration. When the length
-     *   of the duration is zero, this parameter will be ignored.
-     * @param year Year of <code>Duration</code>.
-     * @param month Month of <code>Duration</code>.
-     *
-     * @return New <code>Duration</code> created using the specified <code>year</code> and <code>month</code>.
-     *
-     * @throws IllegalArgumentException If any values would create an invalid <code>Duration</code>.
-     * @throws UnsupportedOperationException If implementation cannot support requested values.
-     */
-    public Duration newDurationYearMonth(
-            final boolean isPositive,
-            final BigInteger year,
-            final BigInteger month) {
-
-        return newDuration(
-                isPositive,
-                year,
-                month,
-                null, // days
-                null, // hours
-                null, // minutes
-                null  // seconds
-        );
-    }
-
-    /**
-     * <p>Create a <code>Duration</code> of type <code>xdt:yearMonthDuration</code> using the specified
-     * <code>year</code> and <code>month</code> as defined in
-     * <a href="http://www.w3.org/TR/xpath-datamodel#dt-yearMonthyDuration">
-     *   XQuery 1.0 and XPath 2.0 Data Model, xdt:yearMonthDuration</a>.</p>
-     *
-     * <p>A {@link javax.xml.datatype.DatatypeConstants#FIELD_UNDEFINED} value indicates that field is not set.</p>
-     *
-     * @param isPositive Set to <code>false</code> to create a negative duration. When the length
-     *   of the duration is zero, this parameter will be ignored.
-     * @param year Year of <code>Duration</code>.
-     * @param month Month of <code>Duration</code>.
-     *
-     * @return New <code>Duration</code> created using the specified <code>year</code> and <code>month</code>.
-     *
-     * @throws IllegalArgumentException If any values would create an invalid <code>Duration</code>.
-     */
-    public Duration newDurationYearMonth(
-            final boolean isPositive,
-            final int year,
-            final int month) {
-        return newDuration(isPositive, year, month,
-                DatatypeConstants.FIELD_UNDEFINED, DatatypeConstants.FIELD_UNDEFINED,
-                DatatypeConstants.FIELD_UNDEFINED, DatatypeConstants.FIELD_UNDEFINED);
-    }
-
-    /**
-     * <p>Create a new instance of an <code>XMLGregorianCalendar</code>.</p>
-     *
-     * <p>All date/time datatype fields set to {@link javax.xml.datatype.DatatypeConstants#FIELD_UNDEFINED} or null.</p>
-     *
-     * @return New <code>XMLGregorianCalendar</code> with all date/time datatype fields set to
-     *   {@link javax.xml.datatype.DatatypeConstants#FIELD_UNDEFINED} or null.
-     */
-    public abstract XMLGregorianCalendar newXMLGregorianCalendar();
-
-    /**
-     * <p>Create a new XMLGregorianCalendar by parsing the String as a lexical representation.</p>
-     *
-     * <p>Parsing the lexical string representation is defined in
-     * <a href="http://www.w3.org/TR/xmlschema-2/#dateTime-order">XML Schema 1.0 Part 2, Section 3.2.[7-14].1,
-     * <em>Lexical Representation</em>.</a></p>
-     *
-     * <p>The string representation may not have any leading and trailing whitespaces.</p>
-     *
-     * <p>The parsing is done field by field so that
-     * the following holds for any lexically correct String x:</p>
-     * <pre>
-     * newXMLGregorianCalendar(x).toXMLFormat().equals(x)
-     * </pre>
-     * <p>Except for the noted lexical/canonical representation mismatches
-     * listed in <a href="http://www.w3.org/2001/05/xmlschema-errata#e2-45">
-     * XML Schema 1.0 errata, Section 3.2.7.2</a>.</p>
-     *
-     * @param lexicalRepresentation Lexical representation of one the eight XML Schema date/time datatypes.
-     *
-     * @return <code>XMLGregorianCalendar</code> created from the <code>lexicalRepresentation</code>.
-     *
-     * @throws IllegalArgumentException If the <code>lexicalRepresentation</code> is not a valid <code>XMLGregorianCalendar</code>.
-     * @throws NullPointerException If <code>lexicalRepresentation</code> is <code>null</code>.
-     */
-    public abstract XMLGregorianCalendar newXMLGregorianCalendar(final String lexicalRepresentation);
-
-    /**
-     * <p>Create an <code>XMLGregorianCalendar</code> from a {@link java.util.GregorianCalendar}.</p>
-     *
-     * <table border="2" rules="all" cellpadding="2">
-     *   <thead>
-     *     <tr>
-     *       <th align="center" colspan="2">
-     *          Field by Field Conversion from
-     *          {@link java.util.GregorianCalendar} to an {@link javax.xml.datatype.XMLGregorianCalendar}
-     *       </th>
-     *     </tr>
-     *     <tr>
-     *        <th><code>java.util.GregorianCalendar</code> field</th>
-     *        <th><code>javax.xml.datatype.XMLGregorianCalendar</code> field</th>
-     *     </tr>
-     *   </thead>
-     *   <tbody>
-     *     <tr>
-     *       <td><code>ERA == GregorianCalendar.BC ? -YEAR : YEAR</code></td>
-     *       <td>{@link javax.xml.datatype.XMLGregorianCalendar#setYear(int year)}</td>
-     *     </tr>
-     *     <tr>
-     *       <td><code>MONTH + 1</code></td>
-     *       <td>{@link javax.xml.datatype.XMLGregorianCalendar#setMonth(int month)}</td>
-     *     </tr>
-     *     <tr>
-     *       <td><code>DAY_OF_MONTH</code></td>
-     *       <td>{@link javax.xml.datatype.XMLGregorianCalendar#setDay(int day)}</td>
-     *     </tr>
-     *     <tr>
-     *       <td><code>HOUR_OF_DAY, MINUTE, SECOND, MILLISECOND</code></td>
-     *       <td>{@link javax.xml.datatype.XMLGregorianCalendar#setTime(int hour, int minute, int second, java.math.BigDecimal fractional)}</td>
-     *     </tr>
-     *     <tr>
-     *       <td>
-     *         <code>(ZONE_OFFSET + DST_OFFSET) / (60*1000)</code><br/>
-     *         <em>(in minutes)</em>
-     *       </td>
-     *       <td>{@link javax.xml.datatype.XMLGregorianCalendar#setTimezone(int offset)}<sup><em>*</em></sup>
-     *       </td>
-     *     </tr>
-     *   </tbody>
-     * </table>
-     * <p><em>*</em>conversion loss of information. It is not possible to represent
-     * a <code>java.util.GregorianCalendar</code> daylight savings timezone id in the
-     * XML Schema 1.0 date/time datatype representation.</p>
-     *
-     * <p>To compute the return value's <code>TimeZone</code> field,
-     * <ul>
-     * <li>when <code>this.getTimezone() != FIELD_UNDEFINED</code>,
-     * create a <code>java.util.TimeZone</code> with a custom timezone id
-     * using the <code>this.getTimezone()</code>.</li>
-     * <li>else use the <code>GregorianCalendar</code> default timezone value
-     * for the host is defined as specified by
-     * <code>java.util.TimeZone.getDefault()</code>.</li></p>
-     *
-     * @param cal <code>java.util.GregorianCalendar</code> used to create <code>XMLGregorianCalendar</code>
-     *
-     * @return <code>XMLGregorianCalendar</code> created from <code>java.util.GregorianCalendar</code>
-     *
-     * @throws NullPointerException If <code>cal</code> is <code>null</code>.
-     */
-    public abstract XMLGregorianCalendar newXMLGregorianCalendar(final GregorianCalendar cal);
-
-    /**
-     * <p>Constructor allowing for complete value spaces allowed by
-     * W3C XML Schema 1.0 recommendation for xsd:dateTime and related
-     * builtin datatypes. Note that <code>year</code> parameter supports
-     * arbitrarily large numbers and fractionalSecond has infinite
-     * precision.</p>
-     *
-     * <p>A <code>null</code> value indicates that field is not set.</p>
-     *
-     * @param year of <code>XMLGregorianCalendar</code> to be created.
-     * @param month of <code>XMLGregorianCalendar</code> to be created.
-     * @param day of <code>XMLGregorianCalendar</code> to be created.
-     * @param hour of <code>XMLGregorianCalendar</code> to be created.
-     * @param minute of <code>XMLGregorianCalendar</code> to be created.
-     * @param second of <code>XMLGregorianCalendar</code> to be created.
-     * @param fractionalSecond of <code>XMLGregorianCalendar</code> to be created.
-     * @param timezone of <code>XMLGregorianCalendar</code> to be created.
-     *
-     * @return <code>XMLGregorianCalendar</code> created from specified values.
-     *
-     * @throws IllegalArgumentException If any individual parameter's value is outside the maximum value constraint for the field
-     *   as determined by the Date/Time Data Mapping table in {@link javax.xml.datatype.XMLGregorianCalendar}
-     *   or if the composite values constitute an invalid <code>XMLGregorianCalendar</code> instance
-     *   as determined by {@link javax.xml.datatype.XMLGregorianCalendar#isValid()}.
-     */
-    public abstract XMLGregorianCalendar newXMLGregorianCalendar(
-            final BigInteger year,
-            final int month,
-            final int day,
-            final int hour,
-            final int minute,
-            final int second,
-            final BigDecimal fractionalSecond,
-            final int timezone);
-
-    /**
-     * <p>Constructor of value spaces that a
-     * <code>java.util.GregorianCalendar</code> instance would need to convert to an
-     * <code>XMLGregorianCalendar</code> instance.</p>
-     *
-     * <p><code>XMLGregorianCalendar eon</code> and
-     * <code>fractionalSecond</code> are set to <code>null</code></p>
-     *
-     * <p>A {@link javax.xml.datatype.DatatypeConstants#FIELD_UNDEFINED} value indicates that field is not set.</p>
-     *
-     * @param year of <code>XMLGregorianCalendar</code> to be created.
-     * @param month of <code>XMLGregorianCalendar</code> to be created.
-     * @param day of <code>XMLGregorianCalendar</code> to be created.
-     * @param hour of <code>XMLGregorianCalendar</code> to be created.
-     * @param minute of <code>XMLGregorianCalendar</code> to be created.
-     * @param second of <code>XMLGregorianCalendar</code> to be created.
-     * @param millisecond of <code>XMLGregorianCalendar</code> to be created.
-     * @param timezone of <code>XMLGregorianCalendar</code> to be created.
-     *
-     * @return <code>XMLGregorianCalendar</code> created from specified values.
-     *
-     * @throws IllegalArgumentException If any individual parameter's value is outside the maximum value constraint for the field
-     *   as determined by the Date/Time Data Mapping table in {@link javax.xml.datatype.XMLGregorianCalendar}
-     *   or if the composite values constitute an invalid <code>XMLGregorianCalendar</code> instance
-     *   as determined by {@link javax.xml.datatype.XMLGregorianCalendar#isValid()}.
-     */
-    public XMLGregorianCalendar newXMLGregorianCalendar(
-            final int year,
-            final int month,
-            final int day,
-            final int hour,
-            final int minute,
-            final int second,
-            final int millisecond,
-            final int timezone) {
-
-        // year may be undefined
-        BigInteger realYear = (year != DatatypeConstants.FIELD_UNDEFINED) ? BigInteger.valueOf((long) year) : null;
-
-        // millisecond may be undefined
-        // millisecond must be >= 0 millisecond <= 1000
-        BigDecimal realMillisecond = null; // undefined value
-        if (millisecond != DatatypeConstants.FIELD_UNDEFINED) {
-            if (millisecond < 0 || millisecond > 1000) {
-                throw new IllegalArgumentException(
-                        "javax.xml.datatype.DatatypeFactory#newXMLGregorianCalendar("
-                        + "int year, int month, int day, int hour, int minute, int second, int millisecond, int timezone)"
-                        + "with invalid millisecond: " + millisecond
-                );
-            }
-            realMillisecond = BigDecimal.valueOf((long) millisecond, 3);
-        }
-
-        return newXMLGregorianCalendar(
-                realYear,
-                month,
-                day,
-                hour,
-                minute,
-                second,
-                realMillisecond,
-                timezone
-        );
-    }
-
-    /**
-     * <p>Create a Java representation of XML Schema builtin datatype <code>date</code> or <code>g*</code>.</p>
-     *
-     * <p>For example, an instance of <code>gYear</code> can be created invoking this factory
-     * with <code>month</code> and <code>day</code> parameters set to
-     * {@link javax.xml.datatype.DatatypeConstants#FIELD_UNDEFINED}.</p>
-     *
-     * <p>A {@link javax.xml.datatype.DatatypeConstants#FIELD_UNDEFINED} value indicates that field is not set.</p>
-     *
-     * @param year of <code>XMLGregorianCalendar</code> to be created.
-     * @param month of <code>XMLGregorianCalendar</code> to be created.
-     * @param day of <code>XMLGregorianCalendar</code> to be created.
-     * @param timezone offset in minutes. {@link javax.xml.datatype.DatatypeConstants#FIELD_UNDEFINED} indicates optional field is not set.
-     *
-     * @return <code>XMLGregorianCalendar</code> created from parameter values.
-     *
-     * @see javax.xml.datatype.DatatypeConstants#FIELD_UNDEFINED
-     *
-     * @throws IllegalArgumentException If any individual parameter's value is outside the maximum value constraint for the field
-     *   as determined by the Date/Time Data Mapping table in {@link javax.xml.datatype.XMLGregorianCalendar}
-     *   or if the composite values constitute an invalid <code>XMLGregorianCalendar</code> instance
-     *   as determined by {@link javax.xml.datatype.XMLGregorianCalendar#isValid()}.
-     */
-    public XMLGregorianCalendar newXMLGregorianCalendarDate(
-            final int year,
-            final int month,
-            final int day,
-            final int timezone) {
-
-        return newXMLGregorianCalendar(
-                year,
-                month,
-                day,
-                DatatypeConstants.FIELD_UNDEFINED, // hour
-                DatatypeConstants.FIELD_UNDEFINED, // minute
-                DatatypeConstants.FIELD_UNDEFINED, // second
-                DatatypeConstants.FIELD_UNDEFINED, // millisecond
-                timezone);
-    }
-
-    /**
-     * <p>Create a Java instance of XML Schema builtin datatype <code>time</code>.</p>
-     *
-     * <p>A {@link javax.xml.datatype.DatatypeConstants#FIELD_UNDEFINED} value indicates that field is not set.</p>
-     *
-     * @param hours number of hours
-     * @param minutes number of minutes
-     * @param seconds number of seconds
-     * @param timezone offset in minutes. {@link javax.xml.datatype.DatatypeConstants#FIELD_UNDEFINED} indicates optional field is not set.
-     *
-     * @return <code>XMLGregorianCalendar</code> created from parameter values.
-     *
-     * @throws IllegalArgumentException If any individual parameter's value is outside the maximum value constraint for the field
-     *   as determined by the Date/Time Data Mapping table in {@link javax.xml.datatype.XMLGregorianCalendar}
-     *   or if the composite values constitute an invalid <code>XMLGregorianCalendar</code> instance
-     *   as determined by {@link javax.xml.datatype.XMLGregorianCalendar#isValid()}.
-     *
-     * @see javax.xml.datatype.DatatypeConstants#FIELD_UNDEFINED
-     */
-    public XMLGregorianCalendar newXMLGregorianCalendarTime(
-            final int hours,
-            final int minutes,
-            final int seconds,
-            final int timezone) {
-
-        return newXMLGregorianCalendar(
-                DatatypeConstants.FIELD_UNDEFINED, // Year
-                DatatypeConstants.FIELD_UNDEFINED, // Month
-                DatatypeConstants.FIELD_UNDEFINED, // Day
-                hours,
-                minutes,
-                seconds,
-                DatatypeConstants.FIELD_UNDEFINED, //Millisecond
-                timezone);
-    }
-
-    /**
-     * <p>Create a Java instance of XML Schema builtin datatype time.</p>
-     *
-     * <p>A <code>null</code> value indicates that field is not set.</p>
-     * <p>A {@link javax.xml.datatype.DatatypeConstants#FIELD_UNDEFINED} value indicates that field is not set.</p>
-     *
-     * @param hours number of hours
-     * @param minutes number of minutes
-     * @param seconds number of seconds
-     * @param fractionalSecond value of <code>null</code> indicates that this optional field is not set.
-     * @param timezone offset in minutes. {@link javax.xml.datatype.DatatypeConstants#FIELD_UNDEFINED} indicates optional field is not set.
-     *
-     * @return <code>XMLGregorianCalendar</code> created from parameter values.
-     *
-     * @see javax.xml.datatype.DatatypeConstants#FIELD_UNDEFINED
-     *
-     * @throws IllegalArgumentException If any individual parameter's value is outside the maximum value constraint for the field
-     *   as determined by the Date/Time Data Mapping table in {@link javax.xml.datatype.XMLGregorianCalendar}
-     *   or if the composite values constitute an invalid <code>XMLGregorianCalendar</code> instance
-     *   as determined by {@link javax.xml.datatype.XMLGregorianCalendar#isValid()}.
-     */
-    public XMLGregorianCalendar newXMLGregorianCalendarTime(
-            final int hours,
-            final int minutes,
-            final int seconds,
-            final BigDecimal fractionalSecond,
-            final int timezone) {
-
-        return newXMLGregorianCalendar(
-                null, // year
-                DatatypeConstants.FIELD_UNDEFINED, // month
-                DatatypeConstants.FIELD_UNDEFINED, // day
-                hours,
-                minutes,
-                seconds,
-                fractionalSecond,
-                timezone);
-    }
-
-    /**
-     * <p>Create a Java instance of XML Schema builtin datatype time.</p>
-     *
-     * <p>A {@link javax.xml.datatype.DatatypeConstants#FIELD_UNDEFINED} value indicates that field is not set.</p>
-     *
-     * @param hours number of hours
-     * @param minutes number of minutes
-     * @param seconds number of seconds
-     * @param milliseconds number of milliseconds
-     * @param timezone offset in minutes. {@link javax.xml.datatype.DatatypeConstants#FIELD_UNDEFINED} indicates optional field is not set.
-     *
-     * @return <code>XMLGregorianCalendar</code> created from parameter values.
-     *
-     * @see javax.xml.datatype.DatatypeConstants#FIELD_UNDEFINED
-     *
-     * @throws IllegalArgumentException If any individual parameter's value is outside the maximum value constraint for the field
-     *   as determined by the Date/Time Data Mapping table in {@link javax.xml.datatype.XMLGregorianCalendar}
-     *   or if the composite values constitute an invalid <code>XMLGregorianCalendar</code> instance
-     *   as determined by {@link javax.xml.datatype.XMLGregorianCalendar#isValid()}.
-     */
-    public XMLGregorianCalendar newXMLGregorianCalendarTime(
-            final int hours,
-            final int minutes,
-            final int seconds,
-            final int milliseconds,
-            final int timezone) {
-
-        // millisecond may be undefined
-        // millisecond must be >= 0 millisecond <= 1000
-        BigDecimal realMilliseconds = null; // undefined value
-        if (milliseconds != DatatypeConstants.FIELD_UNDEFINED) {
-            if (milliseconds < 0 || milliseconds > 1000) {
-                throw new IllegalArgumentException(
-                        "javax.xml.datatype.DatatypeFactory#newXMLGregorianCalendarTime("
-                        + "int hours, int minutes, int seconds, int milliseconds, int timezone)"
-                        + "with invalid milliseconds: " + milliseconds
-                );
-            }
-            realMilliseconds = BigDecimal.valueOf((long) milliseconds, 3);
-        }
-
-        return newXMLGregorianCalendarTime(
-                hours,
-                minutes,
-                seconds,
-                realMilliseconds,
-                timezone
-        );
-    }
-}
diff --git a/trunk/jaxp-api-1.4/src/main/java/javax/xml/datatype/FactoryFinder.java b/trunk/jaxp-api-1.4/src/main/java/javax/xml/datatype/FactoryFinder.java
deleted file mode 100644
index 9bdc4e4..0000000
--- a/trunk/jaxp-api-1.4/src/main/java/javax/xml/datatype/FactoryFinder.java
+++ /dev/null
@@ -1,397 +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.
- */
-
-// $Id: FactoryFinder.java 446598 2006-09-15 12:55:40Z jeremias $
-
-package javax.xml.datatype;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.util.Properties;
-
-/**
- * <p>Implement pluggabile Datatypes.</p>
- * 
- * <p>This class is duplicated for each JAXP subpackage so keep it in
- * sync.  It is package private for secure class loading.</p>
- *
- * @author <a href="mailto:Jeff.Suttor@Sun.com">Jeff Suttor</a>
- * @version $Revision: 446598 $, $Date: 2006-09-15 08:55:40 -0400 (Fri, 15 Sep 2006) $
- * @since 1.5
- */
-final class FactoryFinder {
-	
-	/**
-	 * <p>Name of class to display in output messages.</p>
-	 */
-	private static final String CLASS_NAME = "javax.xml.datatype.FactoryFinder";
-	
-    /**
-     * <p>Debug flag to trace loading process.</p>
-     */
-    private static boolean debug = false;
-    
-    /**
-     * <p>Cache properties for performance.</p>
-     */
-	private static Properties cacheProps = new Properties();
-	
-	/**
-	 * <p>First time requires initialization overhead.</p>
-	 */
-	private static boolean firstTime = true;
-    
-    /**
-     * Default columns per line.
-     */
-    private static final int DEFAULT_LINE_LENGTH = 80;
-	
-	/**
-	 * <p>Check to see if debugging enabled by property.</p>
-	 * 
-	 * <p>Use try/catch block to support applets, which throws
-     * SecurityException out of this code.</p>
-	 * 
-	 */
-    static {
-        try {
-            String val = SecuritySupport.getSystemProperty("jaxp.debug");
-            // Allow simply setting the prop to turn on debug
-            debug = val != null && (! "false".equals(val));
-        } catch (Exception x) {
-            debug = false;
-        }
-    }
-    
-    private FactoryFinder() {}
-
-	/**
-	 * <p>Output debugging messages.</p>
-	 * 
-	 * @param msg <code>String</code> to print to <code>stderr</code>.
-	 */
-    private static void debugPrintln(String msg) {
-        if (debug) {
-            System.err.println(
-            	CLASS_NAME
-            	+ ":"
-            	+ msg);
-        }
-    }
-
-    /**
-     * <p>Find the appropriate <code>ClassLoader</code> to use.</p>
-     * 
-     * <p>The context ClassLoader is prefered.</p>
-     * 
-     * @return <code>ClassLoader</code> to use.
-     * 
-     * @throws ConfigurationError If a valid <code>ClassLoader</code> cannot be identified. 
-     */
-    private static ClassLoader findClassLoader()
-        throws ConfigurationError {
-        ClassLoader classLoader;
-
-        // Figure out which ClassLoader to use for loading the provider
-        // class.  If there is a Context ClassLoader then use it.
-
-        classLoader = SecuritySupport.getContextClassLoader();            
-
-        if (debug) debugPrintln(
-            "Using context class loader: "
-            + classLoader);
-
-        if (classLoader == null) {
-            // if we have no Context ClassLoader
-            // so use the current ClassLoader
-            classLoader = FactoryFinder.class.getClassLoader();
-            if (debug) debugPrintln(
-                "Using the class loader of FactoryFinder: "
-                + classLoader);                
-        }
-                    
-        return classLoader;
-    }
-
-    /**
-     * <p>Create an instance of a class using the specified ClassLoader.</p>
-     * 
-     * @param className Name of class to create.
-     * @param classLoader ClassLoader to use to create named class.
-     * 
-     * @return New instance of specified class created using the specified ClassLoader.
-     * 
-     * @throws ConfigurationError If class could not be created.
-     */
-    static Object newInstance(
-    	String className,
-        ClassLoader classLoader)
-        throws ConfigurationError {
-        	
-        try {
-            Class spiClass;
-            if (classLoader == null) {
-                spiClass = Class.forName(className);
-            } else {
-                spiClass = classLoader.loadClass(className);
-            }
-            
-            if (debug) {
-            	debugPrintln("Loaded " + className + " from " + which(spiClass));
-            }
-             
-            return spiClass.newInstance();
-        } catch (ClassNotFoundException x) {
-            throw new ConfigurationError(
-                "Provider " + className + " not found", x);
-        } catch (Exception x) {
-            throw new ConfigurationError(
-                "Provider " + className + " could not be instantiated: " + x,
-                x);
-        }
-    }
-
-    /**
-     * Finds the implementation Class object in the specified order.  Main
-     * entry point.
-     * Package private so this code can be shared.
-     *
-     * @param factoryId Name of the factory to find, same as a property name
-     * @param fallbackClassName Implementation class name, if nothing else is found.  Use null to mean no fallback.
-     *
-     * @return Class Object of factory, never null
-     * 
-     * @throws ConfigurationError If Class cannot be found.
-     */
-    static Object find(String factoryId, String fallbackClassName)
-        throws ConfigurationError {
-        	
-        ClassLoader classLoader = findClassLoader();
-
-        try {
-            // If we are deployed into an OSGi environment, leverage it
-            Class factoryClass = FactoryFinder.class.getClassLoader().loadClass(factoryId);
-            Class spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(factoryClass, factoryId);
-            if (spiClass != null) {
-                return spiClass.newInstance();
-            }
-        } catch (Throwable e) {
-        }
-
-        // Use the system property first
-        try {
-            String systemProp = SecuritySupport.getSystemProperty(factoryId);
-            if (systemProp != null) {
-                if (debug) debugPrintln("found " + systemProp + " in the system property " + factoryId);
-                return newInstance(systemProp, classLoader);
-            }
-        } catch (SecurityException se) {
-        	; // NOP, explicitly ignore SecurityException
-        }
-
-        // try to read from $java.home/lib/jaxp.properties
-        try {
-            String javah = SecuritySupport.getSystemProperty("java.home");
-            String configFile = javah + File.separator + "lib" + File.separator + "jaxp.properties";
-			String factoryClassName = null;
-			if (firstTime) {
-				synchronized (cacheProps) {
-					if (firstTime) {
-						File f = new File(configFile);
-						firstTime = false;
-						if (SecuritySupport.doesFileExist(f)) {
-							if (debug) debugPrintln("Read properties file " + f);
-							cacheProps.load(SecuritySupport.getFileInputStream(f));
-						}
-					}
-				}
-			}
-			factoryClassName = cacheProps.getProperty(factoryId);
-            if (debug) debugPrintln("found " + factoryClassName + " in $java.home/jaxp.properties"); 
-			
-			if (factoryClassName != null) {
-				return newInstance(factoryClassName, classLoader);
-			}
-        } catch (Exception ex) {
-            if (debug) {
-            	ex.printStackTrace();
-            } 
-        }
-        
-        // Try Jar Service Provider Mechanism
-        Object provider = findJarServiceProvider(factoryId);
-        if (provider != null) {
-            return provider;
-        }
-
-        if (fallbackClassName == null) {
-            throw new ConfigurationError(
-                "Provider for " + factoryId + " cannot be found", null);
-        }
-
-        if (debug) debugPrintln("loaded from fallback value: " + fallbackClassName);
-        return newInstance(fallbackClassName, classLoader);
-    }
-
-    /*
-     * Try to find provider using Jar Service Provider Mechanism
-     *
-     * @return instance of provider class if found or null
-     */
-    private static Object findJarServiceProvider(String factoryId)
-        throws ConfigurationError
-    {
-
-        String serviceId = "META-INF/services/" + factoryId;
-        InputStream is = null;
-
-        // First try the Context ClassLoader
-        ClassLoader cl = SecuritySupport.getContextClassLoader();
-        if (cl != null) {
-            is = SecuritySupport.getResourceAsStream(cl, serviceId);
-
-            // If no provider found then try the current ClassLoader
-            if (is == null) {
-                cl = FactoryFinder.class.getClassLoader();
-                is = SecuritySupport.getResourceAsStream(cl, serviceId);
-            }
-        } else {
-            // No Context ClassLoader, try the current
-            // ClassLoader
-            cl = FactoryFinder.class.getClassLoader();
-            is = SecuritySupport.getResourceAsStream(cl, serviceId);
-        }
-
-        if (is == null) {
-            // No provider found
-            return null;
-        }
-
-        if (debug) debugPrintln("found jar resource=" + serviceId +
-               " using ClassLoader: " + cl);
-
-        BufferedReader rd;
-        try {
-            rd = new BufferedReader(new InputStreamReader(is, "UTF-8"), DEFAULT_LINE_LENGTH);
-        } catch (java.io.UnsupportedEncodingException e) {
-            rd = new BufferedReader(new InputStreamReader(is), DEFAULT_LINE_LENGTH);
-        }
-        
-        String factoryClassName = null;
-        try {
-            // XXX Does not handle all possible input as specified by the
-            // Jar Service Provider specification
-            factoryClassName = rd.readLine();
-        } 
-        catch (IOException x) {
-            // No provider found
-            return null;
-        }
-        finally {
-            try { 
-                // try to close the reader. 
-                rd.close(); 
-            } 
-            // Ignore the exception. 
-            catch (IOException exc) {}
-        }
-
-        if (factoryClassName != null &&
-            ! "".equals(factoryClassName)) {
-            if (debug) debugPrintln("found in resource, value="
-                   + factoryClassName);
-
-            return newInstance(factoryClassName, cl);
-        }
-
-        // No provider found
-        return null;
-    }
-    
-	/**
-	 * <p>Configuration Error.</p>
-	 */
-    static class ConfigurationError extends Error {
-        
-        private static final long serialVersionUID = -3644413026244211347L;
-    	
-    	/**
-    	 * <p>Exception that caused the error.</p>
-    	 */
-        private Exception exception;
-
-        /**
-         * <p>Construct a new instance with the specified detail string and
-         * exception.</p>
-         * 
-         * @param msg Detail message for this error.
-         * @param x Exception that caused the error.
-         */
-        ConfigurationError(String msg, Exception x) {
-            super(msg);
-            this.exception = x;
-        }
-
-		/**
-		 * <p>Get the Exception that caused the error.</p>
-		 * 
-		 * @return Exception that caused the error.
-		 */
-        Exception getException() {
-            return exception;
-        }
-    }
-
-
-
-    /**
-     * Returns the location where the given Class is loaded from.
-     * 
-     * @param clazz Class to find load location.
-     * 
-     * @return Location where class would be loaded from.
-     */
-    private static String which(Class clazz) {
-        try {
-            String classnameAsResource = clazz.getName().replace('.', '/') + ".class";
-    
-            ClassLoader loader = clazz.getClassLoader();
-            
-            URL it;
-    
-            if (loader != null) {
-            	it = loader.getResource(classnameAsResource);
-            } else {
-            	it = ClassLoader.getSystemResource(classnameAsResource);
-            } 
-    
-            if (it != null) {
-            	return it.toString();
-            } 
-        } catch (Throwable t) {
-            // work defensively.
-            if (debug) {
-            	t.printStackTrace();
-            } 
-        }
-        return "unknown location";
-    }
-}
diff --git a/trunk/jaxp-api-1.4/src/main/java/javax/xml/datatype/SecuritySupport.java b/trunk/jaxp-api-1.4/src/main/java/javax/xml/datatype/SecuritySupport.java
deleted file mode 100644
index da82748..0000000
--- a/trunk/jaxp-api-1.4/src/main/java/javax/xml/datatype/SecuritySupport.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.
- */
-
-// $Id: SecuritySupport.java 446598 2006-09-15 12:55:40Z jeremias $
-
-package javax.xml.datatype;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.InputStream;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-
-/**
- * This class is duplicated for each JAXP subpackage so keep it in sync.
- * It is package private and therefore is not exposed as part of the JAXP
- * API.
- *
- * Security related methods that only work on J2SE 1.2 and newer.
- */
-final class SecuritySupport  {
-    
-    private SecuritySupport() {}
-    
-    static ClassLoader getContextClassLoader() {
-	return (ClassLoader)
-		AccessController.doPrivileged(new PrivilegedAction() {
-	    public Object run() {
-		ClassLoader cl = null;
-		try {
-		    cl = Thread.currentThread().getContextClassLoader();
-		} catch (SecurityException ex) { }
-		return cl;
-	    }
-	});
-    }
-
-    static String getSystemProperty(final String propName) {
-	return (String)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    return System.getProperty(propName);
-                }
-            });
-    }
-
-    static FileInputStream getFileInputStream(final File file)
-        throws FileNotFoundException
-    {
-	try {
-            return (FileInputStream)
-                AccessController.doPrivileged(new PrivilegedExceptionAction() {
-                    public Object run() throws FileNotFoundException {
-                        return new FileInputStream(file);
-                    }
-                });
-	} catch (PrivilegedActionException e) {
-	    throw (FileNotFoundException)e.getException();
-	}
-    }
-
-    static InputStream getResourceAsStream(final ClassLoader cl,
-                                           final String name)
-    {
-        return (InputStream)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    InputStream ris;
-                    if (cl == null) {
-                        ris = ClassLoader.getSystemResourceAsStream(name);
-                    } else {
-                        ris = cl.getResourceAsStream(name);
-                    }
-                    return ris;
-                }
-            });
-    }
-
-    static boolean doesFileExist(final File f) {
-    return ((Boolean)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    return f.exists() ? Boolean.TRUE : Boolean.FALSE;
-                }
-            })).booleanValue();
-    }
-
-}
diff --git a/trunk/jaxp-api-1.4/src/main/java/javax/xml/parsers/DocumentBuilderFactory.java b/trunk/jaxp-api-1.4/src/main/java/javax/xml/parsers/DocumentBuilderFactory.java
deleted file mode 100644
index 6293ad8..0000000
--- a/trunk/jaxp-api-1.4/src/main/java/javax/xml/parsers/DocumentBuilderFactory.java
+++ /dev/null
@@ -1,551 +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.
- */
-
-// $Id: DocumentBuilderFactory.java 884950 2009-11-27 18:46:18Z mrglavas $
-
-package javax.xml.parsers;
-
-import javax.xml.validation.Schema;
-
-/**
- * Defines a factory API that enables applications to obtain a
- * parser that produces DOM object trees from XML documents.
- *
- * @author <a href="Jeff.Suttor@Sun.com">Jeff Suttor</a>
- * @version $Revision: 884950 $, $Date: 2009-11-27 13:46:18 -0500 (Fri, 27 Nov 2009) $
- */
-
-public abstract class DocumentBuilderFactory {
-
-    private boolean validating = false;
-    private boolean namespaceAware = false;
-    private boolean whitespace = false;
-    private boolean expandEntityRef = true;
-    private boolean ignoreComments = false;
-    private boolean coalescing = false;
-
-    protected DocumentBuilderFactory () {
-    }
-
-    /**
-     * Obtain a new instance of a
-     * <code>DocumentBuilderFactory</code>. This static method creates
-     * a new factory instance.
-     * This method uses the following ordered lookup procedure to determine
-     * the <code>DocumentBuilderFactory</code> implementation class to
-     * load:
-     * <ul>
-     * <li>
-     * Use the <code>javax.xml.parsers.DocumentBuilderFactory</code> system
-     * property.
-     * </li>
-     * <li>
-     * Use the properties file "lib/jaxp.properties" in the JRE directory.
-     * This configuration file is in standard <code>java.util.Properties
-     * </code> format and contains the fully qualified name of the
-     * implementation class with the key being the system property defined
-     * above.
-     *
-     * The jaxp.properties file is read only once by the JAXP implementation
-     * and it's values are then cached for future use.  If the file does not exist
-     * when the first attempt is made to read from it, no further attempts are
-     * made to check for its existence.  It is not possible to change the value
-     * of any property in jaxp.properties after it has been read for the first time.
-     * </li>
-     * <li>
-     * Use the Services API (as detailed in the JAR specification), if
-     * available, to determine the classname. The Services API will look
-     * for a classname in the file
-     * <code>META-INF/services/javax.xml.parsers.DocumentBuilderFactory</code>
-     * in jars available to the runtime.
-     * </li>
-     * <li>
-     * Platform default <code>DocumentBuilderFactory</code> instance.
-     * </li>
-     * </ul>
-     *
-     * Once an application has obtained a reference to a
-     * <code>DocumentBuilderFactory</code> it can use the factory to
-     * configure and obtain parser instances.
-     *
-     *
-     * <h2>Tip for Trouble-shooting</h2>
-     * <p>Setting the <code>jaxp.debug</code> system property will cause
-     * this method to print a lot of debug messages
-     * to <tt>System.err</tt> about what it is doing and where it is looking at.</p>
-     *
-     * <p> If you have problems loading {@link DocumentBuilder}s, try:</p>
-     * <pre>
-     * java -Djaxp.debug=1 YourProgram ....
-     * </pre>
-     *
-     * @return New instance of a <code>DocumentBuilderFactory</code>
-     *
-     * @exception FactoryConfigurationError if the implementation is not
-     * available or cannot be instantiated.
-     */
-    public static DocumentBuilderFactory newInstance() {
-        try {
-            return (DocumentBuilderFactory) FactoryFinder.find(
-                    /* The default property name according to the JAXP spec */
-                    "javax.xml.parsers.DocumentBuilderFactory",
-                    /* The fallback implementation class name */
-                    "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
-        }
-        catch (FactoryFinder.ConfigurationError e) {
-            throw new FactoryConfigurationError(e.getException(), e.getMessage());
-        }
-    }
-
-    /**
-     * @return New instance of a <code>DocumentBuilderFactory</code>
-     *
-     * @exception FactoryConfigurationError if the implementation is not
-     * available or cannot be instantiated.
-     */
-    public static DocumentBuilderFactory newInstance(String factoryClassName,
-                                                     ClassLoader classLoader) {
-        if (factoryClassName == null) {
-            throw new FactoryConfigurationError("factoryClassName cannot be null.");
-        }
-        if (classLoader == null) {
-            classLoader = SecuritySupport.getContextClassLoader();
-        }
-        try {
-            return (DocumentBuilderFactory) FactoryFinder.newInstance(factoryClassName, classLoader, false);
-        }
-        catch (FactoryFinder.ConfigurationError e) {
-            throw new FactoryConfigurationError(e.getException(), e.getMessage());
-        }
-    }
-
-    /**
-     * Creates a new instance of a {@link javax.xml.parsers.DocumentBuilder}
-     * using the currently configured parameters.
-     *
-     * @exception ParserConfigurationException if a DocumentBuilder
-     * cannot be created which satisfies the configuration requested.
-     * @return A new instance of a DocumentBuilder.
-     */
-
-    public abstract DocumentBuilder newDocumentBuilder()
-            throws ParserConfigurationException;
-
-
-    /**
-     * Specifies that the parser produced by this code will
-     * provide support for XML namespaces. By default the value of this is set
-     * to <code>false</code>
-     *
-     * @param awareness true if the parser produced will provide support
-     *                  for XML namespaces; false otherwise.
-     */
-
-    public void setNamespaceAware(boolean awareness) {
-        this.namespaceAware = awareness;
-    }
-
-    /**
-     * Specifies that the parser produced by this code will
-     * validate documents as they are parsed. By default the value of this
-     * is set to <code>false</code>.
-     *
-     * <p>
-     * Note that "the validation" here means
-     * <a href="http://www.w3.org/TR/REC-xml#proc-types">a validating
-     * parser</a> as defined in the XML recommendation.
-     * In other words, it essentially just controls the DTD validation.
-     * (except the legacy two properties defined in JAXP 1.2.
-     * See <a href="#validationCompatibility">here</a> for more details.)
-     * </p>
-     *
-     * <p>
-     * To use modern schema languages such as W3C XML Schema or
-     * RELAX NG instead of DTD, you can configure your parser to be
-     * a non-validating parser by leaving the {@link #setValidating(boolean)}
-     * method <tt>false</tt>, then use the {@link #setSchema(Schema)}
-     * method to associate a schema to a parser.
-     * </p>
-     *
-     * @param validating true if the parser produced will validate documents
-     *                   as they are parsed; false otherwise.
-     */
-
-    public void setValidating(boolean validating) {
-        this.validating = validating;
-    }
-
-    /**
-     * Specifies that the parsers created by this  factory must eliminate
-     * whitespace in element content (sometimes known loosely as
-     * 'ignorable whitespace') when parsing XML documents (see XML Rec
-     * 2.10). Note that only whitespace which is directly contained within
-     * element content that has an element only content model (see XML
-     * Rec 3.2.1) will be eliminated. Due to reliance on the content model
-     * this setting requires the parser to be in validating mode. By default
-     * the value of this is set to <code>false</code>.
-     *
-     * @param whitespace true if the parser created must eliminate whitespace
-     *                   in the element content when parsing XML documents;
-     *                   false otherwise.
-     */
-
-    public void setIgnoringElementContentWhitespace(boolean whitespace) {
-        this.whitespace = whitespace;
-    }
-
-    /**
-     * Specifies that the parser produced by this code will
-     * expand entity reference nodes. By default the value of this is set to
-     * <code>true</code>
-     *
-     * @param expandEntityRef true if the parser produced will expand entity
-     *                        reference nodes; false otherwise.
-     */
-
-    public void setExpandEntityReferences(boolean expandEntityRef) {
-        this.expandEntityRef = expandEntityRef;
-    }
-
-    /**
-     * <p>Specifies that the parser produced by this code will
-     * ignore comments. By default the value of this is set to <code>false
-     * </code>.</p>
-     *
-     * @param ignoreComments <code>boolean</code> value to ignore comments during processing
-     */
-
-    public void setIgnoringComments(boolean ignoreComments) {
-        this.ignoreComments = ignoreComments;
-    }
-
-    /**
-     * Specifies that the parser produced by this code will
-     * convert CDATA nodes to Text nodes and append it to the
-     * adjacent (if any) text node. By default the value of this is set to
-     * <code>false</code>
-     *
-     * @param coalescing  true if the parser produced will convert CDATA nodes
-     *                    to Text nodes and append it to the adjacent (if any)
-     *                    text node; false otherwise.
-     */
-
-    public void setCoalescing(boolean coalescing) {
-        this.coalescing = coalescing;
-    }
-
-    /**
-     * Indicates whether or not the factory is configured to produce
-     * parsers which are namespace aware.
-     *
-     * @return  true if the factory is configured to produce parsers which
-     *          are namespace aware; false otherwise.
-     */
-
-    public boolean isNamespaceAware() {
-        return namespaceAware;
-    }
-
-    /**
-     * Indicates whether or not the factory is configured to produce
-     * parsers which validate the XML content during parse.
-     *
-     * @return  true if the factory is configured to produce parsers
-     *          which validate the XML content during parse; false otherwise.
-     */
-
-    public boolean isValidating() {
-        return validating;
-    }
-
-    /**
-     * Indicates whether or not the factory is configured to produce
-     * parsers which ignore ignorable whitespace in element content.
-     *
-     * @return  true if the factory is configured to produce parsers
-     *          which ignore ignorable whitespace in element content;
-     *          false otherwise.
-     */
-
-    public boolean isIgnoringElementContentWhitespace() {
-        return whitespace;
-    }
-
-    /**
-     * Indicates whether or not the factory is configured to produce
-     * parsers which expand entity reference nodes.
-     *
-     * @return  true if the factory is configured to produce parsers
-     *          which expand entity reference nodes; false otherwise.
-     */
-
-    public boolean isExpandEntityReferences() {
-        return expandEntityRef;
-    }
-
-    /**
-     * Indicates whether or not the factory is configured to produce
-     * parsers which ignores comments.
-     *
-     * @return  true if the factory is configured to produce parsers
-     *          which ignores comments; false otherwise.
-     */
-
-    public boolean isIgnoringComments() {
-        return ignoreComments;
-    }
-
-    /**
-     * Indicates whether or not the factory is configured to produce
-     * parsers which converts CDATA nodes to Text nodes and appends it to
-     * the adjacent (if any) Text node.
-     *
-     * @return  true if the factory is configured to produce parsers
-     *          which converts CDATA nodes to Text nodes and appends it to
-     *          the adjacent (if any) Text node; false otherwise.
-     */
-
-    public boolean isCoalescing() {
-        return coalescing;
-    }
-
-    /**
-     * Allows the user to set specific attributes on the underlying
-     * implementation.
-     * @param name The name of the attribute.
-     * @param value The value of the attribute.
-     * @exception IllegalArgumentException thrown if the underlying
-     * implementation doesn't recognize the attribute.
-     */
-    public abstract void setAttribute(String name, Object value)
-            throws IllegalArgumentException;
-
-    /**
-     * Allows the user to retrieve specific attributes on the underlying
-     * implementation.
-     * @param name The name of the attribute.
-     * @return value The value of the attribute.
-     * @exception IllegalArgumentException thrown if the underlying
-     * implementation doesn't recognize the attribute.
-     */
-    public abstract Object getAttribute(String name)
-            throws IllegalArgumentException;
-
-    /**
-     * <p>Set a feature for this <code>DocumentBuilderFactory</code> and <code>DocumentBuilder</code>s created by this factory.</p>
-     *
-     * <p>
-     * Feature names are fully qualified {@link java.net.URI}s.
-     * Implementations may define their own features.
-     * An {@link ParserConfigurationException} is thrown if this <code>DocumentBuilderFactory</code> or the
-     * <code>DocumentBuilder</code>s it creates cannot support the feature.
-     * It is possible for an <code>DocumentBuilderFactory</code> to expose a feature value but be unable to change its state.
-     * </p>
-     *
-     * <p>
-     * All implementations are required to support the {@link javax.xml.XMLConstants#FEATURE_SECURE_PROCESSING} feature.
-     * When the feature is:</p>
-     * <ul>
-     *   <li>
-     *     <code>true</code>: the implementation will limit XML processing to conform to implementation limits.
-     *     Examples include entity expansion limits and XML Schema constructs that would consume large amounts of resources.
-     *     If XML processing is limited for security reasons, it will be reported via a call to the registered
-     *    {@link org.xml.sax.ErrorHandler#fatalError(SAXParseException exception)}.
-     *     See {@link  DocumentBuilder#setErrorHandler(org.xml.sax.ErrorHandler errorHandler)}.
-     *   </li>
-     *   <li>
-     *     <code>false</code>: the implementation will processing XML according to the XML specifications without
-     *     regard to possible implementation limits.
-     *   </li>
-     * </ul>
-     *
-     * @param name Feature name.
-     * @param value Is feature state <code>true</code> or <code>false</code>.
-     *
-     * @throws ParserConfigurationException if this <code>DocumentBuilderFactory</code> or the <code>DocumentBuilder</code>s
-     *   it creates cannot support this feature.
-     * @throws NullPointerException If the <code>name</code> parameter is null.
-     */
-    public abstract void setFeature(String name, boolean value)
-            throws ParserConfigurationException;
-
-    /**
-     * <p>Get the state of the named feature.</p>
-     *
-     * <p>
-     * Feature names are fully qualified {@link java.net.URI}s.
-     * Implementations may define their own features.
-     * An {@link ParserConfigurationException} is thrown if this <code>DocumentBuilderFactory</code> or the
-     * <code>DocumentBuilder</code>s it creates cannot support the feature.
-     * It is possible for an <code>DocumentBuilderFactory</code> to expose a feature value but be unable to change its state.
-     * </p>
-     *
-     * @param name Feature name.
-     *
-     * @return State of the named feature.
-     *
-     * @throws ParserConfigurationException if this <code>DocumentBuilderFactory</code>
-     *   or the <code>DocumentBuilder</code>s it creates cannot support this feature.
-     */
-    public abstract boolean getFeature(String name)
-            throws ParserConfigurationException;
-
-    /**
-     * Gets the {@link Schema} object specified through
-     * the {@link #setSchema(Schema schema)} method.
-     *
-     *
-     * @throws UnsupportedOperationException
-     *      For backward compatibility, when implementations for
-     *      earlier versions of JAXP is used, this exception will be
-     *      thrown.
-     *
-     * @return
-     *      the {@link Schema} object that was last set through
-     *      the {@link #setSchema(Schema)} method, or null
-     *      if the method was not invoked since a {@link DocumentBuilderFactory}
-     *      is created.
-     *
-     * @since 1.5
-     */
-    public Schema getSchema() {
-        throw new UnsupportedOperationException(
-                "This parser does not support specification \""
-                        + this.getClass().getPackage().getSpecificationTitle()
-                        + "\" version \""
-                        + this.getClass().getPackage().getSpecificationVersion()
-                        + "\""
-        );
-
-    }
-
-    /**
-     * <p>Set the {@link Schema} to be used by parsers created
-     * from this factory.
-     *
-     * <p>
-     * When a {@link Schema} is non-null, a parser will use a validator
-     * created from it to validate documents before it passes information
-     * down to the application.
-     *
-     * <p>When errors are found by the validator, the parser is responsible
-     * to report them to the user-specified {@link org.xml.sax.ErrorHandler}
-     * (or if the error handler is not set, ignore them or throw them), just
-     * like any other errors found by the parser itself.
-     * In other words, if the user-specified {@link org.xml.sax.ErrorHandler}
-     * is set, it must receive those errors, and if not, they must be
-     * treated according to the implementation specific
-     * default error handling rules.
-     *
-     * <p>
-     * A validator may modify the outcome of a parse (for example by
-     * adding default values that were missing in documents), and a parser
-     * is responsible to make sure that the application will receive
-     * modified DOM trees.  
-     *
-     * <p>
-     * Initially, null is set as the {@link Schema}. 
-     *
-     * <p>
-     * This processing will take effect even if
-     * the {@link #isValidating()} method returns <tt>false</tt>.
-     *
-     * <p>It is an error to use
-     * the <code>http://java.sun.com/xml/jaxp/properties/schemaSource</code>
-     * property and/or the <code>http://java.sun.com/xml/jaxp/properties/schemaLanguage</code>
-     * property in conjunction with a {@link Schema} object.
-     * Such configuration will cause a {@link ParserConfigurationException}
-     * exception when the {@link #newDocumentBuilder()} is invoked.</p>
-     *
-     *
-     * <h4>Note for implementors</h4>
-     * <p>
-     * A parser must be able to work with any {@link Schema}
-     * implementation. However, parsers and schemas are allowed
-     * to use implementation-specific custom mechanisms
-     * as long as they yield the result described in the specification.
-     *
-     * @param schema <code>Schema</code> to use or <code>null</code> to remove a schema.
-     *
-     * @throws UnsupportedOperationException
-     *      For backward compatibility, when implementations for
-     *      earlier versions of JAXP is used, this exception will be
-     *      thrown.
-     *
-     * @since 1.5
-     */
-    public void setSchema(Schema schema) {
-        throw new UnsupportedOperationException(
-                "This parser does not support specification \""
-                        + this.getClass().getPackage().getSpecificationTitle()
-                        + "\" version \""
-                        + this.getClass().getPackage().getSpecificationVersion()
-                        + "\""
-        );
-    }
-
-    /**
-     * <p>Set state of XInclude processing.</p>
-     *
-     * <p>If XInclude markup is found in the document instance, should it be
-     * processed as specified in <a href="http://www.w3.org/TR/xinclude/">
-     * XML Inclusions (XInclude) Version 1.0</a>.</p>
-     *
-     * <p>XInclude processing defaults to <code>false</code>.</p>
-     *
-     * @param state Set XInclude processing to <code>true</code> or
-     *   <code>false</code>
-     *
-     * @throws UnsupportedOperationException
-     *      For backward compatibility, when implementations for
-     *      earlier versions of JAXP is used, this exception will be
-     *      thrown.
-     *
-     * @since 1.5
-     */
-    public void setXIncludeAware(final boolean state) {
-        throw new UnsupportedOperationException(
-                "This parser does not support specification \""
-                        + this.getClass().getPackage().getSpecificationTitle()
-                        + "\" version \""
-                        + this.getClass().getPackage().getSpecificationVersion()
-                        + "\""
-        );
-    }
-
-    /**
-     * <p>Get state of XInclude processing.</p>
-     *
-     * @return current state of XInclude processing
-     *
-     * @throws UnsupportedOperationException
-     *      For backward compatibility, when implementations for
-     *      earlier versions of JAXP is used, this exception will be
-     *      thrown.
-     *
-     * @since 1.5
-     */
-    public boolean isXIncludeAware() {
-        throw new UnsupportedOperationException(
-                "This parser does not support specification \""
-                        + this.getClass().getPackage().getSpecificationTitle()
-                        + "\" version \""
-                        + this.getClass().getPackage().getSpecificationVersion()
-                        + "\""
-        );
-    }
-}
diff --git a/trunk/jaxp-api-1.4/src/main/java/javax/xml/parsers/FactoryFinder.java b/trunk/jaxp-api-1.4/src/main/java/javax/xml/parsers/FactoryFinder.java
deleted file mode 100644
index b74d48d..0000000
--- a/trunk/jaxp-api-1.4/src/main/java/javax/xml/parsers/FactoryFinder.java
+++ /dev/null
@@ -1,339 +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.
- */
-
-// $Id: FactoryFinder.java 446598 2006-09-15 12:55:40Z jeremias $
-
-package javax.xml.parsers;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.Properties;
-
-/**
- * This class is duplicated for each JAXP subpackage so keep it in
- * sync.  It is package private.
- *
- * This code is designed to implement the JAXP 1.1 spec pluggability
- * feature and is designed to run on JDK version 1.1 and later including
- * JVMs that perform early linking like the Microsoft JVM in IE 5.  Note
- * however that it must be compiled on a JDK version 1.2 or later system
- * since it calls Thread#getContextClassLoader().  The code also runs both
- * as part of an unbundled jar file and when bundled as part of the JDK.
- */
-final class FactoryFinder {
-    
-    /** Temp debug code - this will be removed after we test everything
-     */
-    private static boolean debug = false;
-    static Properties cacheProps= new Properties();
-    static boolean firstTime = true;
-    
-    /**
-     * Default columns per line.
-     */
-    private static final int DEFAULT_LINE_LENGTH = 80;
-
-    // Define system property "jaxp.debug" to get output
-    static {
-        // Use try/catch block to support applets, which throws
-        // SecurityException out of this code.
-        try {
-            String val = SecuritySupport.getSystemProperty("jaxp.debug");
-            // Allow simply setting the prop to turn on debug
-            debug = val != null && (! "false".equals(val));
-        } catch (SecurityException se) {
-            debug = false;
-        }
-    }
-    
-    private FactoryFinder() {}
-
-    private static void dPrint(String msg) {
-        if (debug) {
-            System.err.println("JAXP: " + msg);
-        }
-    }
-    
-    /**
-     * Create an instance of a class using the specified ClassLoader and
-     * optionally fall back to the current ClassLoader if not found.
-     *
-     * @param className Name of the concrete class corresponding to the
-     * service provider
-     *
-     * @param cl ClassLoader to use to load the class, null means to use
-     * the bootstrap ClassLoader
-     *
-     * @param doFallback true if the current ClassLoader should be tried as
-     * a fallback if the class is not found using cl
-     */
-    static Object newInstance(String className, ClassLoader cl,
-                                      boolean doFallback)
-        throws ConfigurationError
-    {
-        // assert(className != null);
-
-        try {
-            Class providerClass;
-            if (cl == null) {
-                // If classloader is null Use the bootstrap ClassLoader.  
-                // Thus Class.forName(String) will use the current
-                // ClassLoader which will be the bootstrap ClassLoader.
-                providerClass = Class.forName(className);
-            } else {
-                try {
-                    providerClass = cl.loadClass(className);
-                } catch (ClassNotFoundException x) {
-                    if (doFallback) {
-                        // Fall back to current classloader
-                        cl = FactoryFinder.class.getClassLoader();
-                        if (cl != null) {
-                            providerClass = cl.loadClass(className);
-                        }
-                        else {
-                            providerClass = Class.forName(className);
-                        }
-                    } else {
-                        throw x;
-                    }
-                }
-            }
-                        
-            Object instance = providerClass.newInstance();
-            if (debug) dPrint("created new instance of " + providerClass +
-                   " using ClassLoader: " + cl);
-            return instance;
-        } catch (ClassNotFoundException x) {
-            throw new ConfigurationError(
-                "Provider " + className + " not found", x);
-        } catch (Exception x) {
-            throw new ConfigurationError(
-                "Provider " + className + " could not be instantiated: " + x,
-                x);
-        }
-    }
-    
-    /**
-     * Finds the implementation Class object in the specified order.  Main
-     * entry point.
-     * @return Class object of factory, never null
-     *
-     * @param factoryId             Name of the factory to find, same as
-     *                              a property name
-     * @param fallbackClassName     Implementation class name, if nothing else
-     *                              is found.  Use null to mean no fallback.
-     *
-     * Package private so this code can be shared.
-     */
-    static Object find(String factoryId, String fallbackClassName)
-        throws ConfigurationError
-    {        
-
-        // Figure out which ClassLoader to use for loading the provider
-        // class.  If there is a Context ClassLoader then use it.
-        
-        ClassLoader classLoader = SecuritySupport.getContextClassLoader();
-        
-        if (classLoader == null) {
-            // if we have no Context ClassLoader
-            // so use the current ClassLoader
-            classLoader = FactoryFinder.class.getClassLoader();
-        }
-
-        if (debug) dPrint("find factoryId =" + factoryId);
-        
-        try {
-            // If we are deployed into an OSGi environment, leverage it
-            Class factoryClass = FactoryFinder.class.getClassLoader().loadClass(factoryId);
-            Class spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(factoryClass, factoryId);
-            if (spiClass != null) {
-                return spiClass.newInstance();
-            }
-        } catch (Throwable e) {
-        }
-
-        // Use the system property first
-        try {
-            String systemProp = SecuritySupport.getSystemProperty(factoryId);
-            if( systemProp!=null) {                
-                if (debug) dPrint("found system property, value=" + systemProp);
-                return newInstance(systemProp, classLoader, true );
-            }
-        } catch (SecurityException se) {
-            //if first option fails due to any reason we should try next option in the
-            //look up algorithm.
-        }
-
-        // try to read from $java.home/lib/jaxp.properties
-        try {
-            String javah = SecuritySupport.getSystemProperty("java.home");
-            String configFile = javah + File.separator +
-                "lib" + File.separator + "jaxp.properties";
-            String factoryClassName = null;
-            if(firstTime){
-                synchronized(cacheProps){
-                    if(firstTime){
-                        File f=new File( configFile );
-                        firstTime = false;
-                        if(SecuritySupport.doesFileExist(f)){
-                            if (debug) dPrint("Read properties file "+f);
-                            //cacheProps.load( new FileInputStream(f));
-                            cacheProps.load(SecuritySupport.getFileInputStream(f));
-                        }
-                    }
-                }
-            }
-            factoryClassName = cacheProps.getProperty(factoryId);            
-
-            if(factoryClassName != null){
-                if (debug) dPrint("found in $java.home/jaxp.properties, value=" + factoryClassName);
-                return newInstance(factoryClassName, classLoader, true);
-            }
-        } catch(Exception ex ) {
-            if( debug ) ex.printStackTrace();
-        }
-
-        // Try Jar Service Provider Mechanism
-        Object provider = findJarServiceProvider(factoryId);
-        if (provider != null) {
-            return provider;
-        }
-        if (fallbackClassName == null) {
-            throw new ConfigurationError(
-                "Provider for " + factoryId + " cannot be found", null);
-        }
-
-        if (debug) dPrint("loaded from fallback value: " + fallbackClassName);
-        return newInstance(fallbackClassName, classLoader, true);
-    }
-    
-    /*
-     * Try to find provider using Jar Service Provider Mechanism
-     *
-     * @return instance of provider class if found or null
-     */
-    private static Object findJarServiceProvider(String factoryId)
-        throws ConfigurationError
-    {
-
-        String serviceId = "META-INF/services/" + factoryId;
-        InputStream is = null;
-
-        // First try the Context ClassLoader
-        ClassLoader cl = SecuritySupport.getContextClassLoader();
-        if (cl != null) {
-            is = SecuritySupport.getResourceAsStream(cl, serviceId);
-
-            // If no provider found then try the current ClassLoader
-            if (is == null) {
-                cl = FactoryFinder.class.getClassLoader();
-                is = SecuritySupport.getResourceAsStream(cl, serviceId);
-            }
-        } else {
-            // No Context ClassLoader, try the current
-            // ClassLoader
-            cl = FactoryFinder.class.getClassLoader();
-            is = SecuritySupport.getResourceAsStream(cl, serviceId);
-        }
-
-        if (is == null) {
-            // No provider found
-            return null;
-        }
-
-        if (debug) dPrint("found jar resource=" + serviceId +
-               " using ClassLoader: " + cl);
-
-        // Read the service provider name in UTF-8 as specified in
-        // the jar spec.  Unfortunately this fails in Microsoft
-        // VJ++, which does not implement the UTF-8
-        // encoding. Theoretically, we should simply let it fail in
-        // that case, since the JVM is obviously broken if it
-        // doesn't support such a basic standard.  But since there
-        // are still some users attempting to use VJ++ for
-        // development, we have dropped in a fallback which makes a
-        // second attempt using the platform's default encoding. In
-        // VJ++ this is apparently ASCII, which is a subset of
-        // UTF-8... and since the strings we'll be reading here are
-        // also primarily limited to the 7-bit ASCII range (at
-        // least, in English versions), this should work well
-        // enough to keep us on the air until we're ready to
-        // officially decommit from VJ++. [Edited comment from
-        // jkesselm]
-        BufferedReader rd;
-        try {
-            rd = new BufferedReader(new InputStreamReader(is, "UTF-8"), DEFAULT_LINE_LENGTH);
-        } catch (java.io.UnsupportedEncodingException e) {
-            rd = new BufferedReader(new InputStreamReader(is), DEFAULT_LINE_LENGTH);
-        }
-        
-        String factoryClassName = null;
-        try {
-            // XXX Does not handle all possible input as specified by the
-            // Jar Service Provider specification
-            factoryClassName = rd.readLine();
-        } 
-        catch (IOException x) {
-            // No provider found
-            return null;
-        }
-        finally {
-            try { 
-                // try to close the reader. 
-                rd.close(); 
-            } 
-            // Ignore the exception. 
-            catch (IOException exc) {}
-        }
-
-        if (factoryClassName != null &&
-            ! "".equals(factoryClassName)) {
-            if (debug) dPrint("found in resource, value="
-                   + factoryClassName);
-
-        // Note: here we do not want to fall back to the current
-        // ClassLoader because we want to avoid the case where the
-        // resource file was found using one ClassLoader and the
-        // provider class was instantiated using a different one.
-        return newInstance(factoryClassName, cl, false);
-        }
-
-        // No provider found
-        return null;
-    }
-
-    static class ConfigurationError extends Error {
-        private Exception exception;
-
-        /**
-         * Construct a new instance with the specified detail string and
-         * exception.
-         */
-        ConfigurationError(String msg, Exception x) {
-            super(msg);
-            this.exception = x;
-        }
-
-        Exception getException() {
-            return exception;
-        }
-    }
-
-}
diff --git a/trunk/jaxp-api-1.4/src/main/java/javax/xml/parsers/SAXParserFactory.java b/trunk/jaxp-api-1.4/src/main/java/javax/xml/parsers/SAXParserFactory.java
deleted file mode 100644
index e088a70..0000000
--- a/trunk/jaxp-api-1.4/src/main/java/javax/xml/parsers/SAXParserFactory.java
+++ /dev/null
@@ -1,428 +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.
- */
-
-// $Id: SAXParserFactory.java 884950 2009-11-27 18:46:18Z mrglavas $
-
-package javax.xml.parsers;
-
-import javax.xml.validation.Schema;
-
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXNotRecognizedException;
-import org.xml.sax.SAXNotSupportedException;
-
-/**
- * Defines a factory API that enables applications to configure and
- * obtain a SAX based parser to parse XML documents.
- *
- * @author <a href="Jeff.Suttor@Sun.com">Jeff Suttor</a>
- * @version $Revision: 884950 $, $Date: 2009-11-27 13:46:18 -0500 (Fri, 27 Nov 2009) $
- */
-public abstract class SAXParserFactory {
-
-    /**
-     * <p>Should Parsers be validating?</p>
-     */
-    private boolean validating = false;
-
-    /**
-     * <p>Should Parsers be namespace aware?</p>
-     */
-    private boolean namespaceAware = false;
-
-    /**
-     * <p>Protected constructor to force use of {@link #newInstance()}.</p>
-     */
-    protected SAXParserFactory () {
-
-    }
-
-    /**
-     * Obtain a new instance of a <code>SAXParserFactory</code>. This
-     * static method creates a new factory instance
-     * This method uses the following ordered lookup procedure to determine
-     * the <code>SAXParserFactory</code> implementation class to
-     * load:
-     * <ul>
-     * <li>
-     * Use the <code>javax.xml.parsers.SAXParserFactory</code> system
-     * property.
-     * </li>
-     * <li>
-     * Use the properties file "lib/jaxp.properties" in the JRE directory.
-     * This configuration file is in standard <code>java.util.Properties
-     * </code> format and contains the fully qualified name of the
-     * implementation class with the key being the system property defined
-     * above.
-     *
-     * The jaxp.properties file is read only once by the JAXP implementation
-     * and it's values are then cached for future use.  If the file does not exist
-     * when the first attempt is made to read from it, no further attempts are
-     * made to check for its existence.  It is not possible to change the value
-     * of any property in jaxp.properties after it has been read for the first time.
-     * </li>
-     * <li>
-     * Use the Services API (as detailed in the JAR specification), if
-     * available, to determine the classname. The Services API will look
-     * for a classname in the file
-     * <code>META-INF/services/javax.xml.parsers.SAXParserFactory</code>
-     * in jars available to the runtime.
-     * </li>
-     * <li>
-     * Platform default <code>SAXParserFactory</code> instance.
-     * </li>
-     * </ul>
-     *
-     * Once an application has obtained a reference to a
-     * <code>SAXParserFactory</code> it can use the factory to
-     * configure and obtain parser instances.
-     *
-     *
-     *
-     * <h2>Tip for Trouble-shooting</h2>
-     * <p>Setting the <code>jaxp.debug</code> system property will cause
-     * this method to print a lot of debug messages
-     * to <tt>System.err</tt> about what it is doing and where it is looking at.</p>
-     *
-     * <p> If you have problems loading {@link SAXParser}s, try:</p>
-     * <pre>
-     * java -Djaxp.debug=1 YourProgram ....
-     * </pre>
-     *
-     *
-     * @return A new instance of a SAXParserFactory.
-     *
-     * @exception FactoryConfigurationError if the implementation is
-     * not available or cannot be instantiated.
-     */
-
-    public static SAXParserFactory newInstance() {
-        try {
-            return (SAXParserFactory) FactoryFinder.find(
-                    /* The default property name according to the JAXP spec */
-                    "javax.xml.parsers.SAXParserFactory",
-                    /* The fallback implementation class name */
-                    "com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl");
-        }
-        catch (FactoryFinder.ConfigurationError e) {
-            throw new FactoryConfigurationError(e.getException(), e.getMessage());
-        }
-    }
-
-    /**
-     * @return A new instance of a SAXParserFactory.
-     *
-     * @exception FactoryConfigurationError if the implementation is
-     * not available or cannot be instantiated.
-     */
-    public static SAXParserFactory newInstance(String factoryClassName,
-                                               ClassLoader classLoader) {
-        if (factoryClassName == null) {
-            throw new FactoryConfigurationError("factoryClassName cannot be null.");
-        }
-        if (classLoader == null) {
-            classLoader = SecuritySupport.getContextClassLoader();
-        }
-        try {
-            return (SAXParserFactory) FactoryFinder.newInstance(factoryClassName, classLoader, false);
-        }
-        catch (FactoryFinder.ConfigurationError e) {
-            throw new FactoryConfigurationError(e.getException(), e.getMessage());
-        }
-    }
-
-    /**
-     * <p>Creates a new instance of a SAXParser using the currently
-     * configured factory parameters.</p>
-     *
-     * @return A new instance of a SAXParser.
-     *
-     * @exception ParserConfigurationException if a parser cannot
-     *   be created which satisfies the requested configuration.
-     * @exception SAXException for SAX errors.
-     */
-
-    public abstract SAXParser newSAXParser()
-            throws ParserConfigurationException, SAXException;
-
-
-    /**
-     * Specifies that the parser produced by this code will
-     * provide support for XML namespaces. By default the value of this is set
-     * to <code>false</code>.
-     *
-     * @param awareness true if the parser produced by this code will
-     *                  provide support for XML namespaces; false otherwise.
-     */
-
-    public void setNamespaceAware(boolean awareness) {
-        this.namespaceAware = awareness;
-    }
-
-    /**
-     * Specifies that the parser produced by this code will
-     * validate documents as they are parsed. By default the value of this is
-     * set to <code>false</code>.
-     *
-     * <p>
-     * Note that "the validation" here means
-     * <a href="http://www.w3.org/TR/REC-xml#proc-types">a validating
-     * parser</a> as defined in the XML recommendation.
-     * In other words, it essentially just controls the DTD validation.
-     * (except the legacy two properties defined in JAXP 1.2.
-     * See <a href="#validationCompatibility">here</a> for more details.)
-     * </p>
-     *
-     * <p>
-     * To use modern schema languages such as W3C XML Schema or
-     * RELAX NG instead of DTD, you can configure your parser to be
-     * a non-validating parser by leaving the {@link #setValidating(boolean)}
-     * method <tt>false</tt>, then use the {@link #setSchema(Schema)}
-     * method to associate a schema to a parser.
-     * </p>
-     *
-     * @param validating true if the parser produced by this code will
-     *                   validate documents as they are parsed; false otherwise.
-     */
-
-    public void setValidating(boolean validating) {
-        this.validating = validating;
-    }
-
-    /**
-     * Indicates whether or not the factory is configured to produce
-     * parsers which are namespace aware.
-     *
-     * @return true if the factory is configured to produce
-     *         parsers which are namespace aware; false otherwise.
-     */
-
-    public boolean isNamespaceAware() {
-        return namespaceAware;
-    }
-
-    /**
-     * Indicates whether or not the factory is configured to produce
-     * parsers which validate the XML content during parse.
-     *
-     * @return true if the factory is configured to produce parsers which validate
-     *         the XML content during parse; false otherwise.
-     */
-
-    public boolean isValidating() {
-        return validating;
-    }
-
-    /**
-     *
-     * <p>Sets the particular feature in the underlying implementation of
-     * org.xml.sax.XMLReader.
-     * A list of the core features and properties can be found at
-     * <a href="http://www.saxproject.org/">http://www.saxproject.org/</a></p>
-     *
-     * <p>All implementations are required to support the {@link javax.xml.XMLConstants#FEATURE_SECURE_PROCESSING} feature.
-     * When the feature is</p>
-     * <ul>
-     *   <li>
-     *     <code>true</code>: the implementation will limit XML processing to conform to implementation limits.
-     *     Examples include entity expansion limits and XML Schema constructs that would consume large amounts of resources.
-     *     If XML processing is limited for security reasons, it will be reported via a call to the registered
-     *     {@link org.xml.sax.ErrorHandler#fatalError(SAXParseException exception)}.
-     *     See {@link SAXParser} <code>parse</code> methods for handler specification.
-     *   </li>
-     *   <li>
-     *     When the feature is <code>false</code>, the implementation will processing XML according to the XML specifications without
-     *     regard to possible implementation limits.
-     *   </li>
-     * </ul>
-     *
-     * @param name The name of the feature to be set.
-     * @param value The value of the feature to be set.
-     *
-     * @exception ParserConfigurationException if a parser cannot
-     *     be created which satisfies the requested configuration.
-     * @exception SAXNotRecognizedException When the underlying XMLReader does
-     *            not recognize the property name.
-     * @exception SAXNotSupportedException When the underlying XMLReader
-     *            recognizes the property name but doesn't support the
-     *            property.
-     * @throws NullPointerException If the <code>name</code> parameter is null.
-     *
-     * @see org.xml.sax.XMLReader#setFeature
-     */
-    public abstract void setFeature(String name, boolean value)
-            throws ParserConfigurationException, SAXNotRecognizedException,
-            SAXNotSupportedException;
-
-    /**
-     *
-     * <p>Returns the particular property requested for in the underlying
-     * implementation of org.xml.sax.XMLReader.</p>
-     *
-     * @param name The name of the property to be retrieved.
-     *
-     * @return Value of the requested property.
-     *
-     * @exception ParserConfigurationException if a parser cannot be created which satisfies the requested configuration.
-     * @exception SAXNotRecognizedException When the underlying XMLReader does not recognize the property name.
-     * @exception SAXNotSupportedException When the underlying XMLReader recognizes the property name but doesn't support the property.
-     *
-     * @see org.xml.sax.XMLReader#getProperty
-     */
-    public abstract boolean getFeature(String name)
-            throws ParserConfigurationException, SAXNotRecognizedException,
-            SAXNotSupportedException;
-
-    /**
-     * Gets the {@link Schema} object specified through
-     * the {@link #setSchema(Schema schema)} method.
-     *
-     *
-     * @throws UnsupportedOperationException
-     *      For backward compatibility, when implementations for
-     *      earlier versions of JAXP is used, this exception will be
-     *      thrown.
-     *
-     * @return
-     *      the {@link Schema} object that was last set through
-     *      the {@link #setSchema(Schema)} method, or null
-     *      if the method was not invoked since a {@link SAXParserFactory}
-     *      is created.
-     *
-     * @since 1.5
-     */
-    public Schema getSchema() {
-        throw new UnsupportedOperationException(
-                "This parser does not support specification \""
-                        + this.getClass().getPackage().getSpecificationTitle()
-                        + "\" version \""
-                        + this.getClass().getPackage().getSpecificationVersion()
-                        + "\""
-        );
-    }
-
-    /**
-     * <p>Set the {@link Schema} to be used by parsers created
-     * from this factory.</p>
-     *
-     * <p>When a {@link Schema} is non-null, a parser will use a validator
-     * created from it to validate documents before it passes information
-     * down to the application.</p>
-     *
-     * <p>When warnings/errors/fatal errors are found by the validator, the parser must
-     * handle them as if those errors were found by the parser itself. 
-     * In other words, if the user-specified {@link org.xml.sax.ErrorHandler}
-     * is set, it must receive those errors, and if not, they must be
-     * treated according to the implementation specific
-     * default error handling rules.
-     *
-     * <p>A validator may modify the SAX event stream (for example by
-     * adding default values that were missing in documents), and a parser
-     * is responsible to make sure that the application will receive
-     * those modified event stream.</p>  
-     *
-     * <p>Initially, <code>null</code> is set as the {@link Schema}.</p> 
-     *
-     * <p>This processing will take effect even if
-     * the {@link #isValidating()} method returns <code>false</code>.
-     *
-     * <p>It is an error to use
-     * the <code>http://java.sun.com/xml/jaxp/properties/schemaSource</code>
-     * property and/or the <code>http://java.sun.com/xml/jaxp/properties/schemaLanguage</code>
-     * property in conjunction with a non-null {@link Schema} object.
-     * Such configuration will cause a {@link SAXException}
-     * exception when those properties are set on a {@link SAXParser}.</p>
-     *
-     * <h4>Note for implementors</h4>
-     * <p>
-     * A parser must be able to work with any {@link Schema}
-     * implementation. However, parsers and schemas are allowed
-     * to use implementation-specific custom mechanisms
-     * as long as they yield the result described in the specification.
-     * </p>
-     *
-     * @param schema <code>Schema</code> to use, <code>null</code> to remove a schema.
-     *
-     * @throws UnsupportedOperationException
-     *      For backward compatibility, when implementations for
-     *      earlier versions of JAXP is used, this exception will be
-     *      thrown.
-     *
-     * @since 1.5
-     */
-    public void setSchema(Schema schema) {
-        throw new UnsupportedOperationException(
-                "This parser does not support specification \""
-                        + this.getClass().getPackage().getSpecificationTitle()
-                        + "\" version \""
-                        + this.getClass().getPackage().getSpecificationVersion()
-                        + "\""
-        );
-    }
-
-    /**
-     * <p>Set state of XInclude processing.</p>
-     *
-     * <p>If XInclude markup is found in the document instance, should it be
-     * processed as specified in <a href="http://www.w3.org/TR/xinclude/">
-     * XML Inclusions (XInclude) Version 1.0</a>.</p>
-     *
-     * <p>XInclude processing defaults to <code>false</code>.</p>
-     *
-     * @param state Set XInclude processing to <code>true</code> or
-     *   <code>false</code>
-     *
-     * @throws UnsupportedOperationException
-     *      For backward compatibility, when implementations for
-     *      earlier versions of JAXP is used, this exception will be
-     *      thrown.
-     *
-     * @since 1.5
-     */
-    public void setXIncludeAware(final boolean state) {
-        throw new UnsupportedOperationException(
-                "This parser does not support specification \""
-                        + this.getClass().getPackage().getSpecificationTitle()
-                        + "\" version \""
-                        + this.getClass().getPackage().getSpecificationVersion()
-                        + "\""
-        );
-    }
-
-    /**
-     * <p>Get state of XInclude processing.</p>
-     *
-     * @return current state of XInclude processing
-     *
-     * @throws UnsupportedOperationException
-     *      For backward compatibility, when implementations for
-     *      earlier versions of JAXP is used, this exception will be
-     *      thrown.
-     *
-     * @since 1.5
-     */
-    public boolean isXIncludeAware() {
-        throw new UnsupportedOperationException(
-                "This parser does not support specification \""
-                        + this.getClass().getPackage().getSpecificationTitle()
-                        + "\" version \""
-                        + this.getClass().getPackage().getSpecificationVersion()
-                        + "\""
-        );
-    }
-}
-
diff --git a/trunk/jaxp-api-1.4/src/main/java/javax/xml/parsers/SecuritySupport.java b/trunk/jaxp-api-1.4/src/main/java/javax/xml/parsers/SecuritySupport.java
deleted file mode 100644
index ca5dc14..0000000
--- a/trunk/jaxp-api-1.4/src/main/java/javax/xml/parsers/SecuritySupport.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.
- */
-
-// $Id: SecuritySupport.java,v 1.2.24.1 2005/03/29 23:25:08 jsuttor Exp $
-
-package javax.xml.parsers;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.InputStream;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-
-/**
- * This class is duplicated for each JAXP subpackage so keep it in sync.
- * It is package private and therefore is not exposed as part of the JAXP
- * API.
- *
- * Security related methods that only work on J2SE 1.2 and newer.
- */
-final class SecuritySupport {
-    
-    private SecuritySupport() {}
-    
-    static ClassLoader getContextClassLoader() {
-	return (ClassLoader)
-		AccessController.doPrivileged(new PrivilegedAction() {
-	    public Object run() {
-		ClassLoader cl = null;
-		try {
-		    cl = Thread.currentThread().getContextClassLoader();
-		} catch (SecurityException ex) { }
-		return cl;
-	    }
-	});
-    }
-
-    static String getSystemProperty(final String propName) {
-	return (String)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    return System.getProperty(propName);
-                }
-            });
-    }
-
-    static FileInputStream getFileInputStream(final File file)
-        throws FileNotFoundException
-    {
-	try {
-            return (FileInputStream)
-                AccessController.doPrivileged(new PrivilegedExceptionAction() {
-                    public Object run() throws FileNotFoundException {
-                        return new FileInputStream(file);
-                    }
-                });
-	} catch (PrivilegedActionException e) {
-	    throw (FileNotFoundException)e.getException();
-	}
-    }
-
-    static InputStream getResourceAsStream(final ClassLoader cl,
-                                           final String name)
-    {
-        return (InputStream)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    InputStream ris;
-                    if (cl == null) {
-                        ris = ClassLoader.getSystemResourceAsStream(name);
-                    } else {
-                        ris = cl.getResourceAsStream(name);
-                    }
-                    return ris;
-                }
-            });
-    }
-
-    static boolean doesFileExist(final File f) {
-    return ((Boolean)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    return f.exists() ? Boolean.TRUE : Boolean.FALSE;
-                }
-            })).booleanValue();
-    }
-
-}
diff --git a/trunk/jaxp-api-1.4/src/main/java/javax/xml/transform/FactoryFinder.java b/trunk/jaxp-api-1.4/src/main/java/javax/xml/transform/FactoryFinder.java
deleted file mode 100644
index dd938e0..0000000
--- a/trunk/jaxp-api-1.4/src/main/java/javax/xml/transform/FactoryFinder.java
+++ /dev/null
@@ -1,339 +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.
- */
-
-// $Id: FactoryFinder.java 446598 2006-09-15 12:55:40Z jeremias $
-
-package javax.xml.transform;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.Properties;
-
-/**
- * This class is duplicated for each JAXP subpackage so keep it in
- * sync.  It is package private.
- *
- * This code is designed to implement the JAXP 1.1 spec pluggability
- * feature and is designed to run on JDK version 1.1 and later including
- * JVMs that perform early linking like the Microsoft JVM in IE 5.  Note
- * however that it must be compiled on a JDK version 1.2 or later system
- * since it calls Thread#getContextClassLoader().  The code also runs both
- * as part of an unbundled jar file and when bundled as part of the JDK.
- */
-final class FactoryFinder {
-    
-    /** Temp debug code - this will be removed after we test everything
-     */
-    private static boolean debug = false;
-    static Properties cacheProps= new Properties();
-    static boolean firstTime = true;
-    
-    /**
-     * Default columns per line.
-     */
-    private static final int DEFAULT_LINE_LENGTH = 80;
-
-    // Define system property "jaxp.debug" to get output
-    static {
-        // Use try/catch block to support applets, which throws
-        // SecurityException out of this code.
-        try {
-            String val = SecuritySupport.getSystemProperty("jaxp.debug");
-            // Allow simply setting the prop to turn on debug
-            debug = val != null && (! "false".equals(val));
-        } catch (SecurityException se) {
-            debug = false;
-        }
-    }
-    
-    private FactoryFinder() {}
-
-    private static void dPrint(String msg) {
-        if (debug) {
-            System.err.println("JAXP: " + msg);
-        }
-    }
-    
-    /**
-     * Create an instance of a class using the specified ClassLoader and
-     * optionally fall back to the current ClassLoader if not found.
-     *
-     * @param className Name of the concrete class corresponding to the
-     * service provider
-     *
-     * @param cl ClassLoader to use to load the class, null means to use
-     * the bootstrap ClassLoader
-     *
-     * @param doFallback true if the current ClassLoader should be tried as
-     * a fallback if the class is not found using cl
-     */
-    static Object newInstance(String className, ClassLoader cl,
-                                      boolean doFallback)
-        throws ConfigurationError
-    {
-        // assert(className != null);
-
-        try {
-            Class providerClass;
-            if (cl == null) {
-                // If classloader is null Use the bootstrap ClassLoader.  
-                // Thus Class.forName(String) will use the current
-                // ClassLoader which will be the bootstrap ClassLoader.
-                providerClass = Class.forName(className);
-            } else {
-                try {
-                    providerClass = cl.loadClass(className);
-                } catch (ClassNotFoundException x) {
-                    if (doFallback) {
-                        // Fall back to current classloader
-                        cl = FactoryFinder.class.getClassLoader();
-                        if (cl != null) {
-                            providerClass = cl.loadClass(className);
-                        }
-                        else {
-                            providerClass = Class.forName(className);
-                        }
-                    } else {
-                        throw x;
-                    }
-                }
-            }
-                        
-            Object instance = providerClass.newInstance();
-            if (debug) dPrint("created new instance of " + providerClass +
-                   " using ClassLoader: " + cl);
-            return instance;
-        } catch (ClassNotFoundException x) {
-            throw new ConfigurationError(
-                "Provider " + className + " not found", x);
-        } catch (Exception x) {
-            throw new ConfigurationError(
-                "Provider " + className + " could not be instantiated: " + x,
-                x);
-        }
-    }
-    
-    /**
-     * Finds the implementation Class object in the specified order.  Main
-     * entry point.
-     * @return Class object of factory, never null
-     *
-     * @param factoryId             Name of the factory to find, same as
-     *                              a property name
-     * @param fallbackClassName     Implementation class name, if nothing else
-     *                              is found.  Use null to mean no fallback.
-     *
-     * Package private so this code can be shared.
-     */
-    static Object find(String factoryId, String fallbackClassName)
-        throws ConfigurationError
-    {        
-
-        // Figure out which ClassLoader to use for loading the provider
-        // class.  If there is a Context ClassLoader then use it.
-        
-        ClassLoader classLoader = SecuritySupport.getContextClassLoader();
-        
-        if (classLoader == null) {
-            // if we have no Context ClassLoader
-            // so use the current ClassLoader
-            classLoader = FactoryFinder.class.getClassLoader();
-        }
-
-        if (debug) dPrint("find factoryId =" + factoryId);
-        
-        try {
-            // If we are deployed into an OSGi environment, leverage it
-            Class factoryClass = FactoryFinder.class.getClassLoader().loadClass(factoryId);
-            Class spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(factoryClass, factoryId);
-            if (spiClass != null) {
-                return spiClass.newInstance();
-            }
-        } catch (Throwable e) {
-        }
-
-        // Use the system property first
-        try {
-            String systemProp = SecuritySupport.getSystemProperty(factoryId);
-            if( systemProp!=null) {                
-                if (debug) dPrint("found system property, value=" + systemProp);
-                return newInstance(systemProp, classLoader, true );
-            }
-        } catch (SecurityException se) {
-            //if first option fails due to any reason we should try next option in the
-            //look up algorithm.
-        }
-
-        // try to read from $java.home/lib/jaxp.properties
-        try {
-            String javah = SecuritySupport.getSystemProperty("java.home");
-            String configFile = javah + File.separator +
-                "lib" + File.separator + "jaxp.properties";
-            String factoryClassName = null;
-            if(firstTime){
-                synchronized(cacheProps){
-                    if(firstTime){
-                        File f=new File( configFile );
-                        firstTime = false;
-                        if(SecuritySupport.doesFileExist(f)){
-                            if (debug) dPrint("Read properties file "+f);
-                            //cacheProps.load( new FileInputStream(f));
-                            cacheProps.load(SecuritySupport.getFileInputStream(f));
-                        }
-                    }
-                }
-            }
-            factoryClassName = cacheProps.getProperty(factoryId);            
-
-            if(factoryClassName != null){
-                if (debug) dPrint("found in $java.home/jaxp.properties, value=" + factoryClassName);
-                return newInstance(factoryClassName, classLoader, true);
-            }
-        } catch(Exception ex ) {
-            if( debug ) ex.printStackTrace();
-        }
-
-        // Try Jar Service Provider Mechanism
-        Object provider = findJarServiceProvider(factoryId);
-        if (provider != null) {
-            return provider;
-        }
-        if (fallbackClassName == null) {
-            throw new ConfigurationError(
-                "Provider for " + factoryId + " cannot be found", null);
-        }
-
-        if (debug) dPrint("loaded from fallback value: " + fallbackClassName);
-        return newInstance(fallbackClassName, classLoader, true);
-    }
-    
-    /*
-     * Try to find provider using Jar Service Provider Mechanism
-     *
-     * @return instance of provider class if found or null
-     */
-    private static Object findJarServiceProvider(String factoryId)
-        throws ConfigurationError
-    {
-
-        String serviceId = "META-INF/services/" + factoryId;
-        InputStream is = null;
-
-        // First try the Context ClassLoader
-        ClassLoader cl = SecuritySupport.getContextClassLoader();
-        if (cl != null) {
-            is = SecuritySupport.getResourceAsStream(cl, serviceId);
-
-            // If no provider found then try the current ClassLoader
-            if (is == null) {
-                cl = FactoryFinder.class.getClassLoader();
-                is = SecuritySupport.getResourceAsStream(cl, serviceId);
-            }
-        } else {
-            // No Context ClassLoader, try the current
-            // ClassLoader
-            cl = FactoryFinder.class.getClassLoader();
-            is = SecuritySupport.getResourceAsStream(cl, serviceId);
-        }
-
-        if (is == null) {
-            // No provider found
-            return null;
-        }
-
-        if (debug) dPrint("found jar resource=" + serviceId +
-               " using ClassLoader: " + cl);
-
-        // Read the service provider name in UTF-8 as specified in
-        // the jar spec.  Unfortunately this fails in Microsoft
-        // VJ++, which does not implement the UTF-8
-        // encoding. Theoretically, we should simply let it fail in
-        // that case, since the JVM is obviously broken if it
-        // doesn't support such a basic standard.  But since there
-        // are still some users attempting to use VJ++ for
-        // development, we have dropped in a fallback which makes a
-        // second attempt using the platform's default encoding. In
-        // VJ++ this is apparently ASCII, which is a subset of
-        // UTF-8... and since the strings we'll be reading here are
-        // also primarily limited to the 7-bit ASCII range (at
-        // least, in English versions), this should work well
-        // enough to keep us on the air until we're ready to
-        // officially decommit from VJ++. [Edited comment from
-        // jkesselm]
-        BufferedReader rd;
-        try {
-            rd = new BufferedReader(new InputStreamReader(is, "UTF-8"), DEFAULT_LINE_LENGTH);
-        } catch (java.io.UnsupportedEncodingException e) {
-            rd = new BufferedReader(new InputStreamReader(is), DEFAULT_LINE_LENGTH);
-        }
-        
-        String factoryClassName = null;
-        try {
-            // XXX Does not handle all possible input as specified by the
-            // Jar Service Provider specification
-            factoryClassName = rd.readLine();
-        } 
-        catch (IOException x) {
-            // No provider found
-            return null;
-        }
-        finally {
-            try { 
-                // try to close the reader. 
-                rd.close(); 
-            } 
-            // Ignore the exception. 
-            catch (IOException exc) {}
-        }
-
-        if (factoryClassName != null &&
-            ! "".equals(factoryClassName)) {
-            if (debug) dPrint("found in resource, value="
-                   + factoryClassName);
-
-        // Note: here we do not want to fall back to the current
-        // ClassLoader because we want to avoid the case where the
-        // resource file was found using one ClassLoader and the
-        // provider class was instantiated using a different one.
-        return newInstance(factoryClassName, cl, false);
-        }
-
-        // No provider found
-        return null;
-    }
-
-    static class ConfigurationError extends Error {
-        private Exception exception;
-
-        /**
-         * Construct a new instance with the specified detail string and
-         * exception.
-         */
-        ConfigurationError(String msg, Exception x) {
-            super(msg);
-            this.exception = x;
-        }
-
-        Exception getException() {
-            return exception;
-        }
-    }
-
-}
diff --git a/trunk/jaxp-api-1.4/src/main/java/javax/xml/transform/SecuritySupport.java b/trunk/jaxp-api-1.4/src/main/java/javax/xml/transform/SecuritySupport.java
deleted file mode 100644
index 570dc5e..0000000
--- a/trunk/jaxp-api-1.4/src/main/java/javax/xml/transform/SecuritySupport.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.
- */
-
-// $Id: SecuritySupport.java,v 1.2.24.1 2005/03/29 23:32:22 jsuttor Exp $
-
-package javax.xml.transform;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.InputStream;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-
-/**
- * This class is duplicated for each JAXP subpackage so keep it in sync.
- * It is package private and therefore is not exposed as part of the JAXP
- * API.
- *
- * Security related methods that only work on J2SE 1.2 and newer.
- */
-final class SecuritySupport  {
-    
-    private SecuritySupport() {}
-    
-    static ClassLoader getContextClassLoader() {
-	return (ClassLoader)
-		AccessController.doPrivileged(new PrivilegedAction() {
-	    public Object run() {
-		ClassLoader cl = null;
-		try {
-		    cl = Thread.currentThread().getContextClassLoader();
-		} catch (SecurityException ex) { }
-		return cl;
-	    }
-	});
-    }
-
-    static String getSystemProperty(final String propName) {
-	return (String)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    return System.getProperty(propName);
-                }
-            });
-    }
-
-    static FileInputStream getFileInputStream(final File file)
-        throws FileNotFoundException
-    {
-	try {
-            return (FileInputStream)
-                AccessController.doPrivileged(new PrivilegedExceptionAction() {
-                    public Object run() throws FileNotFoundException {
-                        return new FileInputStream(file);
-                    }
-                });
-	} catch (PrivilegedActionException e) {
-	    throw (FileNotFoundException)e.getException();
-	}
-    }
-
-    static InputStream getResourceAsStream(final ClassLoader cl,
-                                           final String name)
-    {
-        return (InputStream)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    InputStream ris;
-                    if (cl == null) {
-                        ris = ClassLoader.getSystemResourceAsStream(name);
-                    } else {
-                        ris = cl.getResourceAsStream(name);
-                    }
-                    return ris;
-                }
-            });
-    }
-
-    static boolean doesFileExist(final File f) {
-    return ((Boolean)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    return f.exists() ? Boolean.TRUE : Boolean.FALSE;
-                }
-            })).booleanValue();
-    }
-
-}
diff --git a/trunk/jaxp-api-1.4/src/main/java/javax/xml/transform/TransformerFactory.java b/trunk/jaxp-api-1.4/src/main/java/javax/xml/transform/TransformerFactory.java
deleted file mode 100644
index a086d6e..0000000
--- a/trunk/jaxp-api-1.4/src/main/java/javax/xml/transform/TransformerFactory.java
+++ /dev/null
@@ -1,363 +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.
- */
-
-// $Id: TransformerFactory.java 884963 2009-11-27 19:11:59Z mrglavas $
-
-package javax.xml.transform;
-
-/**
- * <p>A TransformerFactory instance can be used to create
- * {@link javax.xml.transform.Transformer} and
- * {@link javax.xml.transform.Templates} objects.</p>
- *
- * <p>The system property that determines which Factory implementation
- * to create is named <code>"javax.xml.transform.TransformerFactory"</code>.
- * This property names a concrete subclass of the
- * <code>TransformerFactory</code> abstract class. If the property is not
- * defined, a platform default is be used.</p>
- *
- * @author <a href="mailto:Jeff.Suttor@Sun.com">Jeff Suttor</a>
- */
-public abstract class TransformerFactory {
-
-    /**
-     * Default constructor is protected on purpose.
-     */
-    protected TransformerFactory() { }
-
-
-    /**
-     * <p>Get current state of canonicalization.</p>
-     *
-     * @return current state canonicalization control
-     */
-    /*
-    public boolean getCanonicalization() {
-        return canonicalState;
-    }
-    */
-
-    /**
-     * <p>Set canonicalization control to <code>true</code> or
-     * </code>false</code>.</p>
-     *
-     * @param state of canonicalization
-     */
-    /*
-    public void setCanonicalization(boolean state) {
-        canonicalState = state;
-    }
-    */
-
-    /**
-     * Obtain a new instance of a <code>TransformerFactory</code>.
-     * This static method creates a new factory instance
-     * This method uses the following ordered lookup procedure to determine
-     * the <code>TransformerFactory</code> implementation class to
-     * load:
-     * <ul>
-     * <li>
-     * Use the <code>javax.xml.transform.TransformerFactory</code> system
-     * property.
-     * </li>
-     * <li>
-     * Use the properties file "lib/jaxp.properties" in the JRE directory.
-     * This configuration file is in standard <code>java.util.Properties
-     * </code> format and contains the fully qualified name of the
-     * implementation class with the key being the system property defined
-     * above.
-     *
-     * The jaxp.properties file is read only once by the JAXP implementation
-     * and it's values are then cached for future use.  If the file does not exist
-     * when the first attempt is made to read from it, no further attempts are
-     * made to check for its existence.  It is not possible to change the value
-     * of any property in jaxp.properties after it has been read for the first time.
-     * </li>
-     * <li>
-     * Use the Services API (as detailed in the JAR specification), if
-     * available, to determine the classname. The Services API will look
-     * for a classname in the file
-     * <code>META-INF/services/javax.xml.transform.TransformerFactory</code>
-     * in jars available to the runtime.
-     * </li>
-     * <li>
-     * Platform default <code>TransformerFactory</code> instance.
-     * </li>
-     * </ul>
-     *
-     * Once an application has obtained a reference to a <code>
-     * TransformerFactory</code> it can use the factory to configure
-     * and obtain parser instances.
-     *
-     * @return new TransformerFactory instance, never null.
-     *
-     * @throws TransformerFactoryConfigurationError Thrown if the implementation
-     *    is not available or cannot be instantiated.
-     */
-    public static TransformerFactory newInstance()
-            throws TransformerFactoryConfigurationError {
-        try {
-            return (TransformerFactory) FactoryFinder.find(
-                    /* The default property name according to the JAXP spec */
-                    "javax.xml.transform.TransformerFactory",
-                    /* The fallback implementation class name */
-                    "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl");
-        }
-        catch (FactoryFinder.ConfigurationError e) {
-            throw new TransformerFactoryConfigurationError(e.getException(), e.getMessage());
-        }
-    }
-
-    /**
-     * @return new TransformerFactory instance, never null.
-     *
-     * @throws TransformerFactoryConfigurationError Thrown if the implementation
-     *    is not available or cannot be instantiated.
-     */
-    public static TransformerFactory newInstance(String factoryClassName,
-                                                 ClassLoader classLoader) throws TransformerFactoryConfigurationError {
-        if (factoryClassName == null) {
-            throw new TransformerFactoryConfigurationError("factoryClassName cannot be null.");
-        }
-        if (classLoader == null) {
-            classLoader = SecuritySupport.getContextClassLoader();
-        }
-        try {
-            return (TransformerFactory) FactoryFinder.newInstance(factoryClassName, classLoader, false);
-        }
-        catch (FactoryFinder.ConfigurationError e) {
-            throw new TransformerFactoryConfigurationError(e.getException(), e.getMessage());
-        }
-    }
-
-    /**
-     * <p>Process the <code>Source</code> into a <code>Transformer</code>
-     * <code>Object</code>.  The <code>Source</code> is an XSLT document that
-     * conforms to <a href="http://www.w3.org/TR/xslt">
-     * XSL Transformations (XSLT) Version 1.0</a>.  Care must
-     * be taken not to use this <code>Transformer</code> in multiple
-     * <code>Thread</code>s running concurrently.
-     * Different <code>TransformerFactories</code> can be used concurrently by
-     * different <code>Thread</code>s.</p>
-     *
-     * @param source <code>Source </code> of XSLT document used to create
-     *   <code>Transformer</code>.
-     *   Examples of XML <code>Source</code>s include
-     *   {@link javax.xml.transform.stream.StreamSource StreamSource},
-     *   {@link javax.xml.transform.sax.SAXSource SAXSource},
-     *   {@link javax.xml.transform.dom.DOMSource DOMSource} and
-     *   {@link javax.xml.transform.stax.StAXSource StAXSource}.
-     *
-     * @return A <code>Transformer</code> object that may be used to perform
-     *   a transformation in a single <code>Thread</code>, never
-     *   <code>null</code>.
-     *
-     * @throws TransformerConfigurationException Thrown if there are errors when
-     *    parsing the <code>Source</code> or it is not possible to create a
-     *   <code>Transformer</code> instance.
-     *
-     * @see <a href="http://www.w3.org/TR/xslt">
-     *   XSL Transformations (XSLT) Version 1.0</a>
-     */
-    public abstract Transformer newTransformer(Source source)
-            throws TransformerConfigurationException;
-
-    /**
-     * <p>Create a new <code>Transformer</code> that performs a copy
-     * of the <code>Source</code> to the <code>Result</code>.
-     * i.e. the "<em>identity transform</em>".</p>
-     *
-     * @return A Transformer object that may be used to perform a transformation
-     * in a single thread, never null.
-     *
-     * @exception TransformerConfigurationException Thrown if it is not
-     *   possible to create a <code>Transformer</code> instance.
-     */
-    public abstract Transformer newTransformer()
-            throws TransformerConfigurationException;
-
-    /**
-     * Process the Source into a Templates object, which is a
-     * a compiled representation of the source. This Templates object
-     * may then be used concurrently across multiple threads.  Creating
-     * a Templates object allows the TransformerFactory to do detailed
-     * performance optimization of transformation instructions, without
-     * penalizing runtime transformation.
-     *
-     * @param source An object that holds a URL, input stream, etc.
-     *
-     * @return A Templates object capable of being used for transformation
-     * purposes, never null.
-     *
-     * @exception TransformerConfigurationException May throw this during the
-     * parse when it is constructing the Templates object and fails.
-     */
-    public abstract Templates newTemplates(Source source)
-            throws TransformerConfigurationException;
-
-    /**
-     * <p>Get the stylesheet specification(s) associated with the
-     * XML <code>Source</code> document via the
-     * <a href="http://www.w3.org/TR/xml-stylesheet/">
-     * xml-stylesheet processing instruction</a> that match the given criteria.
-     * Note that it is possible to return several stylesheets, in which case
-     * they are applied as if they were a list of imports or cascades in a
-     * single stylesheet.</p>
-     *
-     * @param source The XML source document.
-     * @param media The media attribute to be matched.  May be null, in which
-     *      case the preferred templates will be used (i.e. alternate = no).
-     * @param title The value of the title attribute to match.  May be null.
-     * @param charset The value of the charset attribute to match.  May be null.
-     *
-     * @return A <code>Source</code> <code>Object</code> suitable for passing
-     *   to the <code>TransformerFactory</code>.
-     *
-     * @throws TransformerConfigurationException An <code>Exception</code>
-     *   is thrown if an error occurs during parsing of the
-     *   <code>source</code>.
-     *
-     * @see <a href="http://www.w3.org/TR/xml-stylesheet/">
-     *   Associating Style Sheets with XML documents Version 1.0</a>
-     */
-    public abstract Source getAssociatedStylesheet(
-            Source source,
-            String media,
-            String title,
-            String charset)
-            throws TransformerConfigurationException;
-
-    /**
-     * Set an object that is used by default during the transformation
-     * to resolve URIs used in document(), xsl:import, or xsl:include.
-     *
-     * @param resolver An object that implements the URIResolver interface,
-     * or null.
-     */
-    public abstract void setURIResolver(URIResolver resolver);
-
-    /**
-     * Get the object that is used by default during the transformation
-     * to resolve URIs used in document(), xsl:import, or xsl:include.
-     *
-     * @return The URIResolver that was set with setURIResolver.
-     */
-    public abstract URIResolver getURIResolver();
-
-    //======= CONFIGURATION METHODS =======
-
-    /**
-     * <p>Set a feature for this <code>TransformerFactory</code> and <code>Transformer</code>s
-     * or <code>Template</code>s created by this factory.</p>
-     *
-     * <p>
-     * Feature names are fully qualified {@link java.net.URI}s.
-     * Implementations may define their own features.
-     * An {@link TransformerConfigurationException} is thrown if this <code>TransformerFactory</code> or the
-     * <code>Transformer</code>s or <code>Template</code>s it creates cannot support the feature.
-     * It is possible for an <code>TransformerFactory</code> to expose a feature value but be unable to change its state.
-     * </p>
-     *
-     * <p>All implementations are required to support the {@link javax.xml.XMLConstants#FEATURE_SECURE_PROCESSING} feature.
-     * When the feature is:</p>
-     * <ul>
-     *   <li>
-     *     <code>true</code>: the implementation will limit XML processing to conform to implementation limits
-     *     and behave in a secure fashion as defined by the implementation.
-     *     Examples include resolving user defined style sheets and functions.
-     *     If XML processing is limited for security reasons, it will be reported via a call to the registered
-     *     {@link ErrorListener#fatalError(TransformerException exception)}.
-     *     See {@link  #setErrorListener(ErrorListener listener)}.
-     *   </li>
-     *   <li>
-     *     <code>false</code>: the implementation will processing XML according to the XML specifications without
-     *     regard to possible implementation limits.
-     *   </li>
-     * </ul>
-     *
-     * @param name Feature name.
-     * @param value Is feature state <code>true</code> or <code>false</code>.
-     *
-     * @throws TransformerConfigurationException if this <code>TransformerFactory</code>
-     *   or the <code>Transformer</code>s or <code>Template</code>s it creates cannot support this feature.
-     * @throws NullPointerException If the <code>name</code> parameter is null.
-     */
-    public abstract void setFeature(String name, boolean value)
-            throws TransformerConfigurationException;
-
-    /**
-     * Look up the value of a feature.
-     *
-     * <p>
-     * Feature names are fully qualified {@link java.net.URI}s.
-     * Implementations may define their own features.
-     * <code>false</code> is returned if this <code>TransformerFactory</code> or the
-     * <code>Transformer</code>s or <code>Template</code>s it creates cannot support the feature.
-     * It is possible for an <code>TransformerFactory</code> to expose a feature value but be unable to change its state.
-     * </p>
-     *
-     * @param name Feature name.
-     *
-     * @return The current state of the feature, <code>true</code> or <code>false</code>.
-     *
-     * @throws NullPointerException If the <code>name</code> parameter is null.
-     */
-    public abstract boolean getFeature(String name);
-
-    /**
-     * Allows the user to set specific attributes on the underlying
-     * implementation.  An attribute in this context is defined to
-     * be an option that the implementation provides.
-     * An <code>IllegalArgumentException</code> is thrown if the underlying
-     * implementation doesn't recognize the attribute.
-     *
-     * @param name The name of the attribute.
-     * @param value The value of the attribute.
-     */
-    public abstract void setAttribute(String name, Object value);
-
-    /**
-     * Allows the user to retrieve specific attributes on the underlying
-     * implementation.
-     * An <code>IllegalArgumentException</code> is thrown if the underlying
-     * implementation doesn't recognize the attribute.
-     *
-     * @param name The name of the attribute.
-     * @return value The value of the attribute.
-     */
-    public abstract Object getAttribute(String name);
-
-    /**
-     * Set the error event listener for the TransformerFactory, which
-     * is used for the processing of transformation instructions,
-     * and not for the transformation itself.
-     * An <code>IllegalArgumentException</code> is thrown if the
-     * <code>ErrorListener</code> listener is <code>null</code>.
-     *
-     * @param listener The new error listener.
-     */
-    public abstract void setErrorListener(ErrorListener listener);
-
-    /**
-     * Get the error event handler for the TransformerFactory.
-     *
-     * @return The current error handler, which should never be null.
-     */
-    public abstract ErrorListener getErrorListener();
-
-}
-
diff --git a/trunk/jaxp-api-1.4/src/main/java/javax/xml/validation/SchemaFactoryFinder.java b/trunk/jaxp-api-1.4/src/main/java/javax/xml/validation/SchemaFactoryFinder.java
deleted file mode 100644
index cb0d044..0000000
--- a/trunk/jaxp-api-1.4/src/main/java/javax/xml/validation/SchemaFactoryFinder.java
+++ /dev/null
@@ -1,472 +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.
- */
-// $Id: SchemaFactoryFinder.java 446598 2006-09-15 12:55:40Z jeremias $
-
-package javax.xml.validation;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-import java.util.Properties;
-import javax.xml.XMLConstants;
-
-/**
- * Implementation of {@link SchemaFactory#newInstance(String)}.
- * 
- * @author <a href="Kohsuke.Kawaguchi@Sun.com">Kohsuke Kawaguchi</a>
- * @version $Revision: 446598 $, $Date: 2006-09-15 08:55:40 -0400 (Fri, 15 Sep 2006) $
- * @since 1.5
- */
-final class SchemaFactoryFinder  {
-
-    /** debug support code. */
-    private static boolean debug = false;
-
-    /**
-     * <p>Cache properties for performance.</p>
-     */
-	private static Properties cacheProps = new Properties();
-    
-	/**
-	 * <p>First time requires initialization overhead.</p>
-	 */
-	private static boolean firstTime = true;
-    
-    /**
-     * Default columns per line.
-     */
-    private static final int DEFAULT_LINE_LENGTH = 80;
-    
-    static {
-        // Use try/catch block to support applets
-        try {
-            String val = SecuritySupport.getSystemProperty("jaxp.debug");
-            // Allow simply setting the prop to turn on debug
-            debug = val != null && (! "false".equals(val));
-        } catch (Exception _) {
-            debug = false;
-        }
-    }
-
-    /**
-     * <p>Conditional debug printing.</p>
-     * 
-     * @param msg to print
-     */
-    private static void debugPrintln(String msg) {
-        if (debug) {
-            System.err.println("JAXP: " + msg);
-        }
-    }
-    
-    /**
-     * <p><code>ClassLoader</code> to use to find <code>SchemaFactory</code>.</p>
-     */
-    private final ClassLoader classLoader;
-    
-    /**
-     * <p>Constructor that specifies <code>ClassLoader</code> to use
-     * to find <code>SchemaFactory</code>.</p>
-     * 
-     * @param loader
-     *      to be used to load resource, {@link SchemaFactory}, and
-     *      {@link SchemaFactoryLoader} implementations during
-     *      the resolution process.
-     *      If this parameter is null, the default system class loader
-     *      will be used.
-     */
-    public SchemaFactoryFinder(ClassLoader loader) {
-        this.classLoader = loader;
-        if( debug ) {
-            debugDisplayClassLoader();
-        }
-    }
-    
-    private void debugDisplayClassLoader() {
-        try {
-            if( classLoader == SecuritySupport.getContextClassLoader() ) {
-                debugPrintln("using thread context class loader ("+classLoader+") for search");
-                return;
-            }
-        } catch( Throwable _ ) {
-            ; // getContextClassLoader() undefined in JDK1.1 
-        }
-        
-        if( classLoader==ClassLoader.getSystemClassLoader() ) {
-            debugPrintln("using system class loader ("+classLoader+") for search");
-            return;
-        }
-
-        debugPrintln("using class loader ("+classLoader+") for search");
-    }
-    
-    /**
-     * <p>Creates a new {@link SchemaFactory} object for the specified
-     * schema language.</p>
-     * 
-     * @param schemaLanguage
-     *      See {@link SchemaFactory Schema Language} table in <code>SchemaFactory</code>
-     *      for the list of available schema languages.
-     * 
-     * @return <code>null</code> if the callee fails to create one.
-     * 
-     * @throws NullPointerException
-     *      If the <tt>schemaLanguage</tt> parameter is null.
-     */
-    public SchemaFactory newFactory(String schemaLanguage) {
-        if(schemaLanguage==null)        throw new NullPointerException();
-        SchemaFactory f = _newFactory(schemaLanguage);
-        if (debug) {
-            if (f != null) {
-                debugPrintln("factory '" + f.getClass().getName() + "' was found for " + schemaLanguage);
-            } else {
-                debugPrintln("unable to find a factory for " + schemaLanguage);
-            }
-        }
-        return f;
-    }
-    
-    /**
-     * <p>Lookup a <code>SchemaFactory</code> for the given <code>schemaLanguage</code>.</p>
-     * 
-     * @param schemaLanguage Schema language to lookup <code>SchemaFactory</code> for.
-     *  
-     * @return <code>SchemaFactory</code> for the given <code>schemaLanguage</code>.
-     */
-    private SchemaFactory _newFactory(String schemaLanguage) {
-        SchemaFactory sf;
-        String propertyName = SERVICE_CLASS.getName() + ":" + schemaLanguage;
-        
-        try {
-            // If we are deployed into an OSGi environment, leverage it
-            Class spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(SERVICE_CLASS);
-            if (spiClass != null) {
-                return (SchemaFactory) spiClass.newInstance();
-            }
-        } catch (Throwable e) {
-        }
-
-        // system property look up
-        try {
-            if (debug) debugPrintln("Looking up system property '"+propertyName+"'" );
-            String r = SecuritySupport.getSystemProperty(propertyName);
-            if (r != null) {
-                if (debug) debugPrintln("The value is '"+r+"'");
-                sf = createInstance(r);
-                if(sf!=null)    return sf;
-            } 
-            else if (debug) {
-                debugPrintln("The property is undefined.");
-            }
-        } catch( Throwable t ) {
-            if( debug ) {
-                debugPrintln("failed to look up system property '"+propertyName+"'" );
-                t.printStackTrace();
-            }
-        }
-
-        String javah = SecuritySupport.getSystemProperty( "java.home" );
-        String configFile = javah + File.separator +
-        "lib" + File.separator + "jaxp.properties";
-
-        String factoryClassName = null ;
-
-        // try to read from $java.home/lib/jaxp.properties
-        try {
-            if(firstTime){
-                synchronized(cacheProps){
-                    if(firstTime){
-                        File f=new File( configFile );
-                        firstTime = false;
-                        if(SecuritySupport.doesFileExist(f)){
-                            if (debug) debugPrintln("Read properties file " + f);                                
-                            cacheProps.load(SecuritySupport.getFileInputStream(f));
-                        }
-                    }
-                }
-            }
-            factoryClassName = cacheProps.getProperty(propertyName);            
-            if (debug) debugPrintln("found " + factoryClassName + " in $java.home/jaxp.properties"); 
-
-            if (factoryClassName != null) {
-                sf = createInstance(factoryClassName);
-                if(sf != null){
-                    return sf;
-                }
-            }
-        } catch (Exception ex) {
-            if (debug) {
-                ex.printStackTrace();
-            } 
-        }
-
-        /**
-        // try to read from $java.home/lib/jaxp.properties
-        try {
-            String javah = ss.getSystemProperty( "java.home" );
-            String configFile = javah + File.separator +
-            "lib" + File.separator + "jaxp.properties";
-            File f = new File( configFile );
-            if( ss.doesFileExist(f)) {
-                sf = loadFromProperty(
-                        propertyName,f.getAbsolutePath(), new FileInputStream(f));
-                if(sf!=null)    return sf;
-            } else {
-                debugPrintln("Tried to read "+ f.getAbsolutePath()+", but it doesn't exist.");
-            }
-        } catch(Throwable e) {
-            if( debug ) {
-                debugPrintln("failed to read $java.home/lib/jaxp.properties");
-                e.printStackTrace();
-            }
-        }
-         */
-        
-        // try META-INF/services files
-        Iterator sitr = createServiceFileIterator();
-        while(sitr.hasNext()) {
-            URL resource = (URL)sitr.next();
-            if (debug) debugPrintln("looking into " + resource);
-            try {
-                sf = loadFromServicesFile(schemaLanguage,resource.toExternalForm(),SecuritySupport.getURLInputStream(resource));
-                if(sf!=null)    return sf;
-            } catch(IOException e) {
-                if( debug ) {
-                    debugPrintln("failed to read "+resource);
-                    e.printStackTrace();
-                }
-            }
-        }
-        
-        // platform default
-        if(schemaLanguage.equals("http://www.w3.org/2001/XMLSchema")) {
-            if (debug) debugPrintln("attempting to use the platform default XML Schema 1.0 validator");
-            return createInstance("com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory");
-        }
-
-        if (debug) debugPrintln("all things were tried, but none was found. bailing out.");
-        return null;
-    }
-    
-    /**
-     * <p>Creates an instance of the specified and returns it.</p>
-     * 
-     * @param className
-     *      fully qualified class name to be instanciated.
-     * 
-     * @return null
-     *      if it fails. Error messages will be printed by this method. 
-     */
-    SchemaFactory createInstance( String className ) {
-        try {
-            if (debug) debugPrintln("instanciating "+className);
-            Class clazz;
-            if( classLoader!=null )
-                clazz = classLoader.loadClass(className);
-            else
-                clazz = Class.forName(className);
-            if(debug)       debugPrintln("loaded it from "+which(clazz));
-            Object o = clazz.newInstance();
-            
-            if( o instanceof SchemaFactory )
-                return (SchemaFactory)o;
-            
-            if (debug) debugPrintln(className+" is not assignable to "+SERVICE_CLASS.getName());
-        } catch( Throwable t ) {
-            debugPrintln("failed to instanciate "+className);
-            if(debug)   t.printStackTrace();
-        }
-        return null;
-    }
-    
-    /** Iterator that lazily computes one value and returns it. */
-    private static abstract class SingleIterator implements Iterator {
-        private boolean seen = false;
-        
-        public final void remove() { throw new UnsupportedOperationException(); }
-        public final boolean hasNext() { return !seen; }
-        public final Object next() {
-            if(seen)    throw new NoSuchElementException();
-            seen = true;
-            return value();
-        }
-        
-        protected abstract Object value();
-    }
-    
-    /**
-     * Returns an {@link Iterator} that enumerates all 
-     * the META-INF/services files that we care.
-     */
-    private Iterator createServiceFileIterator() {
-        if (classLoader == null) {
-            return new SingleIterator() {
-                protected Object value() {
-                    ClassLoader classLoader = SchemaFactoryFinder.class.getClassLoader();
-                    //return (ClassLoader.getSystemResource( SERVICE_ID ));
-                    return SecuritySupport.getResourceAsURL(classLoader, SERVICE_ID);
-                }
-            };
-        } else {
-            try {
-                //final Enumeration e = classLoader.getResources(SERVICE_ID);
-                final Enumeration e = SecuritySupport.getResources(classLoader, SERVICE_ID);
-                if(debug && !e.hasMoreElements()) {
-                    debugPrintln("no "+SERVICE_ID+" file was found");
-                }
-                
-                // wrap it into an Iterator.
-                return new Iterator() {
-                    public void remove() {
-                        throw new UnsupportedOperationException();
-                    }
-
-                    public boolean hasNext() {
-                        return e.hasMoreElements();
-                    }
-
-                    public Object next() {
-                        return e.nextElement();
-                    }
-                };
-            } catch (IOException e) {
-                if (debug) {
-                    debugPrintln("failed to enumerate resources "+SERVICE_ID);
-                    e.printStackTrace();
-                }
-                return new ArrayList().iterator();  // empty iterator
-            }
-        }
-    }
-    
-    /** Searches for a SchemaFactory for a given schema language in a META-INF/services file. */
-    private SchemaFactory loadFromServicesFile(String schemaLanguage, String resourceName, InputStream in) {
-
-        if (debug) debugPrintln("Reading "+resourceName );
-        
-        // Read the service provider name in UTF-8 as specified in
-        // the jar spec.  Unfortunately this fails in Microsoft
-        // VJ++, which does not implement the UTF-8
-        // encoding. Theoretically, we should simply let it fail in
-        // that case, since the JVM is obviously broken if it
-        // doesn't support such a basic standard.  But since there
-        // are still some users attempting to use VJ++ for
-        // development, we have dropped in a fallback which makes a
-        // second attempt using the platform's default encoding. In
-        // VJ++ this is apparently ASCII, which is a subset of
-        // UTF-8... and since the strings we'll be reading here are
-        // also primarily limited to the 7-bit ASCII range (at
-        // least, in English versions), this should work well
-        // enough to keep us on the air until we're ready to
-        // officially decommit from VJ++. [Edited comment from
-        // jkesselm]
-        BufferedReader rd;
-        try {
-            rd = new BufferedReader(new InputStreamReader(in, "UTF-8"), DEFAULT_LINE_LENGTH);
-        } catch (java.io.UnsupportedEncodingException e) {
-            rd = new BufferedReader(new InputStreamReader(in), DEFAULT_LINE_LENGTH);
-        }
-        
-        String factoryClassName = null;
-        SchemaFactory resultFactory = null;
-        // See spec for provider-configuration files: http://java.sun.com/j2se/1.5.0/docs/guide/jar/jar.html#Provider%20Configuration%20File
-        while (true) {
-            try {
-                factoryClassName = rd.readLine();   
-            } catch (IOException x) {
-                // No provider found
-                break;
-            }
-            if (factoryClassName != null) {
-                // Ignore comments in the provider-configuration file
-                int hashIndex = factoryClassName.indexOf('#');
-                if (hashIndex != -1) {
-                    factoryClassName = factoryClassName.substring(0, hashIndex);
-                }
-                
-                // Ignore leading and trailing whitespace
-                factoryClassName = factoryClassName.trim();
-                
-                // If there's no text left or if this was a blank line, go to the next one.
-                if (factoryClassName.length() == 0) {
-                    continue;
-                }
-                
-                try {
-                    // Found the right SchemaFactory if its isSchemaLanguageSupported(schemaLanguage) method returns true.
-                    SchemaFactory foundFactory = (SchemaFactory) createInstance(factoryClassName);
-                    if (foundFactory.isSchemaLanguageSupported(schemaLanguage)) {
-                        resultFactory = foundFactory;
-                        break;
-                    }
-                }
-                catch (Exception e) {}
-            }
-            else {
-                break;
-            }
-        }
-        
-        try {
-            // try to close the reader.
-            rd.close();
-        }
-        // Ignore the exception.
-        catch (IOException exc) {}
-        
-        return resultFactory;
-    }
-    
-    private static final Class SERVICE_CLASS = SchemaFactory.class;
-    private static final String SERVICE_ID = "META-INF/services/" + SERVICE_CLASS.getName();
-    
-    
-    
-    private static String which( Class clazz ) {
-        return which( clazz.getName(), clazz.getClassLoader() );
-    }
-
-    /**
-     * <p>Search the specified classloader for the given classname.</p>
-     *
-     * @param classname the fully qualified name of the class to search for
-     * @param loader the classloader to search
-     * 
-     * @return the source location of the resource, or null if it wasn't found
-     */
-    private static String which(String classname, ClassLoader loader) {
-
-        String classnameAsResource = classname.replace('.', '/') + ".class";
-        
-        if( loader==null )  loader = ClassLoader.getSystemClassLoader();
-        
-        //URL it = loader.getResource(classnameAsResource);
-        URL it = SecuritySupport.getResourceAsURL(loader, classnameAsResource);
-        if (it != null) {
-            return it.toString();
-        } else {
-            return null;
-        }
-    }
-}
diff --git a/trunk/jaxp-api-1.4/src/main/java/javax/xml/validation/SecuritySupport.java b/trunk/jaxp-api-1.4/src/main/java/javax/xml/validation/SecuritySupport.java
deleted file mode 100644
index fea9147..0000000
--- a/trunk/jaxp-api-1.4/src/main/java/javax/xml/validation/SecuritySupport.java
+++ /dev/null
@@ -1,160 +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.
- */
-// $Id: SecuritySupport.java 446598 2006-09-15 12:55:40Z jeremias $
-
-package javax.xml.validation;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-import java.util.Enumeration;
-
-/**
- * This class is duplicated for each JAXP subpackage so keep it in sync.
- * It is package private and therefore is not exposed as part of the JAXP
- * API.
- *
- * Security related methods that only work on J2SE 1.2 and newer.
- */
-final class SecuritySupport  {
-    
-    private SecuritySupport() {}
-    
-    static ClassLoader getContextClassLoader() {
-	return (ClassLoader)
-		AccessController.doPrivileged(new PrivilegedAction() {
-	    public Object run() {
-		ClassLoader cl = null;
-		try {
-		    cl = Thread.currentThread().getContextClassLoader();
-		} catch (SecurityException ex) { }
-		return cl;
-	    }
-	});
-    }
-
-    static String getSystemProperty(final String propName) {
-	return (String)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    return System.getProperty(propName);
-                }
-            });
-    }
-
-    static FileInputStream getFileInputStream(final File file)
-        throws FileNotFoundException
-    {
-	try {
-            return (FileInputStream)
-                AccessController.doPrivileged(new PrivilegedExceptionAction() {
-                    public Object run() throws FileNotFoundException {
-                        return new FileInputStream(file);
-                    }
-                });
-	} catch (PrivilegedActionException e) {
-	    throw (FileNotFoundException)e.getException();
-	}
-    }
-
-    static InputStream getURLInputStream(final URL url)
-        throws IOException
-    {
-	try {
-            return (InputStream)
-                AccessController.doPrivileged(new PrivilegedExceptionAction() {
-                    public Object run() throws IOException {
-                        return url.openStream();
-                    }
-                });
-	} catch (PrivilegedActionException e) {
-	    throw (IOException)e.getException();
-	}
-    }
-
-    static URL getResourceAsURL(final ClassLoader cl,
-                                final String name)
-    {
-        return (URL)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    URL url;
-                    if (cl == null) {
-                        url = ClassLoader.getSystemResource(name);
-                    } else {
-                        url = cl.getSystemResource(name);
-                    }
-                    return url;
-                }
-            });
-    }
-
-    static Enumeration getResources(final ClassLoader cl,
-                                    final String name) throws IOException
-    {
-        try{
-        return (Enumeration)
-            AccessController.doPrivileged(new PrivilegedExceptionAction() {
-                public Object run() throws IOException{
-                    Enumeration enumeration;
-                    if (cl == null) {
-                        enumeration = ClassLoader.getSystemResources(name);
-                    } else {
-                        enumeration = cl.getSystemResources(name);
-                    }
-                    return enumeration;
-                }
-            });
-        }catch(PrivilegedActionException e){
-            throw (IOException)e.getException();
-        }
-    }
-    
-    static InputStream getResourceAsStream(final ClassLoader cl,
-                                           final String name)
-    {
-        return (InputStream)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    InputStream ris;
-                    if (cl == null) {
-                        ris = ClassLoader.getSystemResourceAsStream(name);
-                    } else {
-                        ris = cl.getResourceAsStream(name);
-                    }
-                    return ris;
-                }
-            });
-    }
-
-    static boolean doesFileExist(final File f) {
-    return ((Boolean)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    return f.exists() ? Boolean.TRUE : Boolean.FALSE;
-                }
-            })).booleanValue();
-    }
-
-}
diff --git a/trunk/jaxp-api-1.4/src/main/java/javax/xml/xpath/SecuritySupport.java b/trunk/jaxp-api-1.4/src/main/java/javax/xml/xpath/SecuritySupport.java
deleted file mode 100644
index c392de1..0000000
--- a/trunk/jaxp-api-1.4/src/main/java/javax/xml/xpath/SecuritySupport.java
+++ /dev/null
@@ -1,160 +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.
- */
-// $Id: SecuritySupport.java 446598 2006-09-15 12:55:40Z jeremias $
-
-package javax.xml.xpath;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-import java.util.Enumeration;
-
-/**
- * This class is duplicated for each JAXP subpackage so keep it in sync.
- * It is package private and therefore is not exposed as part of the JAXP
- * API.
- *
- * Security related methods that only work on J2SE 1.2 and newer.
- */
-final class SecuritySupport  {
-    
-    private SecuritySupport() {}
-    
-    static ClassLoader getContextClassLoader() {
-	return (ClassLoader)
-		AccessController.doPrivileged(new PrivilegedAction() {
-	    public Object run() {
-		ClassLoader cl = null;
-		try {
-		    cl = Thread.currentThread().getContextClassLoader();
-		} catch (SecurityException ex) { }
-		return cl;
-	    }
-	});
-    }
-
-    static String getSystemProperty(final String propName) {
-	return (String)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    return System.getProperty(propName);
-                }
-            });
-    }
-
-    static FileInputStream getFileInputStream(final File file)
-        throws FileNotFoundException
-    {
-	try {
-            return (FileInputStream)
-                AccessController.doPrivileged(new PrivilegedExceptionAction() {
-                    public Object run() throws FileNotFoundException {
-                        return new FileInputStream(file);
-                    }
-                });
-	} catch (PrivilegedActionException e) {
-	    throw (FileNotFoundException)e.getException();
-	}
-    }
-
-    static InputStream getURLInputStream(final URL url)
-        throws IOException
-    {
-	try {
-            return (InputStream)
-                AccessController.doPrivileged(new PrivilegedExceptionAction() {
-                    public Object run() throws IOException {
-                        return url.openStream();
-                    }
-                });
-	} catch (PrivilegedActionException e) {
-	    throw (IOException)e.getException();
-	}
-    }
-
-    static URL getResourceAsURL(final ClassLoader cl,
-                                final String name)
-    {
-        return (URL)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    URL url;
-                    if (cl == null) {
-                        url = ClassLoader.getSystemResource(name);
-                    } else {
-                        url = cl.getSystemResource(name);
-                    }
-                    return url;
-                }
-            });
-    }
-
-    static Enumeration getResources(final ClassLoader cl,
-                                    final String name) throws IOException
-    {
-        try{
-        return (Enumeration)
-            AccessController.doPrivileged(new PrivilegedExceptionAction() {
-                public Object run() throws IOException{
-                    Enumeration enumeration;
-                    if (cl == null) {
-                        enumeration = ClassLoader.getSystemResources(name);
-                    } else {
-                        enumeration = cl.getSystemResources(name);
-                    }
-                    return enumeration;
-                }
-            });
-        }catch(PrivilegedActionException e){
-            throw (IOException)e.getException();
-        }
-    }
-    
-    static InputStream getResourceAsStream(final ClassLoader cl,
-                                           final String name)
-    {
-        return (InputStream)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    InputStream ris;
-                    if (cl == null) {
-                        ris = ClassLoader.getSystemResourceAsStream(name);
-                    } else {
-                        ris = cl.getResourceAsStream(name);
-                    }
-                    return ris;
-                }
-            });
-    }
-
-    static boolean doesFileExist(final File f) {
-    return ((Boolean)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    return f.exists() ? Boolean.TRUE : Boolean.FALSE;
-                }
-            })).booleanValue();
-    }
-
-}
diff --git a/trunk/jaxp-api-1.4/src/main/java/javax/xml/xpath/XPathFactoryFinder.java b/trunk/jaxp-api-1.4/src/main/java/javax/xml/xpath/XPathFactoryFinder.java
deleted file mode 100644
index f5e80a1..0000000
--- a/trunk/jaxp-api-1.4/src/main/java/javax/xml/xpath/XPathFactoryFinder.java
+++ /dev/null
@@ -1,437 +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.
- */
-// $Id: XPathFactoryFinder.java 446598 2006-09-15 12:55:40Z jeremias $
-
-package javax.xml.xpath;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-import java.util.Properties;
-
-import javax.xml.validation.SchemaFactory;
-
-/**
- * Implementation of {@link XPathFactory#newInstance(String)}.
- * 
- * @author <a href="Kohsuke.Kawaguchi@Sun.com">Kohsuke Kawaguchi</a>
- * @version $Revision: 446598 $, $Date: 2006-09-15 08:55:40 -0400 (Fri, 15 Sep 2006) $
- * @since 1.5
- */
-final class XPathFactoryFinder {
-    
-    /** debug support code. */
-    private static boolean debug = false;
-    
-    /**
-     * Default columns per line.
-     */
-    private static final int DEFAULT_LINE_LENGTH = 80;
-    
-    static {
-        // Use try/catch block to support applets
-        try {
-            String val = SecuritySupport.getSystemProperty("jaxp.debug");
-            // Allow simply setting the prop to turn on debug
-            debug = val != null && (! "false".equals(val));
-        } catch (Exception _) {
-            debug = false;
-        }
-    }
-
-    /**
-     * <p>Cache properties for performance.</p>
-     */
-	private static Properties cacheProps = new Properties();
-    
-	/**
-	 * <p>First time requires initialization overhead.</p>
-	 */
-	private static boolean firstTime = true;
-    
-    /**
-     * <p>Conditional debug printing.</p>
-     * 
-     * @param msg to print
-     */
-    private static void debugPrintln(String msg) {
-        if (debug) {
-            System.err.println("JAXP: " + msg);
-        }
-    }
-    
-    /**
-     * <p><code>ClassLoader</code> to use to find <code>SchemaFactory</code>.</p>
-     */
-    private final ClassLoader classLoader;
-    
-    /**
-     * <p>Constructor that specifies <code>ClassLoader</code> to use
-     * to find <code>SchemaFactory</code>.</p>
-     * 
-     * @param loader
-     *      to be used to load resource, {@link SchemaFactory}, and
-     *      {@link SchemaFactoryLoader} implementations during
-     *      the resolution process.
-     *      If this parameter is null, the default system class loader
-     *      will be used.
-     */
-    public XPathFactoryFinder(ClassLoader loader) {
-        this.classLoader = loader;
-        if( debug ) {
-            debugDisplayClassLoader();
-        }
-    }
-    
-    private void debugDisplayClassLoader() {
-        try {
-            if( classLoader == SecuritySupport.getContextClassLoader() ) {
-                debugPrintln("using thread context class loader ("+classLoader+") for search");
-                return;
-            }
-        } catch( Throwable _ ) {
-            ; // getContextClassLoader() undefined in JDK1.1 
-        }
-        
-        if( classLoader==ClassLoader.getSystemClassLoader() ) {
-            debugPrintln("using system class loader ("+classLoader+") for search");
-            return;
-        }
-
-        debugPrintln("using class loader ("+classLoader+") for search");
-    }
-    
-    /**
-     * <p>Creates a new {@link XPathFactory} object for the specified
-     * schema language.</p>
-     * 
-     * @param uri
-     *       Identifies the underlying object model.
-     * 
-     * @return <code>null</code> if the callee fails to create one.
-     * 
-     * @throws NullPointerException
-     *      If the parameter is null.
-     */
-    public XPathFactory newFactory(String uri) {
-        if(uri==null)        throw new NullPointerException();
-        XPathFactory f = _newFactory(uri);
-        if (debug) {
-            if (f != null) {
-                debugPrintln("factory '" + f.getClass().getName() + "' was found for " + uri);
-            } else {
-                debugPrintln("unable to find a factory for " + uri);
-            }
-        }
-        return f;
-    }
-    
-    /**
-     * <p>Lookup a {@link XPathFactory} for the given object model.</p>
-     * 
-     * @param uri identifies the object model.
-     *  
-     * @return {@link XPathFactory} for the given object model.
-     */
-    private XPathFactory _newFactory(String uri) {
-        XPathFactory sf;
-        
-        String propertyName = SERVICE_CLASS.getName() + ":" + uri;
-        
-        try {
-            // If we are deployed into an OSGi environment, leverage it
-            Class spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(SERVICE_CLASS);
-            if (spiClass != null) {
-                return (XPathFactory) spiClass.newInstance();
-            }
-        } catch (Throwable e) {
-        }
-
-        // system property look up
-        try {
-            if (debug) debugPrintln("Looking up system property '"+propertyName+"'" );
-            String r = SecuritySupport.getSystemProperty(propertyName);
-            if(r!=null) {
-                if (debug) debugPrintln("The value is '"+r+"'");
-                sf = createInstance(r);
-                if(sf!=null)    return sf;
-            } 
-            else if (debug) {
-                debugPrintln("The property is undefined.");
-            }
-        } catch( Throwable t ) {
-            if( debug ) {
-                debugPrintln("failed to look up system property '"+propertyName+"'" );
-                t.printStackTrace();
-            }
-        }
-        
-        String javah = SecuritySupport.getSystemProperty( "java.home" );
-        String configFile = javah + File.separator +
-        "lib" + File.separator + "jaxp.properties";
-
-        String factoryClassName = null ;
-
-        // try to read from $java.home/lib/jaxp.properties
-        try {
-            if(firstTime){
-                synchronized(cacheProps){
-                    if(firstTime){
-                        File f=new File( configFile );
-                        firstTime = false;
-                        if(SecuritySupport.doesFileExist(f)){
-                            if (debug) debugPrintln("Read properties file " + f);                                
-                            cacheProps.load(SecuritySupport.getFileInputStream(f));
-                        }
-                    }
-                }
-            }
-            factoryClassName = cacheProps.getProperty(propertyName);            
-            if (debug) debugPrintln("found " + factoryClassName + " in $java.home/jaxp.properties"); 
-
-            if (factoryClassName != null) {
-                sf = createInstance(factoryClassName);
-                if(sf != null){
-                    return sf;
-                }
-            }
-        } catch (Exception ex) {
-            if (debug) {
-                ex.printStackTrace();
-            } 
-        }
-                    
-        // try META-INF/services files
-        Iterator sitr = createServiceFileIterator();
-        while(sitr.hasNext()) {
-            URL resource = (URL)sitr.next();
-            if (debug) debugPrintln("looking into " + resource);
-            try {
-                sf = loadFromServicesFile(uri, resource.toExternalForm(), SecuritySupport.getURLInputStream(resource));
-                if(sf!=null)    return sf;
-            } catch(IOException e) {
-                if( debug ) {
-                    debugPrintln("failed to read "+resource);
-                    e.printStackTrace();
-                }
-            }
-        }
-        
-        // platform default
-        if(uri.equals(XPathFactory.DEFAULT_OBJECT_MODEL_URI)) {
-            if (debug) debugPrintln("attempting to use the platform default W3C DOM XPath lib");
-            return createInstance("org.apache.xpath.jaxp.XPathFactoryImpl");
-        }
-        
-        if (debug) debugPrintln("all things were tried, but none was found. bailing out.");
-        return null;
-    }
-    
-    /**
-     * <p>Creates an instance of the specified and returns it.</p>
-     * 
-     * @param className
-     *      fully qualified class name to be instanciated.
-     * 
-     * @return null
-     *      if it fails. Error messages will be printed by this method. 
-     */
-    private XPathFactory createInstance( String className ) {
-        try {
-            if (debug) debugPrintln("instanciating "+className);
-            Class clazz;
-            if( classLoader!=null )
-                clazz = classLoader.loadClass(className);
-            else
-                clazz = Class.forName(className);
-            if(debug)       debugPrintln("loaded it from "+which(clazz));
-            Object o = clazz.newInstance();
-            
-            if( o instanceof XPathFactory )
-                return (XPathFactory)o;
-            
-            if (debug) debugPrintln(className+" is not assignable to "+SERVICE_CLASS.getName());
-        } catch( Throwable t ) {
-            if (debug) {
-                debugPrintln("failed to instanciate "+className);
-                t.printStackTrace();
-            }
-        }
-        return null;
-    }
-    
-    /** Iterator that lazily computes one value and returns it. */
-    private static abstract class SingleIterator implements Iterator {
-        private boolean seen = false;
-        
-        public final void remove() { throw new UnsupportedOperationException(); }
-        public final boolean hasNext() { return !seen; }
-        public final Object next() {
-            if(seen)    throw new NoSuchElementException();
-            seen = true;
-            return value();
-        }
-        
-        protected abstract Object value();
-    }
-    
-    /** Searches for a XPathFactory for a given uri in a META-INF/services file. */
-    private XPathFactory loadFromServicesFile(String uri, String resourceName, InputStream in) {
-
-        if (debug) debugPrintln("Reading " + resourceName );
-        
-        BufferedReader rd;
-        try {
-            rd = new BufferedReader(new InputStreamReader(in, "UTF-8"), DEFAULT_LINE_LENGTH);
-        } catch (java.io.UnsupportedEncodingException e) {
-            rd = new BufferedReader(new InputStreamReader(in), DEFAULT_LINE_LENGTH);
-        }
-        
-        String factoryClassName = null;
-        XPathFactory resultFactory = null;
-        // See spec for provider-configuration files: http://java.sun.com/j2se/1.5.0/docs/guide/jar/jar.html#Provider%20Configuration%20File
-        while (true) {
-            try {
-                factoryClassName = rd.readLine();   
-            } catch (IOException x) {
-                // No provider found
-                break;
-            }
-            if (factoryClassName != null) {
-                // Ignore comments in the provider-configuration file
-                int hashIndex = factoryClassName.indexOf('#');
-                if (hashIndex != -1) {
-                    factoryClassName = factoryClassName.substring(0, hashIndex);
-                }
-                
-                // Ignore leading and trailing whitespace
-                factoryClassName = factoryClassName.trim();
-                
-                // If there's no text left or if this was a blank line, go to the next one.
-                if (factoryClassName.length() == 0) {
-                    continue;
-                }
-                
-                try {
-                    // Found the right XPathFactory if its isObjectModelSupported(String uri) method returns true.
-                    XPathFactory foundFactory = (XPathFactory) createInstance(factoryClassName);
-                    if (foundFactory.isObjectModelSupported(uri)) {
-                        resultFactory = foundFactory;
-                        break;
-                    }
-                }
-                catch (Exception e) {}
-            }
-            else {
-                break;
-            }
-        }
-        
-        try {
-            // try to close the reader.
-            rd.close();
-        }
-        // Ignore the exception.
-        catch (IOException exc) {}
-        
-        return resultFactory;
-    }
-        
-    /**
-     * Returns an {@link Iterator} that enumerates all 
-     * the META-INF/services files that we care.
-     */
-    private Iterator createServiceFileIterator() {
-        if (classLoader == null) {
-            return new SingleIterator() {
-                protected Object value() {
-                    ClassLoader classLoader = XPathFactoryFinder.class.getClassLoader();
-                    return SecuritySupport.getResourceAsURL(classLoader, SERVICE_ID);
-                    //return (ClassLoader.getSystemResource( SERVICE_ID ));
-                }
-            };
-        } else {
-            try {
-                //final Enumeration e = classLoader.getResources(SERVICE_ID);
-                final Enumeration e = SecuritySupport.getResources(classLoader, SERVICE_ID);
-                if (debug && !e.hasMoreElements()) {
-                    debugPrintln("no "+SERVICE_ID+" file was found");
-                }
-                
-                // wrap it into an Iterator.
-                return new Iterator() {
-                    public void remove() {
-                        throw new UnsupportedOperationException();
-                    }
-
-                    public boolean hasNext() {
-                        return e.hasMoreElements();
-                    }
-
-                    public Object next() {
-                        return e.nextElement();
-                    }
-                };
-            } catch (IOException e) {
-                if (debug) {
-                    debugPrintln("failed to enumerate resources "+SERVICE_ID);
-                    e.printStackTrace();
-                }
-                return new ArrayList().iterator();  // empty iterator
-            }
-        }
-    }
-    
-    private static final Class SERVICE_CLASS = XPathFactory.class;
-    private static final String SERVICE_ID = "META-INF/services/" + SERVICE_CLASS.getName();
-    
-    
-    
-    private static String which( Class clazz ) {
-        return which( clazz.getName(), clazz.getClassLoader() );
-    }
-
-    /**
-     * <p>Search the specified classloader for the given classname.</p>
-     *
-     * @param classname the fully qualified name of the class to search for
-     * @param loader the classloader to search
-     * 
-     * @return the source location of the resource, or null if it wasn't found
-     */
-    private static String which(String classname, ClassLoader loader) {
-
-        String classnameAsResource = classname.replace('.', '/') + ".class";
-        
-        if( loader==null )  loader = ClassLoader.getSystemClassLoader();
-        
-        //URL it = loader.getResource(classnameAsResource);
-        URL it = SecuritySupport.getResourceAsURL(loader, classnameAsResource);
-        if (it != null) {
-            return it.toString();
-        } else {
-            return null;
-        }
-    }
-}
diff --git a/trunk/jaxp-api-1.4/src/main/java/org/xml/sax/helpers/SecuritySupport.java b/trunk/jaxp-api-1.4/src/main/java/org/xml/sax/helpers/SecuritySupport.java
deleted file mode 100644
index 38767de..0000000
--- a/trunk/jaxp-api-1.4/src/main/java/org/xml/sax/helpers/SecuritySupport.java
+++ /dev/null
@@ -1,93 +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.xml.sax.helpers;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.InputStream;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-
-/**
- * This class is duplicated for each JAXP subpackage so keep it in sync.
- * It is package private and therefore is not exposed as part of the JAXP
- * API.
- *
- * Security related methods that only work on J2SE 1.2 and newer.
- */
-final class SecuritySupport {
-    
-    private SecuritySupport() {}
-
-    static ClassLoader getContextClassLoader() {
-	return (ClassLoader)
-		AccessController.doPrivileged(new PrivilegedAction() {
-	    public Object run() {
-		ClassLoader cl = null;
-		try {
-		    cl = Thread.currentThread().getContextClassLoader();
-		} catch (SecurityException ex) { }
-		return cl;
-	    }
-	});
-    }
-
-    static String getSystemProperty(final String propName) {
-	return (String)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    return System.getProperty(propName);
-                }
-            });
-    }
-
-    static FileInputStream getFileInputStream(final File file)
-        throws FileNotFoundException
-    {
-	try {
-            return (FileInputStream)
-                AccessController.doPrivileged(new PrivilegedExceptionAction() {
-                    public Object run() throws FileNotFoundException {
-                        return new FileInputStream(file);
-                    }
-                });
-	} catch (PrivilegedActionException e) {
-	    throw (FileNotFoundException)e.getException();
-	}
-    }
-
-    static InputStream getResourceAsStream(final ClassLoader cl,
-                                           final String name)
-    {
-        return (InputStream)
-            AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    InputStream ris;
-                    if (cl == null) {
-                        ris = ClassLoader.getSystemResourceAsStream(name);
-                    } else {
-                        ris = cl.getResourceAsStream(name);
-                    }
-                    return ris;
-                }
-            });
-    }
-}
diff --git a/trunk/jaxp-api-1.4/src/main/java/org/xml/sax/helpers/XMLReaderFactory.java b/trunk/jaxp-api-1.4/src/main/java/org/xml/sax/helpers/XMLReaderFactory.java
deleted file mode 100644
index 201bb06..0000000
--- a/trunk/jaxp-api-1.4/src/main/java/org/xml/sax/helpers/XMLReaderFactory.java
+++ /dev/null
@@ -1,264 +0,0 @@
-// XMLReaderFactory.java - factory for creating a new reader.
-// http://www.saxproject.org
-// Written by David Megginson
-// and by David Brownell
-// NO WARRANTY!  This class is in the Public Domain.
-// $Id: XMLReaderFactory.java 670295 2008-06-22 01:46:43Z mrglavas $
-
-package org.xml.sax.helpers;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import org.xml.sax.XMLReader;
-import org.xml.sax.SAXException;
-
-
-/**
- * Factory for creating an XML reader.
- *
- * <blockquote>
- * <em>This module, both source code and documentation, is in the
- * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
- * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
- * for further information.
- * </blockquote>
- *
- * <p>This class contains static methods for creating an XML reader
- * from an explicit class name, or based on runtime defaults:</p>
- *
- * <pre>
- * try {
- *   XMLReader myReader = XMLReaderFactory.createXMLReader();
- * } catch (SAXException e) {
- *   System.err.println(e.getMessage());
- * }
- * </pre>
- *
- * <p><strong>Note to Distributions bundled with parsers:</strong>
- * You should modify the implementation of the no-arguments
- * <em>createXMLReader</em> to handle cases where the external
- * configuration mechanisms aren't set up.  That method should do its
- * best to return a parser when one is in the class path, even when
- * nothing bound its class name to <code>org.xml.sax.driver</code> so
- * those configuration mechanisms would see it.</p>
- *
- * @since SAX 2.0
- * @author David Megginson, David Brownell
- * @version 2.0.1 (sax2r2)
- */
-final public class XMLReaderFactory
-{
-    /**
-     * Private constructor.
-     *
-     * <p>This constructor prevents the class from being instantiated.</p>
-     */
-    private XMLReaderFactory ()
-    {
-    }
-    
-    private static final String property = "org.xml.sax.driver";
-    
-    /**
-     * Default columns per line.
-     */
-    private static final int DEFAULT_LINE_LENGTH = 80;
-    
-    /**
-     * Attempt to create an XMLReader from system defaults.
-     * In environments which can support it, the name of the XMLReader
-     * class is determined by trying each these options in order, and
-     * using the first one which succeeds:</p> <ul>
-     *
-     * <li>If the system property <code>org.xml.sax.driver</code>
-     * has a value, that is used as an XMLReader class name. </li>
-     *
-     * <li>The JAR "Services API" is used to look for a class name
-     * in the <em>META-INF/services/org.xml.sax.driver</em> file in
-     * jarfiles available to the runtime.</li>
-     *
-     * <li> SAX parser distributions are strongly encouraged to provide
-     * a default XMLReader class name that will take effect only when
-     * previous options (on this list) are not successful.</li>
-     *
-     * <li>Finally, if {@link ParserFactory#makeParser()} can
-     * return a system default SAX1 parser, that parser is wrapped in
-     * a {@link ParserAdapter}.  (This is a migration aid for SAX1
-     * environments, where the <code>org.xml.sax.parser</code> system
-     * property will often be usable.) </li>
-     *
-     * </ul>
-     *
-     * <p> In environments such as small embedded systems, which can not
-     * support that flexibility, other mechanisms to determine the default
-     * may be used. </p>
-     *
-     * <p>Note that many Java environments allow system properties to be
-     * initialized on a command line.  This means that <em>in most cases</em>
-     * setting a good value for that property ensures that calls to this
-     * method will succeed, except when security policies intervene.
-     * This will also maximize application portability to older SAX
-     * environments, with less robust implementations of this method.
-     * </p>
-     *
-     * @return A new XMLReader.
-     * @exception org.xml.sax.SAXException If no default XMLReader class
-     *            can be identified and instantiated.
-     * @see #createXMLReader(java.lang.String)
-     */
-    public static XMLReader createXMLReader ()
-    throws SAXException
-    {
-        String		className = null;
-        ClassLoader	loader = NewInstance.getClassLoader ();
-        
-        // 1. try the JVM-instance-wide system property
-        try { className = SecuritySupport.getSystemProperty (property); }
-        catch (Exception e) { /* normally fails for applets */ }
-        
-        // 2. if that fails, try META-INF/services/
-        if (className == null || className.length() == 0) {
-            String      service = "META-INF/services/" + property;
-            
-	        try {
-	            // If we are deployed into an OSGi environment, leverage it
-	            Class<? extends XMLReader> spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(XMLReader.class, property);
-	            if (spiClass != null) {
-	                return spiClass.newInstance();
-	            }
-	        } catch (Throwable e) {
-	        }
-
-            InputStream is = null;
-            className = null;
-            
-            // First try the Context ClassLoader
-            ClassLoader cl = SecuritySupport.getContextClassLoader();
-            if (cl != null) {
-                is = SecuritySupport.getResourceAsStream(cl, service);
-                
-                // If no provider found then try the current ClassLoader
-                if (is == null) {
-                    cl = XMLReaderFactory.class.getClassLoader();
-                    is = SecuritySupport.getResourceAsStream(cl, service);
-                }
-            } else {
-                // No Context ClassLoader or JDK 1.1 so try the current
-                // ClassLoader
-                cl = XMLReaderFactory.class.getClassLoader();
-                is = SecuritySupport.getResourceAsStream(cl, service);
-            }
-            
-            if (is != null) {
-                
-                // Read the service provider name in UTF-8 as specified in
-                // the jar spec.  Unfortunately this fails in Microsoft
-                // VJ++, which does not implement the UTF-8
-                // encoding. Theoretically, we should simply let it fail in
-                // that case, since the JVM is obviously broken if it
-                // doesn't support such a basic standard.  But since there
-                // are still some users attempting to use VJ++ for
-                // development, we have dropped in a fallback which makes a
-                // second attempt using the platform's default encoding. In
-                // VJ++ this is apparently ASCII, which is a subset of
-                // UTF-8... and since the strings we'll be reading here are
-                // also primarily limited to the 7-bit ASCII range (at
-                // least, in English versions), this should work well
-                // enough to keep us on the air until we're ready to
-                // officially decommit from VJ++. [Edited comment from
-                // jkesselm]
-                BufferedReader rd;
-                try {
-                    rd = new BufferedReader(new InputStreamReader(is, "UTF-8"), DEFAULT_LINE_LENGTH);
-                } catch (java.io.UnsupportedEncodingException e) {
-                    rd = new BufferedReader(new InputStreamReader(is), DEFAULT_LINE_LENGTH);
-                }
-                
-                try {
-                    // XXX Does not handle all possible input as specified by the
-                    // Jar Service Provider specification
-                    className = rd.readLine();
-                } 
-                catch (Exception x) {
-                    // No provider found
-                } 
-                finally {
-                    try { 
-                        // try to close the reader. 
-                        rd.close(); 
-                    } 
-                    // Ignore the exception. 
-                    catch (IOException exc) {}
-                }
-            }
-        }
-        
-        // 3. Distro-specific fallback
-        if (className == null) {
-            // BEGIN DISTRIBUTION-SPECIFIC
-            
-            // EXAMPLE:
-            // className = "com.example.sax.XmlReader";
-            // or a $JAVA_HOME/jre/lib/*properties setting...
-            className = "com.sun.org.apache.xerces.internal.parsers.SAXParser";
-            
-            // END DISTRIBUTION-SPECIFIC
-        }
-        
-        // do we know the XMLReader implementation class yet?
-        if (className != null)
-            return loadClass (loader, className);
-        
-        // 4. panic -- adapt any SAX1 parser
-        try {
-            return new ParserAdapter (ParserFactory.makeParser ());
-        } catch (Exception e) {
-            throw new SAXException ("Can't create default XMLReader; "
-                    + "is system property org.xml.sax.driver set?");
-        }
-    }
-    
-    
-    /**
-     * Attempt to create an XML reader from a class name.
-     *
-     * <p>Given a class name, this method attempts to load
-     * and instantiate the class as an XML reader.</p>
-     *
-     * <p>Note that this method will not be usable in environments where
-     * the caller (perhaps an applet) is not permitted to load classes
-     * dynamically.</p>
-     *
-     * @return A new XML reader.
-     * @exception org.xml.sax.SAXException If the class cannot be
-     *            loaded, instantiated, and cast to XMLReader.
-     * @see #createXMLReader()
-     */
-    public static XMLReader createXMLReader (String className)
-    throws SAXException
-    {
-        return loadClass (NewInstance.getClassLoader (), className);
-    }
-    
-    private static XMLReader loadClass (ClassLoader loader, String className)
-    throws SAXException
-    {
-        try {
-            return (XMLReader) NewInstance.newInstance (loader, className);
-        } catch (ClassNotFoundException e1) {
-            throw new SAXException("SAX2 driver class " + className +
-                    " not found", e1);
-        } catch (IllegalAccessException e2) {
-            throw new SAXException("SAX2 driver class " + className +
-                    " found but cannot be loaded", e2);
-        } catch (InstantiationException e3) {
-            throw new SAXException("SAX2 driver class " + className +
-                    " loaded but cannot be instantiated (no empty public constructor?)",
-                    e3);
-        } catch (ClassCastException e4) {
-            throw new SAXException("SAX2 driver class " + className +
-                    " does not implement XMLReader", e4);
-        }
-    }
-}
diff --git a/trunk/jaxws-api-2.0/pom.xml b/trunk/jaxws-api-2.0/pom.xml
deleted file mode 100644
index bf32600..0000000
--- a/trunk/jaxws-api-2.0/pom.xml
+++ /dev/null
@@ -1,242 +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.specs</groupId>
-        <artifactId>specs</artifactId>
-        <version>2.1.0</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.specs</groupId>
-    <artifactId>org.apache.servicemix.specs.jaxws-api-2.0</artifactId>
-    <packaging>bundle</packaging>
-    <version>2.1.0</version>
-    <name>Apache ServiceMix :: Specs :: JAXWS API 2.0</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.axis2</groupId>
-            <artifactId>axis2-jaxws-api</artifactId>
-            <version>1.3</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>commons-logging</groupId>
-                    <artifactId>commons-logging</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.apache.axis2</groupId>
-                    <artifactId>axis2-saaj-api</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>javax.xml.bind</groupId>
-                    <artifactId>jaxb-api</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>jaxen</groupId>
-                    <artifactId>jaxen</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.apache.ws.commons.axiom</groupId>
-                    <artifactId>axiom-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-dom</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>javax.mail</groupId>
-                    <artifactId>mail</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>xalan</groupId>
-                    <artifactId>xalan</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.codehaus.woodstox</groupId>
-                    <artifactId>wstx-asl</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>xerces</groupId>
-                    <artifactId>xercesImpl</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>commons-io</groupId>
-                    <artifactId>commons-io</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.apache.geronimo.specs</groupId>
-                    <artifactId>geronimo-stax-api_1.0_spec</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.jaxb-api-2.0</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.saaj-api-1.3</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.stax-api-1.0</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-ws-metadata_2.0_spec</artifactId>
-            <version>1.1.2</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Description>${project.description}</Bundle-Description>
-                        <Export-Package>javax.xml.ws*;version=2.0;-split-package:=merge-first;-noimport:=true</Export-Package>
-                        <Import-Package>*</Import-Package>
-                        <Private-Package>org.apache.servicemix.specs.locator;-split-package:=merge-first</Private-Package>
-                        <Bundle-Activator>org.apache.servicemix.specs.locator.Activator</Bundle-Activator>
-                        <Implementation-Title>Apache ServiceMix</Implementation-Title>
-                        <Implementation-Version>${project.version}</Implementation-Version>
-                    </instructions>
-                    <unpackBundle>true</unpackBundle>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <artifactSet>
-                                <includes>
-                                    <include>org.apache.axis2:axis2-jaxws-api</include>
-                                    <include>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</include>
-                                </includes>
-                            </artifactSet>
-                            <filters>
-                                <filter>
-                                    <artifact>org.apache.axis2:axis2-jaxws-api</artifact>
-                                    <excludes>
-                                        <exclude>javax/**</exclude>
-                                    </excludes>
-                                </filter>
-                                <filter>
-                                    <artifact>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</artifact>
-                                    <excludes>
-                                        <exclude>org/**</exclude>
-                                    </excludes>
-                                </filter>
-                            </filters>
-                            <createSourcesJar>${createSourcesJar}</createSourcesJar>
-                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-                            <createDependencyReducedPom>true</createDependencyReducedPom>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>deploy</id>
-            <properties>
-                <createSourcesJar>true</createSourcesJar>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-dependency-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>unpack-sources</id>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>unpack</goal>
-                                </goals>
-                                <configuration>
-                                    <artifactItems>
-                                        <artifactItem>
-                                            <groupId>org.apache.axis2</groupId>
-                                            <artifactId>axis2-jaxws-api</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                        <artifactItem>
-                                            <groupId>org.apache.servicemix.specs</groupId>
-                                            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                    </artifactItems>
-                                    <outputDirectory>${project.build.directory}/sources</outputDirectory>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>package</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <minmemory>128m</minmemory>
-                            <maxmemory>512m</maxmemory>
-                            <sourcepath>${project.build.directory}/sources</sourcepath>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
diff --git a/trunk/jaxws-api-2.0/src/main/java/javax/xml/ws/spi/FactoryFinder.java b/trunk/jaxws-api-2.0/src/main/java/javax/xml/ws/spi/FactoryFinder.java
deleted file mode 100644
index 54cefca..0000000
--- a/trunk/jaxws-api-2.0/src/main/java/javax/xml/ws/spi/FactoryFinder.java
+++ /dev/null
@@ -1,302 +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 javax.xml.ws.spi;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.security.PrivilegedAction;
-import java.util.Properties;
-
-/**
- * This code is designed to implement the pluggability
- * feature and is designed to both compile and run on JDK version 1.1 and
- * later.  The code also runs both as part of an unbundled jar file and
- * when bundled as part of the JDK.
- * <p/>
- * This class is duplicated for each subpackage so keep it in sync.
- * It is package private and therefore is not exposed as part of the JAXRPC
- * API.
- */
-class FactoryFinder {
-    /**
-     * Set to true for debugging.
-     */
-    private static final boolean debug = false;
-
-    private static void debugPrintln(String msg) {
-        if (debug) {
-            System.err.println("Factory Finder:" + msg);
-        }
-    }
-
-    /**
-     * Figure out which ClassLoader to use.  For JDK 1.2 and later use
-     * the context ClassLoader.
-     *
-     * @return the <code>ClassLoader</code>
-     * @throws ConfigurationError if this class is unable to work with the
-     *                            host JDK
-     */
-    private static ClassLoader findClassLoader()
-            throws ConfigurationError {
-        // REVIEW This doPriv block may be unnecessary because this method is private and 
-        // the caller already has a doPriv.  I added the doPriv in case someone changes the 
-        // visibility of this method to non-private.
-        ClassLoader cl = (ClassLoader)
-            doPrivileged( new PrivilegedAction() {
-                public Object run() {
-                
-                    Method m = null;
-
-                    try {
-
-                        m = Thread.class.getMethod("getContextClassLoader", (Class []) null);
-                    } catch (NoSuchMethodException e) {
-                        // Assume that we are running JDK 1.1, use the current ClassLoader
-                        debugPrintln("assuming JDK 1.1");
-                        return FactoryFinder.class.getClassLoader();
-                    }
-
-                    try {
-                        return (ClassLoader) m.invoke(Thread.currentThread(), (Object []) null);
-                    } catch (IllegalAccessException e) {
-                        // assert(false)
-                        throw new ConfigurationError("Unexpected IllegalAccessException",
-                                e);
-                    } catch (InvocationTargetException e) {
-                        // assert(e.getTargetException() instanceof SecurityException)
-                        throw new ConfigurationError("Unexpected InvocationTargetException",
-                                e);
-                    }
-                }
-            }
-        );
-        return cl;
-        
-    }
-
-    /**
-     * Create an instance of a class using the specified
-     * <code>ClassLoader</code>, or if that fails from the
-     * <code>ClassLoader</code> that loaded this class.
-     *
-     * @param className   the name of the class to instantiate
-     * @param classLoader a <code>ClassLoader</code> to load the class from
-     * @return a new <code>Object</code> that is an instance of the class of
-     *         the given name from the given class loader
-     * @throws ConfigurationError if the class could not be found or
-     *                            instantiated
-     */
-    private static Object newInstance(String className,
-                                      ClassLoader classLoader)
-            throws ConfigurationError {
-        
-        final ClassLoader iClassLoader = classLoader;
-        final String iClassName = className;
-        
-        // REVIEW This doPriv block may be unnecessary because this method is private and 
-        // the caller already has a doPriv.  I added the doPriv in case someone changes the 
-        // visibility of this method to non-private.
-        Object obj = 
-            doPrivileged( new PrivilegedAction() {
-                public Object run() {
-                    try {
-                        if (iClassLoader != null) {
-                            try {
-                                return iClassLoader.loadClass(iClassName).newInstance();
-                            } catch (ClassNotFoundException x) {
-                                // try again
-                            }
-                        }
-                        return Class.forName(iClassName).newInstance();
-                    } catch (ClassNotFoundException x) {
-                        throw new ConfigurationError(
-                                "Provider " + iClassName + " not found", x);
-                    } catch (Exception x) {
-                        throw new ConfigurationError(
-                                "Provider " + iClassName + " could not be instantiated: " + x,
-                                x);
-                    }
-                }
-            });
-        return obj;
-    }
-
-    /**
-     * Finds the implementation Class object in the specified order.  Main
-     * entry point.
-     *
-     * @param factoryId         Name of the factory to find, same as
-     *                          a property name
-     * @param fallbackClassName Implementation class name, if nothing else
-     *                          is found.  Use null to mean no fallback.
-     * @return Class object of factory, never null
-     * @throws FactoryFinder.ConfigurationError
-     *          Package private so this code can be shared.
-     */
-    static Object find(String factoryId, String fallbackClassName)
-            throws ConfigurationError {
-        
-        final String iFactoryId = factoryId;
-        final String iFallbackClassName = fallbackClassName;
-        
-        Object obj = 
-            doPrivileged( new PrivilegedAction() {
-                public Object run() {
-                    debugPrintln("debug is on");
-                    
-                    ClassLoader classLoader = findClassLoader();
-                    
-			        try {
-			            // If we are deployed into an OSGi environment, leverage it
-                        Class factoryClass = FactoryFinder.class.getClassLoader().loadClass(iFactoryId);
-                        Class spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(factoryClass, iFactoryId);
-			            if (spiClass != null) {
-			                return spiClass.newInstance();
-			            }
-			        } catch (Throwable e) {
-			        }
-			
-                    // Use the system property first
-                    try {
-                        String systemProp =
-                            System.getProperty(iFactoryId);
-                        if (systemProp != null) {
-                            debugPrintln("found system property " + systemProp);
-                            return newInstance(systemProp, classLoader);
-                        }
-                    } catch (SecurityException se) {
-                    }
-                    
-                    // try to read from $java.home/lib/xml.properties
-                    try {
-                        String javah = System.getProperty("java.home");
-                        String configFile = javah + File.separator +
-                        "lib" + File.separator + "jaxrpc.properties";
-                        File f = new File(configFile);
-                        if (f.exists()) {
-                            Properties props = new Properties();
-                            props.load(new FileInputStream(f));
-                            String factoryClassName = props.getProperty(iFactoryId);
-                            debugPrintln("found java.home property " + factoryClassName);
-                            return newInstance(factoryClassName, classLoader);
-                        }
-                    } catch (Exception ex) {
-                        if (debug) ex.printStackTrace();
-                    }
-                    
-                    String serviceId = "META-INF/services/" + iFactoryId;
-                    // try to find services in CLASSPATH
-                    try {
-                        InputStream is = null;
-                        if (classLoader == null) {
-                            is = ClassLoader.getSystemResourceAsStream(serviceId);
-                        } else {
-                            is = classLoader.getResourceAsStream(serviceId);
-                        }
-                        
-                        if (is != null) {
-                            debugPrintln("found " + serviceId);
-                            
-                            // Read the service provider name in UTF-8 as specified in
-                            // the jar spec.  Unfortunately this fails in Microsoft
-                            // VJ++, which does not implement the UTF-8
-                            // encoding. Theoretically, we should simply let it fail in
-                            // that case, since the JVM is obviously broken if it
-                            // doesn't support such a basic standard.  But since there
-                            // are still some users attempting to use VJ++ for
-                            // development, we have dropped in a fallback which makes a
-                            // second attempt using the platform's default encoding. In
-                            // VJ++ this is apparently ASCII, which is a subset of
-                            // UTF-8... and since the strings we'll be reading here are
-                            // also primarily limited to the 7-bit ASCII range (at
-                            // least, in English versions), this should work well
-                            // enough to keep us on the air until we're ready to
-                            // officially decommit from VJ++. [Edited comment from
-                            // jkesselm]
-                            BufferedReader rd;
-                            try {
-                                rd = new BufferedReader(new InputStreamReader(is, "UTF-8"));
-                            } catch (java.io.UnsupportedEncodingException e) {
-                                rd = new BufferedReader(new InputStreamReader(is));
-                            }
-                            
-                            String factoryClassName = rd.readLine();
-                            rd.close();
-                            
-                            if (factoryClassName != null &&
-                                    ! "".equals(factoryClassName)) {
-                                debugPrintln("loaded from services: " + factoryClassName);
-                                return newInstance(factoryClassName, classLoader);
-                            }
-                        }
-                    } catch (Exception ex) {
-                        if (debug) ex.printStackTrace();
-                    }
-                    
-                    if (iFallbackClassName == null) {
-                        throw new ConfigurationError(
-                                "Provider for " + iFactoryId + " cannot be found", null);
-                    }
-                    
-                    debugPrintln("loaded from fallback value: " + iFallbackClassName);
-                    return newInstance(iFallbackClassName, classLoader);
-                }
-            });
-        return obj;
-    }
-
-    private static Object doPrivileged(PrivilegedAction action) {
-        SecurityManager sm = System.getSecurityManager();
-        if (sm == null) {
-            return(action.run());
-        } else {
-            return java.security.AccessController.doPrivileged(action);
-        }
-    }
-
-    static class ConfigurationError extends Error {
-        // fixme: should this be refactored to use the jdk1.4 exception
-        // wrapping?
-
-        private Exception exception;
-
-        /**
-         * Construct a new instance with the specified detail string and
-         * exception.
-         *
-         * @param msg the Message for this error
-         * @param x   an Exception that caused this failure, or null
-         */
-        ConfigurationError(String msg, Exception x) {
-            super(msg);
-            this.exception = x;
-        }
-
-        Exception getException() {
-            return exception;
-        }
-    }
-}
diff --git a/trunk/jaxws-api-2.1/pom.xml b/trunk/jaxws-api-2.1/pom.xml
deleted file mode 100644
index 529df5a..0000000
--- a/trunk/jaxws-api-2.1/pom.xml
+++ /dev/null
@@ -1,200 +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.specs</groupId>
-        <artifactId>specs</artifactId>
-        <version>2.1.0</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.specs</groupId>
-    <artifactId>org.apache.servicemix.specs.jaxws-api-2.1</artifactId>
-    <packaging>bundle</packaging>
-    <version>2.1.0</version>
-    <name>Apache ServiceMix :: Specs :: JAXWS API 2.1</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-jaxws_2.1_spec</artifactId>
-            <version>1.0</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.apache.geronimo.specs</groupId>
-                    <artifactId>geronimo-saaj_1.3_spec</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.apache.geronimo.specs</groupId>
-                    <artifactId>geronimo-stax_1.0_spec</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.apache.geronimo.specs</groupId>
-                    <artifactId>geronimo-activation_1.1_spec</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>javax.xml.bind</groupId>
-                    <artifactId>jaxb-api</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.jaxb-api-2.1</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.saaj-api-1.3</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.stax-api-1.0</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Description>${project.description}</Bundle-Description>
-                        <Export-Package>javax.xml.ws*;version=2.1;-split-package:=merge-first;-noimport:=true</Export-Package>
-                        <Import-Package>*</Import-Package>
-                        <Private-Package>org.apache.servicemix.specs.locator;-split-package:=merge-first</Private-Package>
-                        <Bundle-Activator>org.apache.servicemix.specs.locator.Activator</Bundle-Activator>
-                        <Implementation-Title>Apache ServiceMix</Implementation-Title>
-                        <Implementation-Version>${project.version}</Implementation-Version>
-                    </instructions>
-                    <unpackBundle>true</unpackBundle>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <artifactSet>
-                                <includes>
-                                    <include>org.apache.geronimo.specs:geronimo-jaxws_2.1_spec</include>
-                                    <include>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</include>
-                                </includes>
-                            </artifactSet>
-                            <filters>
-                                <filter>
-                                    <artifact>org.apache.geronimo.specs:geronimo-jaxws_2.1_spec</artifact>
-                                    <excludes>
-                                        <exclude>javax/**</exclude>
-                                    </excludes>
-                                </filter>
-                                <filter>
-                                    <artifact>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</artifact>
-                                    <excludes>
-                                        <exclude>org/**</exclude>
-                                    </excludes>
-                                </filter>
-                            </filters>
-                            <createSourcesJar>${createSourcesJar}</createSourcesJar>
-                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-                            <createDependencyReducedPom>true</createDependencyReducedPom>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>deploy</id>
-            <properties>
-                <createSourcesJar>true</createSourcesJar>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-dependency-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>unpack-sources</id>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>unpack</goal>
-                                </goals>
-                                <configuration>
-                                    <artifactItems>
-                                        <artifactItem>
-                                            <groupId>org.apache.geronimo.specs</groupId>
-                                            <artifactId>geronimo-jaxws_2.1_spec</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                        <artifactItem>
-                                            <groupId>org.apache.servicemix.specs</groupId>
-                                            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                    </artifactItems>
-                                    <outputDirectory>${project.build.directory}/sources</outputDirectory>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>package</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <minmemory>128m</minmemory>
-                            <maxmemory>512m</maxmemory>
-                            <sourcepath>${project.build.directory}/sources</sourcepath>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
diff --git a/trunk/jaxws-api-2.1/src/main/java/javax/xml/ws/spi/FactoryFinder.java b/trunk/jaxws-api-2.1/src/main/java/javax/xml/ws/spi/FactoryFinder.java
deleted file mode 100644
index 54cefca..0000000
--- a/trunk/jaxws-api-2.1/src/main/java/javax/xml/ws/spi/FactoryFinder.java
+++ /dev/null
@@ -1,302 +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 javax.xml.ws.spi;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.security.PrivilegedAction;
-import java.util.Properties;
-
-/**
- * This code is designed to implement the pluggability
- * feature and is designed to both compile and run on JDK version 1.1 and
- * later.  The code also runs both as part of an unbundled jar file and
- * when bundled as part of the JDK.
- * <p/>
- * This class is duplicated for each subpackage so keep it in sync.
- * It is package private and therefore is not exposed as part of the JAXRPC
- * API.
- */
-class FactoryFinder {
-    /**
-     * Set to true for debugging.
-     */
-    private static final boolean debug = false;
-
-    private static void debugPrintln(String msg) {
-        if (debug) {
-            System.err.println("Factory Finder:" + msg);
-        }
-    }
-
-    /**
-     * Figure out which ClassLoader to use.  For JDK 1.2 and later use
-     * the context ClassLoader.
-     *
-     * @return the <code>ClassLoader</code>
-     * @throws ConfigurationError if this class is unable to work with the
-     *                            host JDK
-     */
-    private static ClassLoader findClassLoader()
-            throws ConfigurationError {
-        // REVIEW This doPriv block may be unnecessary because this method is private and 
-        // the caller already has a doPriv.  I added the doPriv in case someone changes the 
-        // visibility of this method to non-private.
-        ClassLoader cl = (ClassLoader)
-            doPrivileged( new PrivilegedAction() {
-                public Object run() {
-                
-                    Method m = null;
-
-                    try {
-
-                        m = Thread.class.getMethod("getContextClassLoader", (Class []) null);
-                    } catch (NoSuchMethodException e) {
-                        // Assume that we are running JDK 1.1, use the current ClassLoader
-                        debugPrintln("assuming JDK 1.1");
-                        return FactoryFinder.class.getClassLoader();
-                    }
-
-                    try {
-                        return (ClassLoader) m.invoke(Thread.currentThread(), (Object []) null);
-                    } catch (IllegalAccessException e) {
-                        // assert(false)
-                        throw new ConfigurationError("Unexpected IllegalAccessException",
-                                e);
-                    } catch (InvocationTargetException e) {
-                        // assert(e.getTargetException() instanceof SecurityException)
-                        throw new ConfigurationError("Unexpected InvocationTargetException",
-                                e);
-                    }
-                }
-            }
-        );
-        return cl;
-        
-    }
-
-    /**
-     * Create an instance of a class using the specified
-     * <code>ClassLoader</code>, or if that fails from the
-     * <code>ClassLoader</code> that loaded this class.
-     *
-     * @param className   the name of the class to instantiate
-     * @param classLoader a <code>ClassLoader</code> to load the class from
-     * @return a new <code>Object</code> that is an instance of the class of
-     *         the given name from the given class loader
-     * @throws ConfigurationError if the class could not be found or
-     *                            instantiated
-     */
-    private static Object newInstance(String className,
-                                      ClassLoader classLoader)
-            throws ConfigurationError {
-        
-        final ClassLoader iClassLoader = classLoader;
-        final String iClassName = className;
-        
-        // REVIEW This doPriv block may be unnecessary because this method is private and 
-        // the caller already has a doPriv.  I added the doPriv in case someone changes the 
-        // visibility of this method to non-private.
-        Object obj = 
-            doPrivileged( new PrivilegedAction() {
-                public Object run() {
-                    try {
-                        if (iClassLoader != null) {
-                            try {
-                                return iClassLoader.loadClass(iClassName).newInstance();
-                            } catch (ClassNotFoundException x) {
-                                // try again
-                            }
-                        }
-                        return Class.forName(iClassName).newInstance();
-                    } catch (ClassNotFoundException x) {
-                        throw new ConfigurationError(
-                                "Provider " + iClassName + " not found", x);
-                    } catch (Exception x) {
-                        throw new ConfigurationError(
-                                "Provider " + iClassName + " could not be instantiated: " + x,
-                                x);
-                    }
-                }
-            });
-        return obj;
-    }
-
-    /**
-     * Finds the implementation Class object in the specified order.  Main
-     * entry point.
-     *
-     * @param factoryId         Name of the factory to find, same as
-     *                          a property name
-     * @param fallbackClassName Implementation class name, if nothing else
-     *                          is found.  Use null to mean no fallback.
-     * @return Class object of factory, never null
-     * @throws FactoryFinder.ConfigurationError
-     *          Package private so this code can be shared.
-     */
-    static Object find(String factoryId, String fallbackClassName)
-            throws ConfigurationError {
-        
-        final String iFactoryId = factoryId;
-        final String iFallbackClassName = fallbackClassName;
-        
-        Object obj = 
-            doPrivileged( new PrivilegedAction() {
-                public Object run() {
-                    debugPrintln("debug is on");
-                    
-                    ClassLoader classLoader = findClassLoader();
-                    
-			        try {
-			            // If we are deployed into an OSGi environment, leverage it
-                        Class factoryClass = FactoryFinder.class.getClassLoader().loadClass(iFactoryId);
-                        Class spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(factoryClass, iFactoryId);
-			            if (spiClass != null) {
-			                return spiClass.newInstance();
-			            }
-			        } catch (Throwable e) {
-			        }
-			
-                    // Use the system property first
-                    try {
-                        String systemProp =
-                            System.getProperty(iFactoryId);
-                        if (systemProp != null) {
-                            debugPrintln("found system property " + systemProp);
-                            return newInstance(systemProp, classLoader);
-                        }
-                    } catch (SecurityException se) {
-                    }
-                    
-                    // try to read from $java.home/lib/xml.properties
-                    try {
-                        String javah = System.getProperty("java.home");
-                        String configFile = javah + File.separator +
-                        "lib" + File.separator + "jaxrpc.properties";
-                        File f = new File(configFile);
-                        if (f.exists()) {
-                            Properties props = new Properties();
-                            props.load(new FileInputStream(f));
-                            String factoryClassName = props.getProperty(iFactoryId);
-                            debugPrintln("found java.home property " + factoryClassName);
-                            return newInstance(factoryClassName, classLoader);
-                        }
-                    } catch (Exception ex) {
-                        if (debug) ex.printStackTrace();
-                    }
-                    
-                    String serviceId = "META-INF/services/" + iFactoryId;
-                    // try to find services in CLASSPATH
-                    try {
-                        InputStream is = null;
-                        if (classLoader == null) {
-                            is = ClassLoader.getSystemResourceAsStream(serviceId);
-                        } else {
-                            is = classLoader.getResourceAsStream(serviceId);
-                        }
-                        
-                        if (is != null) {
-                            debugPrintln("found " + serviceId);
-                            
-                            // Read the service provider name in UTF-8 as specified in
-                            // the jar spec.  Unfortunately this fails in Microsoft
-                            // VJ++, which does not implement the UTF-8
-                            // encoding. Theoretically, we should simply let it fail in
-                            // that case, since the JVM is obviously broken if it
-                            // doesn't support such a basic standard.  But since there
-                            // are still some users attempting to use VJ++ for
-                            // development, we have dropped in a fallback which makes a
-                            // second attempt using the platform's default encoding. In
-                            // VJ++ this is apparently ASCII, which is a subset of
-                            // UTF-8... and since the strings we'll be reading here are
-                            // also primarily limited to the 7-bit ASCII range (at
-                            // least, in English versions), this should work well
-                            // enough to keep us on the air until we're ready to
-                            // officially decommit from VJ++. [Edited comment from
-                            // jkesselm]
-                            BufferedReader rd;
-                            try {
-                                rd = new BufferedReader(new InputStreamReader(is, "UTF-8"));
-                            } catch (java.io.UnsupportedEncodingException e) {
-                                rd = new BufferedReader(new InputStreamReader(is));
-                            }
-                            
-                            String factoryClassName = rd.readLine();
-                            rd.close();
-                            
-                            if (factoryClassName != null &&
-                                    ! "".equals(factoryClassName)) {
-                                debugPrintln("loaded from services: " + factoryClassName);
-                                return newInstance(factoryClassName, classLoader);
-                            }
-                        }
-                    } catch (Exception ex) {
-                        if (debug) ex.printStackTrace();
-                    }
-                    
-                    if (iFallbackClassName == null) {
-                        throw new ConfigurationError(
-                                "Provider for " + iFactoryId + " cannot be found", null);
-                    }
-                    
-                    debugPrintln("loaded from fallback value: " + iFallbackClassName);
-                    return newInstance(iFallbackClassName, classLoader);
-                }
-            });
-        return obj;
-    }
-
-    private static Object doPrivileged(PrivilegedAction action) {
-        SecurityManager sm = System.getSecurityManager();
-        if (sm == null) {
-            return(action.run());
-        } else {
-            return java.security.AccessController.doPrivileged(action);
-        }
-    }
-
-    static class ConfigurationError extends Error {
-        // fixme: should this be refactored to use the jdk1.4 exception
-        // wrapping?
-
-        private Exception exception;
-
-        /**
-         * Construct a new instance with the specified detail string and
-         * exception.
-         *
-         * @param msg the Message for this error
-         * @param x   an Exception that caused this failure, or null
-         */
-        ConfigurationError(String msg, Exception x) {
-            super(msg);
-            this.exception = x;
-        }
-
-        Exception getException() {
-            return exception;
-        }
-    }
-}
diff --git a/trunk/jaxws-api-2.2/pom.xml b/trunk/jaxws-api-2.2/pom.xml
deleted file mode 100644
index 30d732c..0000000
--- a/trunk/jaxws-api-2.2/pom.xml
+++ /dev/null
@@ -1,200 +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.specs</groupId>
-        <artifactId>specs</artifactId>
-        <version>2.1.0</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.specs</groupId>
-    <artifactId>org.apache.servicemix.specs.jaxws-api-2.2</artifactId>
-    <packaging>bundle</packaging>
-    <version>2.1.0</version>
-    <name>Apache ServiceMix :: Specs :: JAXWS API 2.2</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-jaxws_2.2_spec</artifactId>
-            <version>1.1</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.apache.geronimo.specs</groupId>
-                    <artifactId>geronimo-saaj_1.3_spec</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.apache.geronimo.specs</groupId>
-                    <artifactId>geronimo-stax_1.0_spec</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.apache.geronimo.specs</groupId>
-                    <artifactId>geronimo-activation_1.1_spec</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>javax.xml.bind</groupId>
-                    <artifactId>jaxb-api</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.jaxb-api-2.2</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.saaj-api-1.3</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.stax-api-1.0</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Description>${project.description}</Bundle-Description>
-                        <Export-Package>javax.xml.ws*;version=2.2;-split-package:=merge-first;-noimport:=true</Export-Package>
-                        <Import-Package>!org.apache.geronimo.osgi*, *</Import-Package>
-                        <Private-Package>org.apache.servicemix.specs.locator;-split-package:=merge-first</Private-Package>
-                        <Bundle-Activator>org.apache.servicemix.specs.locator.Activator</Bundle-Activator>
-                        <Implementation-Title>Apache ServiceMix</Implementation-Title>
-                        <Implementation-Version>${project.version}</Implementation-Version>
-                    </instructions>
-                    <unpackBundle>true</unpackBundle>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <artifactSet>
-                                <includes>
-                                    <include>org.apache.geronimo.specs:geronimo-jaxws_2.2_spec</include>
-                                    <include>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</include>
-                                </includes>
-                            </artifactSet>
-                            <filters>
-                                <filter>
-                                    <artifact>org.apache.geronimo.specs:geronimo-jaxws_2.2_spec</artifact>
-                                    <excludes>
-                                        <exclude>javax/**</exclude>
-                                    </excludes>
-                                </filter>
-                                <filter>
-                                    <artifact>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</artifact>
-                                    <excludes>
-                                        <exclude>org/**</exclude>
-                                    </excludes>
-                                </filter>
-                            </filters>
-                            <createSourcesJar>${createSourcesJar}</createSourcesJar>
-                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-                            <createDependencyReducedPom>true</createDependencyReducedPom>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>deploy</id>
-            <properties>
-                <createSourcesJar>true</createSourcesJar>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-dependency-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>unpack-sources</id>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>unpack</goal>
-                                </goals>
-                                <configuration>
-                                    <artifactItems>
-                                        <artifactItem>
-                                            <groupId>org.apache.geronimo.specs</groupId>
-                                            <artifactId>geronimo-jaxws_2.2_spec</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                        <artifactItem>
-                                            <groupId>org.apache.servicemix.specs</groupId>
-                                            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                    </artifactItems>
-                                    <outputDirectory>${project.build.directory}/sources</outputDirectory>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>package</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <minmemory>128m</minmemory>
-                            <maxmemory>512m</maxmemory>
-                            <sourcepath>${project.build.directory}/sources</sourcepath>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
diff --git a/trunk/jaxws-api-2.2/src/main/java/javax/xml/ws/spi/FactoryFinder.java b/trunk/jaxws-api-2.2/src/main/java/javax/xml/ws/spi/FactoryFinder.java
deleted file mode 100644
index a6ad195..0000000
--- a/trunk/jaxws-api-2.2/src/main/java/javax/xml/ws/spi/FactoryFinder.java
+++ /dev/null
@@ -1,263 +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 javax.xml.ws.spi;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.security.PrivilegedAction;
-import java.util.Properties;
-
-import org.apache.geronimo.osgi.locator.ProviderLocator;
-
-/**
- * This code is designed to implement the pluggability
- * feature and is designed to both compile and run on JDK version 1.1 and
- * later.  The code also runs both as part of an unbundled jar file and
- * when bundled as part of the JDK.
- * <p/>
- * This class is duplicated for each subpackage so keep it in sync.
- * It is package private and therefore is not exposed as part of the JAXRPC
- * API.
- */
-class FactoryFinder {
-    /**
-     * Set to true for debugging.
-     */
-    private static final boolean debug = false;
-
-    private static void debugPrintln(String msg) {
-        if (debug) {
-            System.err.println("Factory Finder:" + msg);
-        }
-    }
-
-    /**
-     * Figure out which ClassLoader to use.  For JDK 1.2 and later use
-     * the context ClassLoader.
-     *
-     * @return the <code>ClassLoader</code>
-     * @throws ConfigurationError if this class is unable to work with the
-     *                            host JDK
-     */
-    private static ClassLoader findClassLoader()
-            throws ConfigurationError {
-        // REVIEW This doPriv block may be unnecessary because this method is private and
-        // the caller already has a doPriv.  I added the doPriv in case someone changes the
-        // visibility of this method to non-private.
-        ClassLoader cl = (ClassLoader)
-            doPrivileged( new PrivilegedAction<Object>() {
-                public Object run() {
-
-                    Method m = null;
-
-                    try {
-
-                        m = Thread.class.getMethod("getContextClassLoader", (Class []) null);
-                    } catch (NoSuchMethodException e) {
-                        // Assume that we are running JDK 1.1, use the current ClassLoader
-                        debugPrintln("assuming JDK 1.1");
-                        return FactoryFinder.class.getClassLoader();
-                    }
-
-                    try {
-                        return (ClassLoader) m.invoke(Thread.currentThread(), (Object []) null);
-                    } catch (IllegalAccessException e) {
-                        // assert(false)
-                        throw new ConfigurationError("Unexpected IllegalAccessException",
-                                e);
-                    } catch (InvocationTargetException e) {
-                        // assert(e.getTargetException() instanceof SecurityException)
-                        throw new ConfigurationError("Unexpected InvocationTargetException",
-                                e);
-                    }
-                }
-            }
-        );
-        return cl;
-
-    }
-
-    /**
-     * Create an instance of a class using the specified
-     * <code>ClassLoader</code>, or if that fails from the
-     * <code>ClassLoader</code> that loaded this class.
-     *
-     * @param className   the name of the class to instantiate
-     * @param classLoader a <code>ClassLoader</code> to load the class from
-     * @return a new <code>Object</code> that is an instance of the class of
-     *         the given name from the given class loader
-     * @throws ConfigurationError if the class could not be found or
-     *                            instantiated
-     */
-    private static Object newInstance(String className,
-                                      ClassLoader classLoader)
-            throws ConfigurationError {
-
-        final ClassLoader iClassLoader = classLoader;
-        final String iClassName = className;
-
-        // REVIEW This doPriv block may be unnecessary because this method is private and
-        // the caller already has a doPriv.  I added the doPriv in case someone changes the
-        // visibility of this method to non-private.
-        Object obj =
-            doPrivileged( new PrivilegedAction<Object>() {
-                public Object run() {
-                    try {
-                        return ProviderLocator.loadClass(iClassName, FactoryFinder.class, iClassLoader).newInstance();
-                    } catch (ClassNotFoundException x) {
-                        throw new ConfigurationError(
-                                "Provider " + iClassName + " not found", x);
-                    } catch (Exception x) {
-                        throw new ConfigurationError(
-                                "Provider " + iClassName + " could not be instantiated: " + x,
-                                x);
-                    }
-                }
-            });
-        return obj;
-    }
-
-    /**
-     * Finds the implementation Class object in the specified order.  Main
-     * entry point.
-     *
-     * @param factoryId         Name of the factory to find, same as
-     *                          a property name
-     * @param fallbackClassName Implementation class name, if nothing else
-     *                          is found.  Use null to mean no fallback.
-     * @return Class object of factory, never null
-     * @throws FactoryFinder.ConfigurationError
-     *          Package private so this code can be shared.
-     */
-    static Object find(String factoryId, String fallbackClassName)
-            throws ConfigurationError {
-
-        final String iFactoryId = factoryId;
-        final String iFallbackClassName = fallbackClassName;
-
-        Object obj =
-            doPrivileged( new PrivilegedAction<Object>() {
-                public Object run() {
-                    debugPrintln("debug is on");
-
-                    // Section 6.2.1 of the jaxws spec gives lookup order as
-                    // 1.  META-INF/services definition
-                    // 2.  ${java.home}/lib/jaxws.properties file
-                    // 3.  System property
-                    // 4.  The default implementation class
-
-                    ClassLoader classLoader = findClassLoader();
-                    try {
-                        // If we are deployed into an OSGi environment, leverage it
-                        Class factoryClass = null;
-                        if (FactoryFinder.class.getClassLoader() != null) {
-                            factoryClass = FactoryFinder.class.getClassLoader().loadClass(iFactoryId);
-                        } else {
-                            factoryClass = Class.forName(iFactoryId);
-                        }
-                        Class spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(factoryClass, iFactoryId);
-                        if (spiClass != null) {
-                            return spiClass.newInstance();
-                        }
-                     } catch (Throwable e) {
-                        if (debug) e.printStackTrace();
-                     }
-
-                    try {
-                        // check the META-INF/services definitions, and return it if
-                        // we find something.
-                        Object service = ProviderLocator.getService(iFactoryId, FactoryFinder.class, classLoader);
-                        if (service != null) {
-                            return service;
-                        }
-                    } catch (Exception ex) {
-                        if (debug) ex.printStackTrace();
-                    }
-
-                    try {
-                        String factoryClassName =  ProviderLocator.lookupByJREPropertyFile("lib" + File.separator + "jaxrpc.properties", iFactoryId);
-                        if (factoryClassName != null) {
-                            debugPrintln("found java.home property " + factoryClassName);
-                            return newInstance(factoryClassName, classLoader);
-                        }
-                    } catch (Exception ex) {
-                        if (debug) ex.printStackTrace();
-                    }
-
-                    // Use the system property first
-                    try {
-                        String systemProp =
-                            System.getProperty(iFactoryId);
-                        if (systemProp != null) {
-                            debugPrintln("found system property " + systemProp);
-                            return newInstance(systemProp, classLoader);
-                        }
-                    } catch (SecurityException se) {
-                    }
-
-                    if (iFallbackClassName == null) {
-                        throw new ConfigurationError(
-                                "Provider for " + iFactoryId + " cannot be found", null);
-                    }
-
-                    debugPrintln("loaded from fallback value: " + iFallbackClassName);
-                    return newInstance(iFallbackClassName, classLoader);
-                }
-            });
-        return obj;
-    }
-
-    private static <T> T doPrivileged(PrivilegedAction<T> action) {
-        SecurityManager sm = System.getSecurityManager();
-        if (sm == null) {
-            return action.run();
-        } else {
-            return java.security.AccessController.doPrivileged(action);
-        }
-    }
-
-    static class ConfigurationError extends Error {
-        // fixme: should this be refactored to use the jdk1.4 exception
-        // wrapping?
-
-        private Exception exception;
-
-        /**
-         * Construct a new instance with the specified detail string and
-         * exception.
-         *
-         * @param msg the Message for this error
-         * @param x   an Exception that caused this failure, or null
-         */
-        ConfigurationError(String msg, Exception x) {
-            super(msg);
-            this.exception = x;
-        }
-
-        Exception getException() {
-            return exception;
-        }
-    }
-}
diff --git a/trunk/jbi-api-1.0/pom.xml b/trunk/jbi-api-1.0/pom.xml
deleted file mode 100644
index f4d5a34..0000000
--- a/trunk/jbi-api-1.0/pom.xml
+++ /dev/null
@@ -1,98 +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.specs</groupId>
-        <artifactId>specs</artifactId>
-        <version>2.1.0</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.specs</groupId>
-    <artifactId>org.apache.servicemix.specs.jbi-api-1.0</artifactId>
-    <packaging>bundle</packaging>
-    <version>2.1.0</version>
-    <name>Apache ServiceMix :: Specs :: JBI API 1.0</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-activation_1.1_spec</artifactId>
-            <version>1.0.2</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Description>${project.description}</Bundle-Description>
-                        <Export-Package>javax.jbi*;version=1.0;-split-package:=merge-first;-noimport:=true</Export-Package>
-                        <Import-Package>*</Import-Package>
-                        <Implementation-Title>Apache ServiceMix</Implementation-Title>
-                        <Implementation-Version>${project.version}</Implementation-Version>
-                    </instructions>
-                    <unpackBundle>true</unpackBundle>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>deploy</id>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>attach-javadocs</id>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-source-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>attach-sources</id>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-            
-</project>
diff --git a/trunk/jbi-api-1.0/src/main/java/javax/jbi/JBIException.java b/trunk/jbi-api-1.0/src/main/java/javax/jbi/JBIException.java
deleted file mode 100644
index 7427a7d..0000000
--- a/trunk/jbi-api-1.0/src/main/java/javax/jbi/JBIException.java
+++ /dev/null
@@ -1,48 +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 javax.jbi;
-
-/**
- * JBIException is the top-level exception thrown by all JBI system components.
- */
-public class JBIException extends Exception {
-
-    /**
-     * Creates a new instance of JBIException with an exception message.
-     * @param aMessage String describing this exception.
-     */
-    public JBIException(String aMessage) {
-        super(aMessage);
-    }
-
-    /**
-     * Creates a new instance of JBIException with the specified message and cause.
-     * @param aMessage String describing this exception.
-     * @param aCause Throwable which represents an underlying problem (or null).
-     */
-    public JBIException(String aMessage, Throwable aCause) {
-        super(aMessage, aCause);
-    }
-
-    /**
-     * Creates a new instance of JBIException with the specified cause.
-     * @param aCause Throwable which represents an underlying problem (or null).
-     */
-    public JBIException(Throwable aCause) {
-        super(aCause);
-    }
-}
diff --git a/trunk/jbi-api-1.0/src/main/java/javax/jbi/component/Bootstrap.java b/trunk/jbi-api-1.0/src/main/java/javax/jbi/component/Bootstrap.java
deleted file mode 100644
index 8fd5630..0000000
--- a/trunk/jbi-api-1.0/src/main/java/javax/jbi/component/Bootstrap.java
+++ /dev/null
@@ -1,116 +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 javax.jbi.component;
-
-import javax.jbi.JBIException;
-
-import javax.management.ObjectName;
-
-/**
- * This interface is implemented by a JBI Component to provide any
- * special processing required at install/uninstall time. The methods
- * defined here are called by the JBI implementation during the installation
- * (or uninstallation) of the component that, among other things, supplies
- * an implementation of this interface.
- *
- * Initialization/cleanup tasks such as creation/deletion of directories,
- * files, and database tables can be done by the onInstall() and onUninstall()
- * methods, respectively. This also allows the component to terminate the
- * installation or uninstallation in the event of an error.
- *
- * After calling onInstall() or onUninstall(), regardless of outcome, the JBI
- * implementation must call the cleanUp() method afterwards. Similarly, if
- * init(InstallationContext) fails with an exception, the JBI implementation
- * must call the cleanUp() method.
- *
- * Component implementors should note that there is no guarantee that the same
- * instance of its Bootstrap implementation will be used during both install
- * and uninstall operations on the component. Data that need to be retained
- * between installation-time and uninstallation-time must be persisted in such
- * as fashion that a separate instance of the bootstrap class can find them,
- * despite component or system shutdown.
- *
- * @author JSR208 Exert Group
- */
-public interface Bootstrap {
-
-    /**
-     * Initializes the installation environment for a component. This method is
-     * expected to save any information from the installation context that may
-     * be needed by other methods.
-     *
-     * If the component needs to register an optional installer configuration MBean,
-     * it MUST do so during execution of this method, or the getExtensionMBean()
-     * method.
-     *
-     * This method must be called after the installation root (available through
-     * the installContext parameter) is prepared. 
-
-     * @param installContext the context containing information from the install
-     *                       command and from the component installation ZIP file;
-     *                       this must be non-null.
-     * @throws JBIException  when there is an error requiring that the installation
-     *                       be terminated
-     */
-    void init(InstallationContext installContext) throws JBIException;
-
-    /**
-     * Cleans up any resources allocated by the bootstrap implementation,
-     * including performing deregistration of the extension MBean, if applicable.
-     *
-     * This method must be called after the onInstall() or onUninstall() method
-     * is called, whether it succeeds or fails. It must be called after init() is
-     * called, if init() fails by throwing an exception.
-     * 
-     * @throws JBIException if the bootstrap cannot clean up allocated resources
-     */
-    void cleanUp() throws JBIException;
-
-    /**
-     * Obtains the ObjectName of the optional installer configuration MBean. If
-     * none is provided by this component, this method must return null.
-     *
-     * This method must be called before onInstall() (or onUninstall()) is called
-     * by the JBI implementation.
-     *
-     * @return ObjectName of the optional installer configuration MBean; returns null
-     *         if there is no such MBean
-     */
-    ObjectName getExtensionMBeanName();
-
-    /**
-     * Called at the beginning of installation of a component to perform any special
-     * installation tasks required by the component.
-     *
-     * This method must not be called if the init() method failed with an exception.
-     *  
-     * @throws JBIException when there is an error requiring that the installation be
-     *         terminated
-     */
-    void onInstall() throws JBIException;
-
-    /**
-     * Called at the beginning of uninstallation of a component to perform any special
-     * uninstallation tasks required by the component.
-     *
-     * This method must not be called if the init() method failed with an exception.
-     *
-     * @throws JBIException when there is an error requiring that the uninstallation be
-     *         terminated.
-     */
-    void onUninstall() throws JBIException;
-}
diff --git a/trunk/jbi-api-1.0/src/main/java/javax/jbi/component/Component.java b/trunk/jbi-api-1.0/src/main/java/javax/jbi/component/Component.java
deleted file mode 100644
index d46a4cd..0000000
--- a/trunk/jbi-api-1.0/src/main/java/javax/jbi/component/Component.java
+++ /dev/null
@@ -1,127 +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 javax.jbi.component;
-
-import javax.jbi.messaging.MessageExchange;
-import javax.jbi.servicedesc.ServiceEndpoint;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.DocumentFragment;
-
-/**
- * This interface, implemented by component implementations, allows
- * the JBI implementation to query the component for various types
- * of information. This includes:
- * <ul>
- *   <li>The component's life cycle control interface.</li>
- *   <li>The component's service unit manager, for handling deployments.</li>
- *   <li>A method for querying service metadata describing services
- *       provided by this component.</li>
- *   <li>"Policy" methods that are called by the JBI implementation to
- *       query if proposed matches of this component to a provider (or
- *       consumer) are acceptable, according to this component's policies.</li>
- *   <li>Endpoint reference (EPR) resolution. Some components will provide
- *       the ability to resolve EPRs (typically binding components). This
- *       ability to resolve EPRs is used by JBI to facilitate resolution of
- *       EPRs received by service consumers.</li>
- *
- * The name of the class that implements this interface for a component is
- * specified in the installation descriptor for that component.
- *
- * @author JSR208 Exert Group
- */
-public interface Component {
-
-    /**
-     * Get the life cycle control interface for this component. This interface
-     * allows the JBI implementation to control the running state of this component.
-     *
-     * This method must be called before any other methods of this interface are
-     * called. In addition, the JBI implementation must call the init() method of
-     * the component life cycle returned by this method before calling any other
-     * methods on this interface, or the component life cycle interface.
-     *
-     * @return the life cycle control interface for this component; must be non-null.
-     */
-    ComponentLifeCycle getLifeCycle();
-
-    /**
-     * Get the Service Unit manager for this component. If this component does not
-     * support deployments, it must return null.
-     *
-     * @return the ServiceUnitManager for this component, or null if there is none.
-     */
-    ServiceUnitManager getServiceUnitManager();
-
-    /**
-     * Retrieves a DOM representation containing metadata which describes the service
-     * provided by this component, through the given endpoint. The result can use WSDL
-     * 1.1 or WSDL 2.0.
-     *
-     * @param endpoint the service endpoint.
-     * @return the description for the specified service endpoint.
-     */
-    Document getServiceDescription(ServiceEndpoint endpoint);
-
-    /**
-     * This method is called by JBI to check if this component, in the role of provider
-     * of the service indicated by the given exchange, can actually perform the operation
-     * desired.
-     *
-     * @param endpoint the endpoint to be used by the consumer; must be non-null.
-     * @param exchange the proposed message exchange to be performed; must be non-null.
-     * @return true if this provider component can interact with the described consumer
-     *         to perform the given exchange.
-     */
-    boolean isExchangeWithConsumerOkay(ServiceEndpoint endpoint, MessageExchange exchange);
-
-    /**
-     * This method is called by JBI to check if this component, in the role of consumer
-     * of the service indicated by the given exchange, can actually interact with the
-     * provider properly. The provider is described by the given endpoint and the service
-     * description supplied by that endpoint.
-     *
-     * @param endpoint the endpoint to be used by the provider; must be non-null.
-     * @param exchange the proposed message exchange to be performed; must be non-null.
-     * @return true if this consumer component can interact with the described provider
-     *         to perform the given exchange.
-     */
-    boolean isExchangeWithProviderOkay(ServiceEndpoint endpoint, MessageExchange exchange);
-
-    /**
-     * Resolve the given endpoint reference. This is called by JBI when it is attempting to
-     * resolve the given EPR on behalf of a component.
-     *
-     * If this component returns a non-null result, it must conform to the following:
-     * <ul>
-     *   <li>This component implements the ServiceEndpoint returned.</li>
-     *   <li>The result must not be registered or activated with the JBI implementation.</li>
-     * </ul>
-     *
-     * Dynamically resolved endpoints are distinct from static ones; they must not be activated
-     * (see {@link javax.jbi.component.ComponentContext#activateEndpoint(javax.xml.namespace.QName, String)}),
-     * nor registered (see {@link ComponentContext}) by components. They can only be used to address
-     * message exchanges; the JBI implementation must deliver such exchanges to the component that
-     * resolved the endpoint reference (see
-     * {@link javax.jbi.component.ComponentContext#resolveEndpointReference(org.w3c.dom.DocumentFragment)}).
-     *
-     * @param epr the endpoint reference, in some XML dialect understood by the appropriate component
-     *            (usually a binding); must be non-null.
-     * @return the service endpoint for the EPR; null if the EPR cannot be resolved by this component.
-     */
-    ServiceEndpoint resolveEndpointReference(DocumentFragment epr);
-}
diff --git a/trunk/jbi-api-1.0/src/main/java/javax/jbi/component/ComponentContext.java b/trunk/jbi-api-1.0/src/main/java/javax/jbi/component/ComponentContext.java
deleted file mode 100644
index 2f85f81..0000000
--- a/trunk/jbi-api-1.0/src/main/java/javax/jbi/component/ComponentContext.java
+++ /dev/null
@@ -1,304 +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 javax.jbi.component;
-
-import java.util.MissingResourceException;
-import java.util.logging.Logger;
-
-import javax.jbi.JBIException;
-import javax.jbi.messaging.DeliveryChannel;
-import javax.jbi.messaging.MessagingException;
-import javax.jbi.servicedesc.ServiceEndpoint;
-
-import javax.xml.namespace.QName;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.DocumentFragment;
-
-/**
- * This interface provides access to data needed by a JBI component
- * about the JBI environment in which it is installed, as well providing
- * the means to allow the component to inform the JBI environment about
- * services provided by this component. This interface provides methods
- * for the following functions:
- * <ul>
- *   <li>Get the <bold>DeliveryChannel</bold> for this component. This is
- *       required to allow the component to send and receive message
- *       exchanges.</li>
- *   <li><bold>Activate</bold> (and deactivate) service endpoints provided
- *       by this component.</li>
- *   <li><bold>Register</bold> (and deregister) external endpoints provided
- *       by this component.</li>
- *   <li><bold>Query</bold> available endpoints (internal and external).</li>
- *   <li><bold>Query</bold> various data about the component, as installed
- *       in the JBI environment (name, workspace root, install root, initial
- *       JNDI context, MBean Server, Transaction Manager).</li>
- *   <li><bold>Loggers</bold>. Obtain the component's logger and subloggers.</li>
- *   <li><bold>MBean name creator</bold>. Access a utility for creating
- *       custom MBean names.</li>
- *   <li><bold>EPR Resolver</bold>. Ask JBI to resolve an endpoint reference
- *       (EPR), converting it into a service endpoint.</li>
- *
- * Note: The term "NMR" (meaning Normalized Message Router) is used here to refer
- * to the messaging system of the JBI implementation. This term is used as a
- * synonym for the JBI implementation, and refers only to the logical message
- * routing functions of a JBI implementation. It is not meant to require that
- * JBI implementations literally have a subsystem named "NMR".
- *
- * @author JSR208 Expert Group
- */
-public interface ComponentContext {
-
-    /**
-     * Activates the named endpoint with the NMR. Activation indicates to the NMR
-     * that this component is ready to process requests sent to the named endpoint.
-     *
-     * Note that the JBI implementation may call this component's
-     * {@link Component#getServiceDescription(ServiceEndpoint)} method before returning
-     * from this method call; the component's implementation must be ready to supply
-     * service description metadata before the result of this activation call (a
-     * ServiceEndpoint) is known.
-     *
-     * @param serviceName qualified name of the service the endpoint exposes; must
-     *                    be non-null.
-     * @param endpointName the name of the endpoint to be activated; must be non-null
-     *                     and non-empty.
-     * @return a reference to the activated endpoint; must be non-null.
-     * @throws JBIException if the endpoint cannot be activated.
-     */
-    ServiceEndpoint activateEndpoint(QName serviceName, String endpointName) throws JBIException;
-
-
-    /**
-     * Deactivates the given endpoint with the NMR. Deactivation indicates to the NMR
-     * that this component will no longer process requests sent to the named endpoint.
-     *
-     * @param endpoint reference to the endpoint to be deactivated; must be non-null.
-     * @throws JBIException if the endpoint cannot be deactivated.
-     */
-    void deactivateEndpoint(ServiceEndpoint endpoint) throws JBIException;
-
-    /**
-     * Registers the given external endpoint with the NMR. This indicates to the NMR that
-     * the given endpoint is used as a proxy for external service consumers to access an
-     * internal service of the same service name (but a different endpoint name).
-     *
-     * @param externalEndpoint the external endpoint to be registered, must be non-null.
-     * @throws JBIException if an external endpoint with the same name is already registered,
-     *                      by this or another component.
-     */
-    void registerExternalEndpoint(ServiceEndpoint externalEndpoint) throws JBIException;
-
-    /**
-     * Deregisters the given external endpoint with the NMR. This indicates to the NMR that
-     * the given external endpoint can no longer be used as a proxy for external service
-     * consumers to access an internal service of the same service name.
-     *
-     * @param externalEndpoint the external endpoint to be deregistered; must be non-null.
-     * @throws JBIException if the given external endpoint was not previously registered.
-     */
-    void deregisterExternalEndpoint(ServiceEndpoint externalEndpoint) throws JBIException;
-
-    /**
-     * Resolve the given endpoint reference into a service endpoint. This is called by the
-     * component when it has an EPR that it wants to resolve into a service endpoint.
-     *
-     * Note that the service endpoint returned refers to a dynamic endpoint; the endpoint
-     * will exist only as long as this component retains a strong reference to the object
-     * returned by this method. The endpoint may not be included in the list of "activated"
-     * endpoints.
-     *
-     * @param epr endpoint reference as an XML fragment; must be non-null.
-     * @return the service endpoint corresponding to the given endpoint reference; null if
-     *         the reference cannot be resolved.
-     */
-    ServiceEndpoint resolveEndpointReference(DocumentFragment epr);
-
-    /**
-     * Get the unique component name of this component, ass assigned by the identification
-     * section of this component's installation descriptor.
-     *
-     * @return the component name; must be non-null and non-empty.
-     */
-    String getComponentName();
-
-    /**
-     * Get a channel for this component to use to communicate with the Normalized Message
-     * Router. This channel must be used by the component to send and receive message
-     * exchanges.
-     *
-     * @return the delivery channel for this component; must be non-null.
-     * @throws MessagingException if a channel has already been opened, but not yet closed.
-     */
-    DeliveryChannel getDeliveryChannel() throws MessagingException;
-
-    /**
-     * Get the service endpoint for the named activated endpoint, if any.
-     *
-     * @param service qualified-name of the endpoint's service; must be non-null.
-     * @param name name of the endpoint; must be non-null.
-     * @return the named endpoint, or null if the named endpoint is not activated.
-     */
-    ServiceEndpoint getEndpoint(QName service, String name);
-
-    /**
-     * Retrieve the service description metadata for the specified endpoint.
-     *
-     * Note that the result can use either the WSDL 1.1 or WSDL 2.0 description language.
-     *
-     * @param endpoint endpoint reference; must be non-null.
-     * @return metadata describing endpoint, or null if metadata is unavailable.
-     * @throws JBIException invalid endpoint reference.
-     */
-    Document getEndpointDescriptor(ServiceEndpoint endpoint) throws JBIException;
-
-    /**
-     * Queries the NMR for active endpoints that implement the given interface. This
-     * will return the endpoints for all services and endpoints that implement the
-     * named interface (portType in WSDL 1.1). This method does NOT include external
-     * endpoints (those registered using {@link #registerExternalEndpoint(ServiceEndpoint)}).
-     *
-     * @param interfaceName qualified name of interface/portType that is implemented
-     *                      by the endpoint; if null then all activated endpoints in
-     *                      the JBI environment must be returned.
-     * @return an array of available endpoints for the specified interface name; must
-     *         be non-null; may be empty.
-     */
-    ServiceEndpoint[] getEndpoints(QName interfaceName);
-
-    /**
-     * Queries the NMR for active endpoints belonging to the given service. This
-     * method does NOT include external endpoints (those registered using
-     * {@link #registerExternalEndpoint(ServiceEndpoint)}).
-     *
-     * @param serviceName qualified name of the service that the endpoints are part
-     *                    of; must be non-null.
-     * @return an array of available endpoints for the specified service name; must
-     *         be non-null; may be empty.
-     */
-    ServiceEndpoint[] getEndpointsForService(QName serviceName);
-
-    /**
-     * Queries the NMR for external endpoints that implement the given interface name.
-     * This methods returns only registered external endpoints (see
-     * {@link #registerExternalEndpoint(ServiceEndpoint)}).
-     *
-     * @param interfaceName qualified name of interface implemented by the endpoints;
-     *                      must be non-null.
-     * @return an array of available external endpoints for the specified interface name;
-     *         must be non-null; may be empty.
-     */
-    ServiceEndpoint[] getExternalEndpoints(QName interfaceName);
-
-    /**
-     * Queries the NMR for external endpoints that are part of the given service.
-     *
-     * @param serviceName qualified name of service that contains the endpoints;
-     *                    must be non-null.
-     * @return an array of available external endpoints for the specified service name;
-     *         must be non-null; may be empty.
-     */
-    ServiceEndpoint[] getExternalEndpointsForService(QName serviceName);
-
-    /**
-     * Get the installation root directory path for this component.
-     *
-     * This method MUST return the file path formatted for the underlying platform.
-     *
-     * @return the installation root directory path, in platform-specific form;
-     *         must be non-null and non-empty.
-     */
-    String getInstallRoot();
-
-    /**
-     * Get a logger instance from JBI. Loggers supplied by JBI are guaranteed to have
-     * unique names such that they avoid name collisions with loggers from other
-     * components created using this method. The suffix parameter allows for the
-     * creation of subloggers as needed. The JBI specification says nothing about
-     * the exact names to be used, only that they must be unique across components
-     * and the JBI implementation itself.
-     *
-     * @param suffix for creating subloggers; use an empty string for the base component
-     *               logger; must be non-null.
-     * @param resourceBundleName name of ResourceBundle to be used for localizing messages
-     *                           for the logger. May be null if none of the messages require
-     *                           localization. The resource, if non-null, must be loadable
-     *                           using the component's class loader as the initiating loader.
-     * @return a standard logger, named uniquely for this component (plus the given suffix,
-     *         if applicable); must be non-null.
-     * @throws java.util.MissingResourceException if the ResourceBundleName is non-null and no
-     *                                            corresponding resource can be found.
-     * @throws JBIException if the resourceBundleName has changed from a previous invocation
-     *                      by this component of this method with the same suffix.
-     */
-    Logger getLogger(String suffix, String resourceBundleName) throws MissingResourceException, JBIException;
-
-    /**
-     * Get a reference to the MBeanNames creator for use in creating custom MBean names.
-     *
-     * @return reference to the MBeanNames creator; must be non-null.
-     */
-    javax.jbi.management.MBeanNames getMBeanNames();
-
-    /**
-     * Get the JMX MBean server used to register all MBeans in the JBI environment.
-     *
-     * @return a reference to the MBean server; must be non-null.
-     */
-    javax.management.MBeanServer getMBeanServer();
-
-    /**
-     * Get the JNDI naming context for this component. This context is a standard JNDI
-     * InitialContext but its content will vary based on the environment in which the JBI
-     * implementation is running.
-     * 
-     * @return the JNDI naming context; must be non-null.
-     */
-    javax.naming.InitialContext getNamingContext();
-
-    /**
-     * Get the TransactionManager for this implementation. The instance returned is an
-     * implementation of the standard JTA interface. If none is available, this method
-     * returns null.
-     *
-     * The object returned by this method is untyped, to allow this interface to be compiled
-     * in environments that do not support JTA. If not null, the object returned must be of
-     * type javax.transaction.TransactionManager.
-     *
-     * This downcast is necessary because JBI is used in environments that do not support
-     * JTA (i.e., J2SE). Explicit use of JTA types would cause compilation failures in
-     * such environments.
-     *
-     * @return A TransactionManager instance, or null if none is available in the
-     *         execution environment.
-     */
-    Object getTransactionManager();
-
-    /**
-     * Get the root directory path for this component's private workspace.
-     *
-     * This method MUST return the file path formatted for the underlying platform.
-     *
-     * The returned value must indicate a valid file path that the component may use
-     * to write files to, and read files from.
-     *
-     * @return the private workspace root path, in platform-specific form;
-     *         must be non-null and non-empty.
-     */
-    String getWorkspaceRoot();
-
-}
diff --git a/trunk/jbi-api-1.0/src/main/java/javax/jbi/component/ComponentLifeCycle.java b/trunk/jbi-api-1.0/src/main/java/javax/jbi/component/ComponentLifeCycle.java
deleted file mode 100644
index c98a736..0000000
--- a/trunk/jbi-api-1.0/src/main/java/javax/jbi/component/ComponentLifeCycle.java
+++ /dev/null
@@ -1,96 +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 javax.jbi.component;
-
-import javax.jbi.JBIException;
-import javax.management.ObjectName;
-
-/**
- * This interface must be implemented by a JBI component to provide initialization,
- * start, stop, and shutdown life cycle processing. These methods comprise the life
- * cycle contract between the JBI implementation and the component. The life cycle
- * of a component begins with a call to the init() method on an instance of the
- * component's implementation of this interface, and ends with the first call to the
- * shutDown() method on that instance. Between these two calls, there can be any
- * number of stop() and start() calls.
- *
- * The JBI implementation must track the running state of a component, and ensure
- * that life cycle state changes are always legal. For example, if the management
- * interface for controlling a component's life cycle ({@link
- * javax.jbi.management.ComponentLifeCycleMBean}) is used to start a component that
- * was just installed (and thus in the <i>Shutdown</i> state), the implementation
- * must invoke this component's {@link #init(ComponentContext)} method before
- * invoking its {@link #start()} method.
- *
- * @author JSR208 Expert Group
- */
-public interface ComponentLifeCycle {
-
-    /**
-     * Get the JMX object name for the extension MBean for this component; if there
-     * is none, return null.
-     *
-     * @return the JMX object name of the additional MBean or null if there is no
-     *         additional MBean.
-     */
-    ObjectName getExtensionMBeanName();
-
-    /**
-     * Initialize the component. This performs initialization required by the component
-     * but does not make it ready to process messages. This method is called once for
-     * each life cycle of the component.
-     *
-     * If the component needs to register an additional MBean to extend its life cycle,
-     * or provide other component management tasks, it should be registered during this
-     * call.
-     *
-     * @param context the component's context, providing access to component data provided
-     *                by the JBI environment; must be non-null.
-     * @throws JBIException if the component is unable to initialize.
-     */
-    void init(ComponentContext context) throws JBIException;
-
-    /**
-     * Shut down the component. This performs clean-up, releasing all run-time resources
-     * used by the component. Once this method has been called, {@link #init(ComponentContext)}
-     * must be called before the component can be started again with a call to {@link #start()}.
-     *
-     * @throws JBIException if the component is unable to shut down.
-     */
-    void shutDown() throws JBIException;
-
-    /**
-     * Start the component. This makes the component ready to process messages. This method
-     * is called after {@link #init(ComponentContext)}, both when the component is being
-     * started for the first time and when the component is being restarted after a previous
-     * call to {@link #shutDown()}. If {@link #stop()} was called previously but {@link #shutDown()}
-     * was not, {@link #start()} can be called again without another call to
-     * {@link #init(ComponentContext)}.
-     *
-     * @throws JBIException if the component is unable to start.
-     */
-    void start() throws JBIException;
-
-    /**
-     * Stop the component. This makes the component stop accepting messages for processing.
-     * After a call to this method, {@link #start()} may be called again without first
-     * calling {@link #init(ComponentContext)}.
-     *
-     * @throws JBIException if the component is unable to stop.
-     */
-    void stop() throws JBIException;
-}
diff --git a/trunk/jbi-api-1.0/src/main/java/javax/jbi/component/InstallationContext.java b/trunk/jbi-api-1.0/src/main/java/javax/jbi/component/InstallationContext.java
deleted file mode 100644
index 2ba9ac3..0000000
--- a/trunk/jbi-api-1.0/src/main/java/javax/jbi/component/InstallationContext.java
+++ /dev/null
@@ -1,136 +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 javax.jbi.component;
-
-import org.w3c.dom.DocumentFragment;
-
-/**
- * This context contains information necessary for a JBI component to perform
- * its installation/uninstallation processing.
- */
-public interface InstallationContext {
-
-    /**
-     * Get the name of the class that implements the {@link Component}
-     * interface for this component. This must be the component class name
-     * given in the component's installation descriptor.
-     *
-     * @return the {@link Component} implementation class name, which
-     *         must be non-null and non-empty.
-     */
-    String getComponentClassName();
-
-    /**
-     * Get a list of elements that comprise the class path for this component.
-     * Each element represents either a directory (containing class files) or
-     * a library file. All elements are reachable from the install root. These
-     * elements represent class path items that the component's execution-time
-     * component class loader uses, in search order. All path elements must use
-     * the file separator character appropriate to the system (i.e.,
-     * <code>File.separator</code>).
-     * 
-     * @return a list of String objects, each of which contains a class path
-     *         elements. The list must contain at least one class path element.
-     */
-    java.util.List getClassPathElements();
-
-    /**
-     * Get the unique name assigned to this component. This name must be assigned
-     * from the component's installation descriptor identification section.
-     *
-     * @return the unique component name, which must be non-null and non-empty.
-     */
-    String getComponentName();
-
-    /**
-     * Get the JBI context for this component. The following methods are valid
-     * to use on the context:
-     * <ul>
-     *   <li>{@link ComponentContext#getLogger(String, String)}</li>
-     *   <li>{@link ComponentContext#getMBeanNames()}</li>
-     *   <li>{@link ComponentContext#getMBeanServer()}</li>
-     *   <li>{@link ComponentContext#getNamingContext()}</li>
-     *   <li>{@link ComponentContext#getTransactionManager()}</li>
-     * </ul>
-     *
-     * All other methods on the returned context must throw a IllegalStateException
-     * exception if invoked.
-     *
-     * @return the JBI context for this component, which must be non-null.
-     */
-    ComponentContext getContext();
-
-    /**
-     * Get the installation root directory full path name for this component.
-     * This path name must be formatted for the platform the JBI environment
-     * is running on.
-     *
-     * @return the installation root directory name, which must be non-null
-     *         and non-empty.
-     */
-    String getInstallRoot();
-
-    /**
-     * Return a DOM document fragment representing the installation descriptor
-     * (jbi.xml) extension data for the component, if any.
-     *
-     * The Installation Descriptor Extension data are located at the end of the
-     * <component> element of the installation descriptor.
-     *
-     * @return a DOM document fragment containing the installation descriptor
-     *         (jbi.xml) extension data, or null if none is present in the descriptor.
-     */
-    DocumentFragment getInstallationDescriptorExtension();
-
-    /**
-     * Returns <code>true</code> if this context was created in order to install a
-     * component into the JBI environment. Returns false if this context was created
-     * to uninstall a previously installed component.
-     *
-     * This method is provided to allow Bootstrap implementations to tailor their
-     * behaviour according to use case. For example, the
-     * {@link Bootstrap#init(InstallationContext)} method implementation may create
-     * different types of extension MBeans, depending on the use case specified by
-     * this method.
-     *
-     * @return <code>true</code> if this context was created in order to install a
-     *         component into the JBI environment; otherwise the context was created
-     *         to uninstall an existing component.
-     */
-    boolean isInstall();
-
-    /**
-     * Set the list of elements that comprise the class path for this component. Each
-     * element represents either a directory (containing class files) or a library file.
-     * Elements are reached from the install root. These elements represent class path
-     * items that the component's execution-time component class loader uses, in search
-     * order. All file paths are relative to the install root of the component.
-     *
-     * This method allows the component's bootstrap to alter the execution-time class
-     * path specified by the component's installation descriptor. The component
-     * configuration determined during installation can affect the class path needed by
-     * the component at execution-time. All path elements must use the file separator
-     * character appropriate to the system (i.e., <code>File.separator</code>).
-     *
-     * @param classPathElements a list of String objects, each of which contains a class
-     *        path elements; the list must be non-null and contain at least one class path
-     *        element.
-     * @throws java.lang.IllegalArgumentException if the class path elements is null, empty,
-     *                                            or if an individual element is ill-formed.
-     */
-    void setClassPathElements(java.util.List classPathElements);
-}
diff --git a/trunk/jbi-api-1.0/src/main/java/javax/jbi/component/ServiceUnitManager.java b/trunk/jbi-api-1.0/src/main/java/javax/jbi/component/ServiceUnitManager.java
deleted file mode 100644
index 91637ce..0000000
--- a/trunk/jbi-api-1.0/src/main/java/javax/jbi/component/ServiceUnitManager.java
+++ /dev/null
@@ -1,146 +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 javax.jbi.component;
-
-import javax.jbi.management.DeploymentException;
-
-/**
- * This interface defines component-supplied methods for managing service
- * unit deployments, and is implemented by the component. The JBI
- * implementation queries the component for the implementation of this
- * interface using the {@link Component#getServiceUnitManager()} method.
- *
- * @author JSR208 Expert Group
- */
-public interface ServiceUnitManager {
-
-    /**
-     * Deploy a Service Unit to the component. This is called by the JBI
-     * implementation in order to deploy the given artifact to the implementing
-     * component.
-     *
-     * Upon successful deployment, a non-empty result string must be returned,
-     * that starts with the JBI-defined component-task-result element. For example:
-     * <pre>
-     * &lt;component-task-result&gt;
-     *   &lt;component-name&gt;BC1&lt;/component-name&gt;
-     *   &lt;component-task-result-details
-     *     xmlns="http://java.sun.com/xml/ns/jbi/management-message"&gt;
-     *       &lt;task-result-details&gt;
-     *           &lt;task-id>deploy&lt;/task-id&gt;
-     *           &lt;task-result>SUCCESS&lt;/task-result&gt;
-     *       &lt;/task-result-details&gt;
-     *   &lt;/component-task-result-details&gt;
-     * &lt;/component-task-result&gt;
-     * </pre>
-     * A failed deployment of the service unit must be reported using the
-     * <code>component-task-result</code> element as well; the
-     * <code>task-result</code> must be set to FAILED.
-     *
-     * @param serviceUnitName name of the service unit being deployed; must be
-     *        non-null and non-empty and unique among service units already
-     *        deployed to the component.
-     * @param serviceUnitRootPath path of the service unit artifact root, in
-     *        platform specific format; must be non-null and non-empty.
-     * @return a deployment status message, which is an XML string that conforms
-     *         to the schema given in the <i>MBean Status and Result Strings</i>
-     *         section of the <i><b>Management</b></i> chapter of the JBI
-     *         specification; must be non-null and non-empty.
-     * @exception DeploymentException if the deployment operation is
-     *            unsuccessful.
-      */
-    String deploy(String serviceUnitName, String serviceUnitRootPath) throws DeploymentException;
-
-    /**
-     * Initialize the given deployed service unit. This is the first phase of
-     * a two-phase start, where the component must prepare to receive service
-     * requests related to the deployment (if any).
-     * <p>
-     * The serviceUnitRootPath parameter is provided to facilitate restart of
-     * the component. This allows simple components to rely entirely on JBI's
-     * ability to persist deployment information, avoiding the need for the
-     * component to provide its own persistence mechanism.
-     *
-     * @param serviceUnitName name of the service unit being initialized; must
-     *        be non-null, non-empty, and match the name of a previously
-     *        deployed (but not yet undeployed) service unit.
-     * @param serviceUnitRootPath path of the service unit artifact root, in
-     *        platform specific format; must be non-null and non-empty.
-     * @exception DeploymentException if the service unit is not deployed, or
-     *            if it is in an incorrect state.
-     */
-    void init(String serviceUnitName, String serviceUnitRootPath) throws DeploymentException;
-
-    /**
-     * Start the deployed service unit. This is the second phase of a two-phase
-     * start, where the component can now initiate service requests related to
-     * the deployment.
-     *
-     * @param serviceUnitName the name of the service unit being started; must
-     *        be non-null, non-empty, and match the name of a previously
-     *        deployed (but not yet undeployed) service unit.
-     * @exception DeploymentException if the service unit is not deployed, or
-     *           if it is in an incorrect state.
-     */
-    void start(String serviceUnitName) throws DeploymentException;
-
-    /**
-     * Stop the deployed service unit. This causes the component to cease
-     * generating service requests related to the given service unit. This
-     * returns the service unit to a state equivalent to after
-     * {@link #init(String, String)} was called.
-     *
-     * @param serviceUnitName name of the service unit being stopped; must
-     *        be non-null, non-empty, and match the name of a previously
-     *        deployed (but not yet undeployed) service unit.
-     * @exception DeploymentException if the service unit is not deployed, or
-     *            if it is in an incorrect state.
-     */
-    void stop(String serviceUnitName) throws DeploymentException;
-
-    /**
-     * Shut down the deployment. This causes the deployment to return to the
-     * to the state it was in after {@link #deploy(String, String)}, and before
-     * {@link #init(String, String)}.
-     *
-     * @param serviceUnitName name of the service unit being shut down; must
-     *        be non-null, non-empty, and match the name of a previously
-     *        deployed (but not yet undeployed) service unit.
-     * @exception DeploymentException if the service unit is not deployed, or
-     *            if it is in an incorrect state.
-     */
-    void shutDown(String serviceUnitName) throws DeploymentException;
-
-    /**
-     * Undeploy a service unit from the component. The service unit must be
-     * shut down to undeploy it.
-     *
-     * @param serviceUnitName name of the service unit being undeployed; must
-     *        be non-null, non-empty, and match the name of a previously
-     *        deployed (but not yet undeployed) service unit.
-     * @param serviceUnitRootPath path of the service unit artifact root, in
-     *        platform specific format; must be non-null and non-empty.
-     * @return deployment status message, which is an XML string that conforms
-     *         to the <code>component-task-result</code> type from
-     *         the schema given in the <i>MBean Status and Result Strings</i>
-     *         section of the <i><b>Management</b></i> chapter of the JBI
-     *         specification; must be non-null and non-empty.
-     * @exception DeploymentException if undeployment operation is unsuccessful,
-     *            or if the service unit is in an incorrect state.
-     */
-    String undeploy(String serviceUnitName, String serviceUnitRootPath) throws DeploymentException;
-}
diff --git a/trunk/jbi-api-1.0/src/main/java/javax/jbi/management/AdminServiceMBean.java b/trunk/jbi-api-1.0/src/main/java/javax/jbi/management/AdminServiceMBean.java
deleted file mode 100644
index d4728d3..0000000
--- a/trunk/jbi-api-1.0/src/main/java/javax/jbi/management/AdminServiceMBean.java
+++ /dev/null
@@ -1,136 +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 javax.jbi.management;
-
-import javax.management.ObjectName;
-
-/**
- * This interface defines a set of administrative methods allowing a JMX-based
- * administrative tool to perform a variety of administrative tasks.
- * <ul>
- *   <li>Find component lifecycle MBean names for:
- *     <ul>
- *       <li>Individual components, by name</li>
- *       <li>All binding components</li>
- *       <li>All service engines</li>
- *     </ul>
- *   </li>
- *   <li>Find lifecyle MBeans names for implementation-defined services:
- *     <ul>
- *       <li>Individual implementation services, by name</li>
- *       <li>All implementation services</li>
- *     </ul>
- *   </li>
- *   <li>Query whether an individual component is a binding or engine</li>
- *   <li>Query implementation information (version etc.)</li>
- * </ul>
- *
- * @author JSR208 Expert Group
- */
-public interface AdminServiceMBean {
-
-    /**
-     * Get a list of {@link ComponentLifeCycleMBean}s for all binding components
-     * currently installed in the JBI system.
-     *
-     * @return array of JMX object names of component life cycle MBeans for all
-     *         installed binding components; must be non-null; may be empty
-     */
-    ObjectName[] getBindingComponents();
-
-    /**
-     * Find the {@link ComponentLifeCycleMBean} of a JBI Installable Component
-     * by its unique name.
-     *
-     * @param name the name of the engine or binding component; must be non-
-     *        null and non-empty
-     * @return the JMX object name of the component's life cycle MBean, or
-     *         <code>null</code> if there is no such component with the given
-     *         <code>name</code>
-     */
-    ObjectName getComponentByName(String name);
-
-    /**
-     * Get a list of {@link ComponentLifeCycleMBean}s for all service engines
-     * currently installed in the JBI system.
-     *
-     * @return array of JMX object names of component life cycle MBeans for all
-     *         installed service engines; must be non-null; may be empty
-     */
-    ObjectName[] getEngineComponents();
-
-    /**
-     * Return current version and other info about this JBI implementation. The
-     * contents of the returned string are implementation dependent.
-     *
-     * @return information string about the JBI implementation, including
-     *         version information; must be non-null and non-empty
-     */
-    String getSystemInfo();
-
-    /**
-     * Lookup a system service {@link LifeCycleMBean} by name. System services
-     * are implementation-defined services which can administered through JMX,
-     * and have a life cycle.
-     * <p>
-     * System services are not related to service engines.
-     *
-     * @param serviceName name of the system service; must be non-null and non-
-     *        empty; values are implementation-dependent
-     * @return JMX object name of the system service's LifeCycleMBean, or
-     *         <code>null</code> if there is no system service with the given
-     *         <code>name</code>.
-     */
-    ObjectName getSystemService(String serviceName);
-
-    /**
-     * Looks up all JBI system services {@link LifeCycleMBean}'s currently
-     * installed. System services are implementation-defined services which can
-     * administered through JMX. System services are not related to service
-     * engines.
-     *
-     * @return array of LifecycleMBean JMX object names of system services
-     *         currently installed in the JBI implementation; must be non-null;
-     *         may be empty
-     */
-    ObjectName[] getSystemServices();
-
-    /**
-     * Check if a given JBI component is a Binding Component.
-     *
-     * @param componentName the unique name of the component; must be non-null
-     *        and non-empty
-     * @return <code>true</code> if the component is a binding component;
-     *         <code>false</code> if the component is a service engine or if
-     *         there is no component with the given <code>componentName</code>
-     *         installed in the JBI system
-     */
-    boolean isBinding(String componentName);
-
-    /**
-     * Check if a given JBI component is a Service Engine.
-     *
-     * @param componentName the unique name of the component; must be non-null
-     *        and non-empty
-     * @return <code>true</code> if the component is a service engine;
-     *         <code>false</code> if the component is a binding component, or if
-     *         there is no component with the given <code>componentName</code>
-     *         installed in the JBI system
-     */
-    boolean isEngine(String componentName);
-
-}
diff --git a/trunk/jbi-api-1.0/src/main/java/javax/jbi/management/ComponentLifeCycleMBean.java b/trunk/jbi-api-1.0/src/main/java/javax/jbi/management/ComponentLifeCycleMBean.java
deleted file mode 100644
index 28088ee..0000000
--- a/trunk/jbi-api-1.0/src/main/java/javax/jbi/management/ComponentLifeCycleMBean.java
+++ /dev/null
@@ -1,51 +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 javax.jbi.management;
-
-import javax.management.ObjectName;
-
-/**
- * ComponentLifeCycleMBean defines the standard life cycle controls for
- * JBI Installable Components.
- * <ul>
- *   <li>Initialize the component, preparing it to receive service requests.</li>
- *   <li>Start the component, allowing it to initiate service requests.</li>
- *   <li>Stop the component from initiating any more service requests.</li>
- *   <li>Shut down the component, returning it to the uninitialized state
- *       where it cannot receive service requests.</li>
- *   <li>Query the JMX object name of the extension MBean for the component.</li>
- * </ul>
- *
- * @author JSR208 Expert Group
- */
-public interface ComponentLifeCycleMBean extends LifeCycleMBean {
-
-    /**
-     * Get the JMX ObjectName for the life cycle extension MBean for this
-     * component. If there is none, return <code>null</code>.
-     * Note that this MBean may serve as a container for multiple MBeans,
-     * as required by the component implementation.
-     *
-     * @return ObjectName the JMX object name of the additional MBean
-     *         or <code>null</code> if there is no additional MBean.
-     * @exception javax.jbi.JBIException if there is a failure getting component
-     *            information for the component to which this life cycle
-     *            applies.
-     */
-    ObjectName getExtensionMBeanName() throws javax.jbi.JBIException;
-
-}
diff --git a/trunk/jbi-api-1.0/src/main/java/javax/jbi/management/DeploymentException.java b/trunk/jbi-api-1.0/src/main/java/javax/jbi/management/DeploymentException.java
deleted file mode 100644
index 3a38f5a..0000000
--- a/trunk/jbi-api-1.0/src/main/java/javax/jbi/management/DeploymentException.java
+++ /dev/null
@@ -1,60 +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 javax.jbi.management;
-
-/**
- * DeploymentException is an exception thrown by the Deployment Service and
- * the Service Unit Manager.
- *
- * @author JSR208 Expert Group
- */
-public class DeploymentException extends javax.jbi.JBIException {
-
-    /**
-     * Creates a new instance of DeploymentException with an exception detail
-     * message.
-     *
-     * @param aMessage the detail message for this exception.
-     */
-    public DeploymentException(String aMessage) {
-        super(aMessage);
-    }
-
-    /**
-     * Creates a new instance of DeploymentException with and exception detail
-     * message and a cause.
-     *
-     * @param aMessage the detail message for this exception.
-     * @param aCause <code>Error</code> or <code>Exception</code> which
-     *        represents the cause of the problem (<code>null</code> if none,
-     *        or if the cause is not known).
-     */
-    public DeploymentException(String aMessage, Throwable aCause) {
-        super(aMessage, aCause);
-    }
-
-    /**
-     * Creates a new instance of DeploymentException with the specified cause.
-     *
-     * @param aCause <code>Error</code> or <code>Exception</code> which
-     *        represents the cause of the problem (<code>null</code> if none,
-     *        or if the cause is not known).
-     */
-    public DeploymentException(Throwable aCause) {
-        super(aCause);
-    }
-}
diff --git a/trunk/jbi-api-1.0/src/main/java/javax/jbi/management/DeploymentServiceMBean.java b/trunk/jbi-api-1.0/src/main/java/javax/jbi/management/DeploymentServiceMBean.java
deleted file mode 100644
index 4ca67f4..0000000
--- a/trunk/jbi-api-1.0/src/main/java/javax/jbi/management/DeploymentServiceMBean.java
+++ /dev/null
@@ -1,234 +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 javax.jbi.management;
-
-/**
- * The deployment service MBean allows administrative tools to manage
- * service assembly deployments. The tasks supported are:
- * <ul>
- *   <li>Deploying a service assembly.</li>
- *   <li>Undeploying a previously deployed service assembly.</li>
- *   <li>Querying deployed service assemblies:
- *     <ul>
- *       <li>For all components in the system.</li>
- *       <li>For a particular component.</li>
- *     </ul>
- *   </li>
- *   <li>Control the state of deployed service assemblies:
- *     <ul>
- *       <li>Start the service units that contained in the SA.</li>
- *       <li>Stop the service units that contained in the SA. </li>
- *       <li>Shut down the service units that contained in the SA.</li>
- *     </ul>
- *   </li>
- *   <li>Query the service units deployed to a particular component.</li>
- *   <li>Check if a service unit is deployed to a particular component.</li>
- *   <li>Query the deployment descriptor for a particular service assembly.</li>
- * </ul>
- *
- * @author JSR208 Expert Group
- */
-public interface DeploymentServiceMBean {
-
-    /**
-     * The service assembly is started. This means that the assembly's offered
-     * services can accept message exchanges, and it can send exchanges to
-     * consume services.
-     */
-    String STARTED = "Started";
-
-    /**
-     * The service assembly has been deployed, or shutdown
-     */
-     String SHUTDOWN = "Shutdown";
-
-    /**
-     * The service assembly is stopped. This means that the assembly's offered
-     * services can accept message exchanges, but it will not send any.
-     */
-    String STOPPED = "Stopped";
-
-    /**
-     * Deploys the given Service Assembly to the JBI environment.
-     * <p>
-     * Note that the implementation must not automatically start the service
-     * assembly after deployment; it must wait for the {@link #start(String)}
-     * method to be invoked by the administrative tool.
-     *
-     * @param saZipURL String containing the location URL of the
-     *        Service Assembly ZIP file; must be non-null, non-empty, and a
-     *        legal URL
-     * @return Result/Status of the current deployment; must conform to
-     *         JBI management result/status XML schema; must be non-null and
-     *         non-empty
-     * @exception Exception if complete deployment fails
-     */
-    String deploy(String saZipURL) throws Exception;
-
-    /**
-     * Undeploys the given Service Assembly from the JBI environment.
-     *
-     * @param saName name of the Service Assembly that is to be 
-     *        undeployed; must be non-null and non-empty
-     * @return Result/Status of the current undeployment; must conform to
-     *         JBI management result/status XML schema; must be non-null and
-     *         non-empty
-     * @exception Exception if compelete undeployment fails
-     */
-    String undeploy(String saName) throws Exception;
-
-    /**
-     * Returns an array of service unit names that are currently deployed to
-     * the named component.
-     *
-     * @param componentName the name of the component to query; must be
-     *        non-null and non-empty
-     * @return array of service unit names deployed in the named component;
-     *         must be non-null; may be empty
-     * @exception Exception if a processing error occurs
-     */
-    String[] getDeployedServiceUnitList(String componentName) throws Exception;
-
-    /**
-     * Returns a list of Service Assemblies deployed to the JBI environment.
-     *
-     * @return list of Service Assembly names; must be non-null; may be
-     *         empty
-     * @exception Exception if a processing error occurs
-     */
-    String[] getDeployedServiceAssemblies() throws Exception;
-
-    /**
-     * Returns the deployment descriptor of the Service Assembly that was
-     * deployed to the JBI enviroment, serialized to a <code>String</code>.
-     *
-     * @param saName name of the service assembly to be queried;
-     *        must be non-null and non-empty
-     * @return descriptor of the Assembly Unit; must be non-null
-     * @exception Exception if a processing error occurs
-     */
-    String getServiceAssemblyDescriptor(String saName) throws Exception;
-
-    /**
-     * Returns an array of Service Assembly names, where each assembly contains
-     * Service Units for the given component.
-     *
-     * @param componentName name of the component to query; must be non-null
-     *        and non-empty
-     * @return array of of Service Assembly names, where each assembly contains
-     *         a Service Unit for the named component; must be non-null; may
-     *         be empty
-     * @exception Exception if a processing error occurs
-     */
-    String[] getDeployedServiceAssembliesForComponent(String componentName) throws Exception;
-
-    /**
-     * Returns an array of component names, where for each the given assembly
-     * contains a service unit for the component.
-     *
-     * @param saName the service assembly to be queried; must be
-     *        non-null and non-empty
-     * @return array of component names, where for each name the given assembly
-     *         contains a service unit from the given service assembly; must
-     *         be non-null; may be empty
-     * @exception Exception if a processing error occurs
-     */
-    String[] getComponentsForDeployedServiceAssembly(String saName) throws Exception;
-
-    /**
-     * Queries if the named Service Unit is currently deployed to the named
-     * component.
-     *
-     * @param componentName name of the component to query; must be non-null
-     *        and non-empty
-     * @param suName name of the subject service unit; must be non-null
-     *        and non-empty
-     * @return <code>true</code> if the named service unit is currently deployed
-     *         to the named component
-     */
-    boolean isDeployedServiceUnit(String componentName, String suName) throws Exception;
-
-    /**
-     * Returns <code>true</code> if the the given component accepts the
-     * deployment of service units. This is used by admin tools to
-     * determine which components can be named in service assembly
-     * deployment descriptors.
-     *
-     * @param componentName name of the component; must be non-null and
-     *        non-empty
-     * @return <code>true</code> if the named component accepts deployments;
-     *         <code>false</code> if the named component does not accept
-     *         deployments or it does not exist
-     *
-     */
-    boolean canDeployToComponent(String componentName);
-
-    /**
-     * Start the service assembly. This puts the assembly into the {@link
-     * #STARTED} state.
-     *
-     * @param serviceAssemblyName name of the assembly to be started; must be
-     *        non-null and non-empty
-     * @return result / status string giving the results of starting (and
-     *         possibly initializing) each service unit in the assembly; must
-     *         be non-null and non-empty
-     * @exception Exception if there is no such assembly
-     * @exception Exception if the assembly fails to start
-     *
-     */
-    String start(String serviceAssemblyName) throws Exception;
-
-    /**
-     * Stop the service assembly. This puts the assembly into the {@link
-     * #STOPPED} state.
-     *
-     * @param serviceAssemblyName name of the assembly to be stopped; must be
-     *        non-null and non-empty
-     * @return result / status string giving the results of stopping each
-     *         service unit in the assembly; must be non-null and non-empty
-     * @exception Exception if there is no such assembly
-     * @exception Exception if the assembly fails to stop
-     */
-    String stop(String serviceAssemblyName) throws Exception;
-
-    /**
-     * Shut down the service assembly. This puts the assembly back into the
-     * {@link #SHUTDOWN} state.
-     *
-     * @param serviceAssemblyName name of the assembly to be shut down; must be
-     *        non-null and non-empty
-     * @return result / status string giving the results of shutting down
-     *         each service unit in the assembly; must be non-null and non-empty
-     * @exception Exception if there is no such assembly
-     * @exception Exception if the assembly fails to shut down
-     */
-    String shutDown(String serviceAssemblyName) throws Exception;
-
-    /**
-     * Get the running state of a service assembly. The possible result values
-     * of this query are enumerated by the following set of constants:
-     * {@link #SHUTDOWN}, {@link #STOPPED}, {@link #STARTED}.
-     *
-     * @param serviceAssemblyName name of the assembly to query; must be
-     *        non-null and non-empty
-     * @return the state of the service assembly, as a string value; must be one
-     *         of the enumerated string values provided by this interface:
-     *         {@link #SHUTDOWN}, {@link #STOPPED}, or {@link #STARTED}
-     * @exception Exception if there is no such assembly
-     */
-    String getState(String serviceAssemblyName) throws Exception;
-}
diff --git a/trunk/jbi-api-1.0/src/main/java/javax/jbi/management/InstallationServiceMBean.java b/trunk/jbi-api-1.0/src/main/java/javax/jbi/management/InstallationServiceMBean.java
deleted file mode 100644
index 23d3d93..0000000
--- a/trunk/jbi-api-1.0/src/main/java/javax/jbi/management/InstallationServiceMBean.java
+++ /dev/null
@@ -1,101 +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 javax.jbi.management;
-
-import javax.management.ObjectName;
-
-/**
- * The installation service MBean allows administrative tools to manage
- * component and shared library installations.  The tasks supported are:
- * <ul>
- *   <li>Installing (and uninstalling) a shared library</li>
- *   <li>Creating (loading) and destroying (unloading) a component installer
- *       MBean.</li>
- *   <li>Finding an existing component installer MBean.
- * </ul>
- *
- * Installing and uninstalling components is accomplished using
- * {@link InstallerMBean}s, loaded by this MBean.  An individual installer MBean
- * is needed for each component installation / uninstallation.  This is to support
- * the more complex installation process that some components require.
- *
- * @author JSR208 Expert Group
- */
-public interface InstallationServiceMBean {
-
-    /**
-     * Load the installer for a new component for the given component
-     * installation package.
-     *
-     * @param installZipURL URL locating a ZIP file containing the
-     *        JBI Installation package to be installed; must be non-null,
-     *        non-empty, and a legal URL
-     * @return the JMX ObjectName of the InstallerMBean loaded from
-     *         installZipURL; must be non-null
-     */
-    ObjectName loadNewInstaller(String installZipURL);
-
-    /**
-     * Load the InstallerMBean for a previously installed component.
-     * <p>
-     * The "component name" refers to the
-     * <code>&lt;identification>&lt;name></code> element value from the
-     * component's installation package (see {@link #loadNewInstaller(String)}).
-     *
-     * @param aComponentName the component name identifying the installer to 
-     *        load; must be non-null and non-empty
-     * @return the JMX ObjectName of the InstallerMBean loaded from an existing
-     *         installation context; <code>null</code> if the installer MBean
-     *         doesn't exist
-     */
-    ObjectName loadInstaller(String aComponentName);
-
-    /**
-     * Unload an InstallerMBean previously loaded for a component.
-     *
-     * @param aComponentName the component name identifying the installer to 
-     *        unload; must be non-null and non-empty
-     * @param isToBeDeleted <code>true</code> if the component is to be deleted
-     *        as well
-     * @return true if the operation was successful, otherwise false
-     */
-    boolean unloadInstaller(String aComponentName, boolean isToBeDeleted);
-
-    /**
-     * Install a shared library installation package.
-     * <p>
-     * The return value is the unique name for the shared-library, as found
-     * in the the value of the installation descriptor's
-     * <code>&lt;identification>&lt;name></code> element.
-     *
-     * @param aSharedLibURI URL locating a zip file containing a shared library
-     *        installation package; must be non-null, non-empty, and a legal
-     *        URL
-     * @return the unique name of the shared library loaded from slZipURL; must
-     *         be non-null and non-empty
-     */
-    String installSharedLibrary(String aSharedLibURI);
-
-    /**
-     * Uninstall a previously installed shared library.
-     *
-     * @param aSharedLibName the name of the shared name space to uninstall; must be
-     *        non-null and non-empty
-     * @return true if the uninstall was successful
-     */
-    boolean uninstallSharedLibrary(String aSharedLibName);
-}
diff --git a/trunk/jbi-api-1.0/src/main/java/javax/jbi/management/InstallerMBean.java b/trunk/jbi-api-1.0/src/main/java/javax/jbi/management/InstallerMBean.java
deleted file mode 100644
index d5d4305..0000000
--- a/trunk/jbi-api-1.0/src/main/java/javax/jbi/management/InstallerMBean.java
+++ /dev/null
@@ -1,87 +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 javax.jbi.management;
-
-import javax.management.ObjectName;
-
-/**
- * The InstallerMBean defines standard installation and uninstallation controls
- * for components. InstallerMBeans are created by the
- * {@link InstallationServiceMBean}. The InstallerMBean offers controls to
- * allow an administrative tool to:
- * <ul>
- *   <li>Install the component from the installation package.</li>
- *   <li>Uninstall the component.</li>
- *   <li>Check the installation status of the component.</li>
- *   <li>Get the file path to the component's installation root directory.</li>
- * </ul>
- *
- * @author JSR208 Expert Group
- */
-public interface InstallerMBean {
-
-    /**
-     * Get the installation root directory path for this component.
-     *
-     * @return the full installation path of this component; this must be in
-     *         absolute path name form, in platform-specific format; must be
-     *         non-null and non-empty
-     */
-    String getInstallRoot();
-
-    /**
-     * Install a component.
-     * <p>
-     * Note that the implementation must leave the component in its
-     * installed, shutdown state. Automatic starting of components during
-     * installation by implementations is not allowed.
-     *
-     * @return JMX ObjectName representing the LifeCycleMBean for the installed
-     *         component, or <code>null</code> if the installation did not
-     *         complete
-     * @exception javax.jbi.JBIException if the installation fails
-     */
-    ObjectName install() throws javax.jbi.JBIException;
-
-    /**
-     * Determine whether or not the component is installed.
-     *
-     * @return <code>true</code> if this component is currently installed,
-     *         otherwise <code>false</code>
-     */
-    boolean isInstalled();
-
-    /**
-     * Uninstall the component. This completely removes the component from the
-     * JBI system.
-     *
-     * @exception javax.jbi.JBIException if the uninstallation fails
-     */
-    void uninstall() throws javax.jbi.JBIException;
-
-    /**
-     * Get the installer configuration MBean name for this component.
-     *
-     * @return the MBean object name of the Installer Configuration MBean;
-     *         <code>null</code> if none is provided by this component
-     * @exception javax.jbi.JBIException if the component is not in the
-     *            appropriate state (after install() but before life cycle
-     *            initialization), or if any error occurs during processing
-     */
-    ObjectName getInstallerConfigurationMBean() throws javax.jbi.JBIException;
-
-}
diff --git a/trunk/jbi-api-1.0/src/main/java/javax/jbi/management/LifeCycleMBean.java b/trunk/jbi-api-1.0/src/main/java/javax/jbi/management/LifeCycleMBean.java
deleted file mode 100644
index acdb715..0000000
--- a/trunk/jbi-api-1.0/src/main/java/javax/jbi/management/LifeCycleMBean.java
+++ /dev/null
@@ -1,72 +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 javax.jbi.management;
-
-import javax.jbi.JBIException;
-
-/**
- * LifeCycleMBean is a base interface that defines standard life cycle controls
- * for JBI implementation services (which are implementation-specific), and JBI
- * components (bindings and engines).
- *
- * @author JSR208 Expert Group
- */
-public interface LifeCycleMBean {
-
-    /** Value returned by {@link #getCurrentState()} for a shutdown component. */
-    String SHUTDOWN = "Shutdown";
-
-    /** Value returned by {@link #getCurrentState()} for a stopped component. */
-    String STOPPED = "Stopped";
-
-    /** Value returned by {@link #getCurrentState()} for a running component. */
-     String STARTED = "Started";
-
-    /** Value returned by {@link #getCurrentState()} for a component in an unknown state. */
-    String UNKNOWN = "Unknown";
-
-    /**
-     * Start the item.
-     *
-     * @exception javax.jbi.JBIException if the item fails to start.
-     */
-    void start() throws JBIException;
-
-    /**
-     * Stop the item. This suspends current messaging activities.
-     *
-     * @exception javax.jbi.JBIException if the item fails to stop.
-     */
-    void stop() throws JBIException;
-
-    /**
-     * Shut down the item. This releases resources and returns the item
-     * to an uninitialized state.
-     *
-     * @exception javax.jbi.JBIException if the item fails to shut down.
-     */
-    void shutDown() throws JBIException;
-
-    /**
-     * Get the current state of this managed compononent.
-     *
-     * @return the current state of this managed component (must be one of the
-     *         string constants defined by this interface)
-     */
-     String getCurrentState();
-
-}
diff --git a/trunk/jbi-api-1.0/src/main/java/javax/jbi/management/MBeanNames.java b/trunk/jbi-api-1.0/src/main/java/javax/jbi/management/MBeanNames.java
deleted file mode 100644
index e6055ff..0000000
--- a/trunk/jbi-api-1.0/src/main/java/javax/jbi/management/MBeanNames.java
+++ /dev/null
@@ -1,72 +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 javax.jbi.management;
-
-import javax.management.ObjectName;
-
-/**
- * This interface provides methods to create JMX object names for component-
- * supplied MBeans. This ensures that component-supplied MBeans follow the
- * JBI implementation-determined naming convention.
- *
- * Components obtain instances of this name creator using {@link
- * javax.jbi.component.ComponentContext#getMBeanNames()}.
- *
- * @author JSR208 Expert Group
- */
-public interface MBeanNames {
-
-    /** The custom name that must be used for bootstrap extensions */
-    String BOOTSTRAP_EXTENSION = "BootstrapExtension";
-
-    /** The custom name that must be used for component life cycle extensions */
-    String COMPONENT_LIFE_CYCLE_EXTENSION = "LifeCycleExtension";
-
-    /**
-     * Formulate and return an MBean ObjectName for a custom control
-     * of this name creator's JBI component.
-     * <p>
-     * This is used by components to create JMX names for their own JMX
-     * controls, allowing the JBI implementation to prefix the created name
-     * to fit within the implementation's own naming scheme.
-     * <p>
-     * Standard extensions must use the following custom name constants:
-     * <ul>
-     *   <li>Bootstrap (installer) extension: {@link #BOOTSTRAP_EXTENSION}.</li>
-     *   <li>Component life cycle extension:
-     *       {@link #COMPONENT_LIFE_CYCLE_EXTENSION}.
-     *   </li>
-     * </ul>
-     * All other custom component MBeans must use custom names that do not
-     * collide with the standard extension names.
-     *
-     * @param customName the name of the custom control; must be non-null and
-     *        non-empty; must be legal for use in a JMX object name
-     * @return the JMX ObjectName of the MBean, or <code>null</code> if
-     *         the <code>customName</code> is invalid
-     */
-    ObjectName createCustomComponentMBeanName(String customName);
-
-    /**
-     * Retrieve the default JMX Domain Name for MBeans registered in
-     * this instance of the JBI implementation.
-     *
-     * @return the JMX domain name for this instance of the JBI implemention;
-     *         must be non-null and non-empty
-     */
-    String getJmxDomainName();
-}
diff --git a/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/DeliveryChannel.java b/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/DeliveryChannel.java
deleted file mode 100644
index 77bab93..0000000
--- a/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/DeliveryChannel.java
+++ /dev/null
@@ -1,133 +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 javax.jbi.messaging;
-
-import javax.jbi.servicedesc.ServiceEndpoint;
-
-import javax.xml.namespace.QName;
-
-/**
- * Bi-directional communication channel used to interact with the Normalized
- * Message Service.
- *
- * @author JSR208 Expert Group
- */
-public interface DeliveryChannel
-{
-    /**
-     * Closes the delivery channel, halting all message traffic.
-     *
-     * @throws MessagingException fatal error while closing channel.
-     */
-    void close() throws MessagingException;
-
-    /**
-     * Create a message exchange factory. This factory will create exchange
-     * instances with all appropriate properties set to null.
-     *
-     * @return a message exchange factory
-     */
-    MessageExchangeFactory createExchangeFactory();
-
-    /**
-     * Create a message exchange factory for the given interface name.
-     *
-     * @param interfaceName name of the interface for which all exchanges
-     *                      created by the returned factory will be set
-     * @return an exchange factory that will create exchanges for the given
-     *         interface; must be non-null
-     */
-    MessageExchangeFactory createExchangeFactory(QName interfaceName);
-
-    /**
-     * Create a message exchange factory for the given service name.
-     *
-     * @param serviceName name of the service for which all exchanges
-     *                    created by the returned factory will be set
-     * @return an exchange factory that will create exchanges for the given
-     *         service; must be non-null
-     */
-    MessageExchangeFactory createExchangeFactoryForService(QName serviceName);
-
-    /**
-     * Create a message exchange factory for the given endpoint.
-     *
-     * @param endpoint endpoint for which all exchanges created by the
-     *                 returned factory will be set for
-     * @return an exchange factory that will create exchanges for the
-     *         given endpoint
-     */
-    MessageExchangeFactory createExchangeFactory(ServiceEndpoint endpoint);
-
-    /**
-     * Blocking call used to service a MessageExchange instance which has
-     * been initiated by another component.  This method supports concurrent
-     * invocation for multi-threaded environments.
-     *
-     * @return mesage exchange instance
-     * @throws MessagingException failed to accept
-     */
-    MessageExchange accept() throws MessagingException;
-
-    /**
-     * Identical to accept(), but returns after specified interval even if
-     * a message exchange is unavailable.
-     *
-     * @param timeout time to wait in milliseconds
-     * @return mesage exchange instance or null if timeout is reached
-     * @throws MessagingException failed to accept
-     */
-    MessageExchange accept(long timeout) throws MessagingException;
-
-    /**
-     * Routes a MessageExchange instance through the Normalized Message Service
-     * to the appropriate servicing component. This method supports concurrent
-     * invocation for multi-threaded environments.
-     *
-     * @param exchange message exchange to send
-     * @throws MessagingException unable to send exchange
-     */
-    void send(MessageExchange exchange) throws MessagingException;
-
-    /**
-     * Routes a MessageExchange instance through the Normalized Message Service
-     * to the appropriate servicing component, blocking until the exchange is
-     * returned.  This method supports concurrent invocation for multi-threaded
-     * environments.
-     *
-     * @param exchange message exchange to send
-     * @return true if the exchange has been processed and returned by the
-     *         servicing component, false otherwise.
-     * @throws MessagingException unable to send exchange
-     */
-    boolean sendSync(MessageExchange exchange) throws MessagingException;
-
-    /**
-     * Routes a MessageExchange instance through the Normalized Message Service
-     * to the appropriate servicing component, blocking until the specified
-     * timeout is reached.  This method supports concurrent invocation for
-     * multi-threaded environments.
-     *
-     * @param exchange message exchange to send
-     * @param timeout time to wait in milliseconds
-     * @return true if the exchange has been processed and returned by the
-     *         servicing component, false in the case of timeout.
-     * @throws MessagingException unable to send exchange
-     */
-    boolean sendSync(MessageExchange exchange, long timeout) throws MessagingException;
-
-}
diff --git a/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/ExchangeStatus.java b/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/ExchangeStatus.java
deleted file mode 100644
index 49ace7a..0000000
--- a/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/ExchangeStatus.java
+++ /dev/null
@@ -1,100 +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 javax.jbi.messaging;
-
-/**
- * Typesafe enumeration containing status values for a message exchange.
- *
- * @author JSR208 Expert Group
- */
-public final class ExchangeStatus {
-
-    /**
-     * Indicates that an ME has not been processed to completion.
-     */
-    public static final ExchangeStatus ACTIVE = new ExchangeStatus("Active");
-
-    /**
-     * Indicates that an ME has terminated abnormally within the JBI environment.
-     */
-    public static final ExchangeStatus ERROR = new ExchangeStatus("Error");
-
-    /**
-     * Indicates that an ME has been processed to completion.
-     */
-    public static final ExchangeStatus DONE = new ExchangeStatus("Done");
-
-    /** String representation of status. */
-    private String mStatus;
-
-    /**
-     * Private constructor used to create a new ExchangeStatus type.
-     *
-     * @param status value
-     */
-    private ExchangeStatus(String status) {
-        mStatus = status;
-    }
-
-    /**
-     * Returns string value of enumerated type.
-     *
-     * @return String representation of status value.
-     */
-    public String toString() {
-        return mStatus;
-    }
-
-    /**
-     * Returns instance of ExchangeStatus that corresponds to given string.
-     *
-     * @param status string value of status
-     * @return ExchangeStatus
-     * @throws java.lang.IllegalArgumentException if string can't be translated
-     */
-    public static ExchangeStatus valueOf(String status) {
-        ExchangeStatus instance;
-
-        //
-        //  Convert symbolic name to object reference.
-        //
-        if (status.equals(DONE.toString())) {
-            instance = DONE;
-        } else if (status.equals(ERROR.toString())) {
-            instance = ERROR;
-        } else if (status.equals(ACTIVE.toString())) {
-            instance = ACTIVE;
-
-        } else {
-            //
-            //  Someone has a problem.
-            //
-            throw new java.lang.IllegalArgumentException(status);
-        }
-
-        return instance;
-    }
-
-    /**
-     * Returns hash code value for this object.
-     *
-     * @return hash code value
-     */
-    public int hashCode() {
-        return mStatus.hashCode();
-    }
-}
diff --git a/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/Fault.java b/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/Fault.java
deleted file mode 100644
index 1f8729f..0000000
--- a/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/Fault.java
+++ /dev/null
@@ -1,26 +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 javax.jbi.messaging;
-
-/**
- * Models WSDL fault messages.
- *
- * @author JSR208 Expert Group
- */
-public interface Fault extends NormalizedMessage {
-
-}
diff --git a/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/InOnly.java b/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/InOnly.java
deleted file mode 100644
index 7ef2978..0000000
--- a/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/InOnly.java
+++ /dev/null
@@ -1,41 +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 javax.jbi.messaging;
-
-/**
- * Supports operations used to process an In Only MEP to completion.
- *
- * @author JSR208 Expert Group
- */
-public interface InOnly extends MessageExchange {
-
-    /**
-     * Retrieves the <i>in</i> normalized message from this exchange.
-     *
-     * @return in message
-     */
-    NormalizedMessage getInMessage();
-
-    /**
-     * Sets the <i>in</i> normalized message for this exchange.
-     *
-     * @param msg in message
-     * @throws MessagingException unable to set in message
-     */
-    void setInMessage(NormalizedMessage msg) throws MessagingException;
-
-}
diff --git a/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/InOptionalOut.java b/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/InOptionalOut.java
deleted file mode 100644
index 8dcfc08..0000000
--- a/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/InOptionalOut.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 javax.jbi.messaging;
-
-/**
- * Supports operations used to process an In Optional Out MEP to completion.
- *
- * @author JSR208 Expert Group
- */
-public interface InOptionalOut extends MessageExchange {
-
-    /**
-     * Retrieves the <i>in</i> normalized message from this exchange.
-     *
-     * @return in message
-     */
-    NormalizedMessage getInMessage();
-
-    /**
-     * Retrieves the <i>out</i> normalized message from this exchange.
-     *
-     * @return out message
-     */
-    NormalizedMessage getOutMessage();
-    /**
-     * Sets the <i>in</i> normalized message for this exchange.
-     *
-     * @param msg in message
-     * @throws MessagingException unable to set in message
-     */
-    void setInMessage(NormalizedMessage msg) throws MessagingException;
-
-    /**
-     * Sets the <i>out</i> normalized message for this exchange.
-     *
-     * @param msg out message
-     * @throws MessagingException unable to set out message
-     */
-    void setOutMessage(NormalizedMessage msg) throws MessagingException;
-
-}
diff --git a/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/InOut.java b/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/InOut.java
deleted file mode 100644
index 34f5a19..0000000
--- a/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/InOut.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 javax.jbi.messaging;
-
-/**
- * Supports operations used to process an In Out MEP to completion.
- *
- * @author JSR208 Expert Group
- */
-public interface InOut extends MessageExchange {
-
-    /**
-     * Retrieves the <i>in</i> normalized message from this exchange.
-     *
-     * @return in message
-     */
-    NormalizedMessage getInMessage();
-
-    /**
-     * Retrieves the <i>out</i> normalized message from this exchange.
-     *
-     * @return out message
-     */
-    NormalizedMessage getOutMessage();
-    /**
-     * Sets the <i>in</i> normalized message for this exchange.
-     *
-     * @param msg in message
-     * @throws MessagingException unable to set in message
-     */
-    void setInMessage(NormalizedMessage msg) throws MessagingException;
-
-    /**
-     * Sets the <i>out</i> normalized message for this exchange.
-     *
-     * @param msg out message
-     * @throws MessagingException unable to set out message
-     */
-    void setOutMessage(NormalizedMessage msg) throws MessagingException;
-
-}
diff --git a/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/MessageExchange.java b/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/MessageExchange.java
deleted file mode 100644
index ef441b7..0000000
--- a/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/MessageExchange.java
+++ /dev/null
@@ -1,254 +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 javax.jbi.messaging;
-
-import java.net.URI;
-
-import javax.jbi.servicedesc.ServiceEndpoint;
-
-import javax.xml.namespace.QName;
-
-/**
- * MessageExchange represents a container for normalized messages which
- * are described by an exchange pattern. The exchange pattern defines the
- * names, sequence, and cardinality of messages in an exchange.
- *
- * @author JSR208 Expert Group
- */
-public interface MessageExchange {
-
-    /**
-     * JTA transaction context property name.
-     */
-    String JTA_TRANSACTION_PROPERTY_NAME = "javax.jbi.transaction.jta";
-
-    /**
-     * Returns the URI of the pattern for this exchange.
-     *
-     * @return pattern URI for this exchange
-     */
-    URI getPattern();
-
-    /**
-     * Returns the unique identifier assigned by the NMS for this exchange.
-     *
-     * @return unique id for this exchange
-     */
-    String getExchangeId();
-
-    /**
-     * Returns the processing status of the exchange.
-     *
-     * @return status of the exchange
-     */
-    ExchangeStatus getStatus();
-
-    /**
-     * Sets the processing status of the exchange.
-     *
-     * @param status exchange status
-     * @throws MessagingException failed to set status, possibly due to
-     *                            an invalid state transition.
-     */
-    void setStatus(ExchangeStatus status) throws MessagingException;
-
-    /**
-     * Used to specify the source of a failure status. Invoking this method
-     * automatically adjusts the status of the ME to {@link ExchangeStatus#ERROR}.
-     *
-     * @param error error cause
-     */
-    void setError(Exception error);
-
-    /**
-     * Retrieves the Exception describing the exchanges error status.
-     *
-     * @return exception associated with this exchange
-     */
-    Exception getError();
-
-    /**
-     * Retrieves the fault message for this exchange, if one exists. A fault/message
-     * reference is unnecessary, since an exchange can carry at most one fault, and
-     * it is always the final message in an exchange.
-     *
-     * @return fault associated with the exchange, or null if not present
-     */
-    Fault getFault();
-
-    /**
-     * Specifies the fault message for this exchange, if one exists. A fault/message
-     * reference is unnecessary, since an exchange can carry at most one fault, and
-     * it is always the final message in an exchange.
-     *
-     * @param fault fault
-     * @throws MessagingException operation not permitted in the current exchange state
-     */
-    void setFault(Fault fault) throws MessagingException;
-
-    /**
-     * Creates a normalized message based on the specified message reference. The pattern
-     * governing this exchange must contain a definition for the reference name supplied.
-     *
-     * @return a new normalized message
-     * @throws MessagingException failed to create message
-     */
-    NormalizedMessage createMessage() throws MessagingException;
-
-    /**
-     * Generic factory method for Fault objects.
-     *
-     * @return a new fault
-     * @throws MessagingException failed to create fault
-     */
-    Fault createFault() throws MessagingException;
-
-    /**
-     * Retrieves a normalized message based on the specified message reference.
-     *
-     * @param name message reference
-     * @return message with the specified reference name
-     */
-    NormalizedMessage getMessage(String name);
-
-    /**
-     * Sets a normalized message with the specified message reference. The pattern
-     * governing this exchange must contain a definition for the reference name
-     * supplied.
-     *
-     * @param msg normalized message
-     * @param name message reference
-     * @throws MessagingException operation not permitted in the current exchange state
-     */
-    void setMessage(NormalizedMessage msg, String name) throws MessagingException;
-
-    /**
-     * Retrieves the specified property from the exchange.
-     *
-     * @param name property name
-     * @return property value
-     */
-    Object getProperty(String name);
-
-    /**
-     * Specifies a property for the exchange.
-     *
-     * @param name property name
-     * @param obj property value
-     */
-    void setProperty(String name, Object obj);
-
-    /**
-     * Specifies the endpoint used by this exchange.
-     *
-     * @param endpoint endpoint address
-     */
-    void setEndpoint(ServiceEndpoint endpoint);
-
-    /**
-     * Specifies the service used by this exchange.
-     *
-     * @param service service address
-     */
-    void setService(QName service);
-
-    /**
-     * Specifies the interface name used by this exchange.
-     *
-     * @param interfaceName interface name
-     */
-    void setInterfaceName(QName interfaceName);
-
-    /**
-     * Specifies the operation used by this exchange.
-     *
-     * @param name operation name
-     */
-    void setOperation(QName name);
-
-    /**
-     * Retrieves the endpoint used by this exchange.
-     *
-     * @return endpoint address for this message exchange
-     */
-    ServiceEndpoint getEndpoint();
-
-    /**
-     * Retrieves the interface name used by this exchange.
-     *
-     * @return interface used for this message exchange
-     */
-    QName getInterfaceName();
-
-    /**
-     * Retrieves the service used by this exchange.
-     * 
-     * @return service address for this message exchange
-     */
-    QName getService();
-
-    /**
-     * Retrieves the operation used by this exchange.
-     * 
-     * @return operation name for this message exchange
-     */
-    QName getOperation();
-
-    /**
-     * Queries the existence of a transaction context.
-     * 
-     * @return boolean transactional state of the exchange
-     */
-    boolean isTransacted();
-
-    /**
-     * Queries the role that the caller plays in the exchange.
-     *
-     * @return Role expected of caller.
-     */
-    Role getRole();
-
-    /**
-     * Returns the name of all properties for this exchange.
-     * 
-     * @return a set of all the property names, as Strings.
-     */
-    java.util.Set getPropertyNames();
-
-    /**
-     * Typesafe enum containing the roles a component can play in a service.
-     * 
-     */
-    public static final class Role {
-
-        /**
-         * Service provider.
-         */
-        public static final Role PROVIDER = new Role();
-
-        /**
-         * Service Consumer.
-         */
-        public static final Role CONSUMER = new Role();
-
-        /**
-         * Prevent direct instantiation.
-         */
-        private Role() {
-        }
-    }
-}
diff --git a/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/MessageExchangeFactory.java b/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/MessageExchangeFactory.java
deleted file mode 100644
index 3e938a3..0000000
--- a/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/MessageExchangeFactory.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 javax.jbi.messaging;
-
-import java.net.URI;
-
-import javax.xml.namespace.QName;
-
-/**
- * A message exchange factory is used used to create new instances of
- * MessageExchange. Service consumers use these factories to create
- * message exchanges when initiating a new service request. Message
- * exchange factories are created using the
- * {@link javax.jbi.component.ComponentContext} given to the component
- * during its initialization (see
- * {@link javax.jbi.component.ComponentLifeCycle}). There are a variety
- * of ways to creating such factories, each of which creates a context
- * that is used to provide some of the default properties of
- * MessageExchange instances created by the factory instances. For example,
- * a factory can be created for a particular endpoint, ensuring that all exchanges
- * created by the factory have that endpoint set as the default endpoint property
- * of the exchange. This allows components to retain factories as a way of aligning
- * internal processing context with the context contained in the factory, ensuring
- * that the exchanges created consistently reflect that context.
- */
-public interface MessageExchangeFactory {
-
-    /**
-     * Creates a new MessageExchange instance used to initiate a service
-     * invocation. JBI defines a set of four basic message exchange types,
-     * corresponding to the predefined in-* WSDL 2.0 Message Exchange Patterns.
-     *
-     * @param serviceName name of the service to be invoked
-     * @param operationName name of the operation to be invoked
-     * @return new message exchange, initialized for invoking the given service and operation
-     * @throws MessagingException if the given service or operation are not registered
-     *                            with the NMR or the factory was created for a particular
-     *                            interface, and the given serviceName does not implement
-     *                            that interface.
-     */
-    MessageExchange createExchange(QName serviceName, QName operationName) throws MessagingException;
-
-    /**
-     * Creates a new MessageExchange instance used to initiate a service invocation.
-     * JBI defines a set of eight fundamental message exchange types which are created
-     * using binding and engine delivery channels. This base method is provided for
-     * extensibility, to satisfy the need for vendor-specific message exchange patterns.
-     * The registration and administration of these patterns is not addressed by JBI.
-     *
-     * @param pattern message exchange pattern
-     * @return new message exchange
-     * @throws MessagingException specified pattern is not registered to a message exchange type
-     */
-    MessageExchange createExchange(URI pattern) throws MessagingException;
-
-    /**
-     * Convenience method that creates an In-Only message exchange.
-     * 
-     * @return new In-Only message exchange
-     * @throws MessagingException failed to create exchange
-     */
-    InOnly createInOnlyExchange() throws MessagingException;
-
-    /**
-     * Convenience method that creates an In-Optional-Out message exchange.
-     *
-     * @return new In-Optional-Out message exchange
-     * @throws MessagingException failed to create exchange
-     */
-    InOptionalOut createInOptionalOutExchange() throws MessagingException;
-
-    /**
-     * Convenience method that creates an In-Out message exchange.
-     *
-     * @return new In-Out message exchange
-     * @throws MessagingException failed to create exchange
-     */
-    InOut createInOutExchange() throws MessagingException;
-
-    /**
-     * Convenience method that creates an Robust-In-Only message exchange.
-     *
-     * @return new Robust-In-Only message exchange
-     * @throws MessagingException failed to create exchange
-     */
-    RobustInOnly createRobustInOnlyExchange() throws MessagingException;
-
-}
diff --git a/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/MessagingException.java b/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/MessagingException.java
deleted file mode 100644
index 044d139..0000000
--- a/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/MessagingException.java
+++ /dev/null
@@ -1,54 +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 javax.jbi.messaging;
-
-/**
- * Generic exception used to report messaging related errors
- * in the Normalized Message Service.
- *
- * @author JSR208 Expert Group
- */
-public class MessagingException extends javax.jbi.JBIException {
-
-    /**
-     * Create a new MessagingException.
-     *
-     * @param msg error detail
-     */
-    public MessagingException(String msg) {
-        super(msg);
-    }
-
-    /**
-     * Create a new MessagingException with the specified cause and error text.
-     *
-     * @param msg error detail
-     * @param cause underlying error
-     */
-    public MessagingException(String msg, Throwable cause) {
-        super(msg, cause);
-    }
-
-    /**
-     * Create a new MessagingException with the specified cause.
-     * 
-     * @param cause underlying error
-     */
-    public MessagingException(Throwable cause) {
-        super(cause);
-    }
-}
diff --git a/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/NormalizedMessage.java b/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/NormalizedMessage.java
deleted file mode 100644
index ede90a5..0000000
--- a/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/NormalizedMessage.java
+++ /dev/null
@@ -1,116 +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 javax.jbi.messaging;
-
-import java.util.Set;
-
-import javax.activation.DataHandler;
-import javax.security.auth.Subject;
-import javax.xml.transform.Source;
-
-/**
- * Represents a JBI Normalized Message.
- *
- * @author JSR208 Expert Group
- */
-public interface NormalizedMessage {
-
-    /**
-     * Add an attachment to the message.
-     *
-     * @param id unique identifier for the attachment
-     * @param content attachment content
-     * @throws MessagingException failed to add attachment
-     */
-    void addAttachment(String id, DataHandler content) throws MessagingException;
-
-    /**
-     * Retrieve the content of the message.
-     *
-     * @return message content
-     */
-    Source getContent();
-
-    /**
-     * Retrieve attachment with the specified identifier.
-     *
-     * @param id unique identifier for attachment
-     * @return DataHandler representing attachment content, or null if an attachment
-     *         with the specified identifier is not found
-     */
-    DataHandler getAttachment(String id);
-
-    /**
-     * Returns a list of identifiers for each attachment to the message.
-     *
-     * @return iterator over String attachment identifiers
-     */
-    Set getAttachmentNames();
-
-    /**
-     * Removes attachment with the specified unique identifier.
-     *
-     * @param id attachment identifier
-     * @throws MessagingException failed to remove attachment
-     */
-    void removeAttachment(String id) throws MessagingException;
-
-    /**
-     * Set the content of the message.
-     *
-     * @param content message content
-     * @throws MessagingException failed to set content
-     */
-    void setContent(Source content) throws MessagingException;
-
-    /**
-     * Set a property on the message.
-     *
-     * @param name property name
-     * @param value property value
-     */
-    void setProperty(String name, Object value);
-
-    /**
-     * Set the security Subject for the message.
-     *
-     * @param subject Subject to associated with message.
-     */
-    void setSecuritySubject(Subject subject);
-
-    /**
-     * Retrieve a list of property names for the message.
-     *
-     * @return list of property names
-     */
-    Set getPropertyNames();
-
-    /**
-     * Retrieve a property from the message.
-     *
-     * @param name property name
-     * @return property value, or null if the property does not exist
-     */
-    Object getProperty(String name);
-
-    /**
-     * Retrieve the security Subject from the message.
-     *
-     * @return security Subject associated with message, or null.
-     */
-    Subject getSecuritySubject();
-}
diff --git a/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/RobustInOnly.java b/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/RobustInOnly.java
deleted file mode 100644
index e7a925c..0000000
--- a/trunk/jbi-api-1.0/src/main/java/javax/jbi/messaging/RobustInOnly.java
+++ /dev/null
@@ -1,41 +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 javax.jbi.messaging;
-
-/**
- * Supports operations used to process an Robust In Only MEP to completion.
- *
- * @author JSR208 Expert Group
- */
-public interface RobustInOnly extends MessageExchange {
-
-    /**
-     * Retrieves the <i>in</i> normalized message from this exchange.
-     *
-     * @return in message
-     */
-    NormalizedMessage getInMessage();
-
-    /**
-     * Sets the <i>in</i> normalized message for this exchange.
-     *
-     * @param msg in message
-     * @throws MessagingException unable to set in message
-     */
-    void setInMessage(NormalizedMessage msg) throws MessagingException;
-
-}
diff --git a/trunk/jbi-api-1.0/src/main/java/javax/jbi/package.html b/trunk/jbi-api-1.0/src/main/java/javax/jbi/package.html
deleted file mode 100644
index c97de60..0000000
--- a/trunk/jbi-api-1.0/src/main/java/javax/jbi/package.html
+++ /dev/null
@@ -1,25 +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.
--->
-<html>
-<head>
-</head>
-<body>
-
-Java Business Integration APIs/SPIs
-
-</body>
-</html>
diff --git a/trunk/jbi-api-1.0/src/main/java/javax/jbi/servicedesc/ServiceEndpoint.java b/trunk/jbi-api-1.0/src/main/java/javax/jbi/servicedesc/ServiceEndpoint.java
deleted file mode 100644
index 4d53053..0000000
--- a/trunk/jbi-api-1.0/src/main/java/javax/jbi/servicedesc/ServiceEndpoint.java
+++ /dev/null
@@ -1,65 +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 javax.jbi.servicedesc;
-
-import javax.xml.namespace.QName;
-
-/**
- * Reference to an endpoint, used to refer to an endpoint as well as
- * query information about the endpoint. An endpoint is an addressable
- * entity in the JBI system, used for accessing the provider of a
- * specific service.
- *
- * @author JSR208 Expert Group
- */
-public interface ServiceEndpoint {
-
-    /**
-     * Get a reference to this endpoint, using an endpoint reference
-     * vocabulary that is known to the provider.
-     *
-     * @param operationName the name of the operation to be performed by a
-     *                      consumer of the generated endpoint reference. Set
-     *                      to null if this is not applicable.
-     * @return endpoint reference as an XML fragment; null if the provider
-     *         does not support such references.
-     */
-    org.w3c.dom.DocumentFragment getAsReference(QName operationName);
-
-    /**
-     * Returns the name of this endpoint.
-     *
-     * @return the endpoint name
-     */
-    String getEndpointName();
-
-    /**
-     * Get the qualified names of all the interfaces implemented by this
-     * service endpoint.
-     *
-     * @return array of all interfaces implemented by this service endpoint;
-     *         must be non-null and non-empty.
-     */
-    javax.xml.namespace.QName[] getInterfaces();
-
-    /**
-     * Returns the service name of this endpoint.
-     * 
-     * @return the qualified service name.
-     */
-    javax.xml.namespace.QName getServiceName();
-}
diff --git a/trunk/jcr-api-2.0/pom.xml b/trunk/jcr-api-2.0/pom.xml
deleted file mode 100644
index 06ec4ec..0000000
--- a/trunk/jcr-api-2.0/pom.xml
+++ /dev/null
@@ -1,96 +0,0 @@
-<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.specs</groupId>
-        <artifactId>specs</artifactId>
-        <version>2.1.0</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.specs</groupId>
-    <artifactId>org.apache.servicemix.specs.jcr-api-2.0</artifactId>
-    <version>2.1.0</version>
-    <packaging>bundle</packaging>
-    <name>Apache ServiceMix :: Specs :: JCR API 2.0</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>javax.jcr</groupId>
-            <artifactId>jcr</artifactId>
-            <version>2.0</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Description>${project.description}</Bundle-Description>
-                        <Export-Package>javax.jcr*;version=2.0;-split-package:=merge-first;-noimport:=true</Export-Package>
-                        <Import-Package>*</Import-Package>
-                        <Implementation-Title>Apache ServiceMix</Implementation-Title>
-                        <Implementation-Version>${project.version}</Implementation-Version>
-                    </instructions>
-                    <unpackBundle>true</unpackBundle>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>deploy</id>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>attach-javadocs</id>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-source-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>attach-sources</id>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-</project>
diff --git a/trunk/jsr250-1.0/pom.xml b/trunk/jsr250-1.0/pom.xml
deleted file mode 100644
index 7e043d0..0000000
--- a/trunk/jsr250-1.0/pom.xml
+++ /dev/null
@@ -1,168 +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.specs</groupId>
-        <artifactId>specs</artifactId>
-        <version>2.1.0</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.specs</groupId>
-    <artifactId>org.apache.servicemix.specs.jsr250-1.0</artifactId>
-    <packaging>bundle</packaging>
-    <version>2.1.0</version>
-    <name>Apache ServiceMix :: Specs :: JSR-250 1.0</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-annotation_1.0_spec</artifactId>
-            <version>1.0</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Description>${project.description}</Bundle-Description>
-                        <Export-Package>javax.annotation*;version=1.0;-split-package:=merge-first;-noimport:=true</Export-Package>
-                        <Import-Package>*</Import-Package>
-                        <Private-Package>org.apache.servicemix.specs.locator;-split-package:=merge-first</Private-Package>
-                        <Bundle-Activator>org.apache.servicemix.specs.locator.Activator</Bundle-Activator>
-                        <Implementation-Title>Apache ServiceMix</Implementation-Title>
-                        <Implementation-Version>${project.version}</Implementation-Version>
-                    </instructions>
-                    <unpackBundle>true</unpackBundle>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <artifactSet>
-                                <includes>
-                                    <include>org.apache.geronimo.specs:geronimo-annotation_1.0_spec</include>
-                                    <include>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</include>
-                                </includes>
-                            </artifactSet>
-                            <filters>
-                                <filter>
-                                    <artifact>org.apache.geronimo.specs:geronimo-annotation_1.0_spec</artifact>
-                                    <excludes>
-                                        <exclude>javax/**</exclude>
-                                    </excludes>
-                                </filter>
-                                <filter>
-                                    <artifact>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</artifact>
-                                    <excludes>
-                                        <exclude>org/**</exclude>
-                                    </excludes>
-                                </filter>
-                            </filters>
-                            <createSourcesJar>${createSourcesJar}</createSourcesJar>
-                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-                            <createDependencyReducedPom>true</createDependencyReducedPom>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>deploy</id>
-            <properties>
-                <createSourcesJar>true</createSourcesJar>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-dependency-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>unpack-sources</id>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>unpack</goal>
-                                </goals>
-                                <configuration>
-                                    <artifactItems>
-                                        <artifactItem>
-                                            <groupId>org.apache.geronimo.specs</groupId>
-                                            <artifactId>geronimo-annotation_1.0_spec</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                        <artifactItem>
-                                            <groupId>org.apache.servicemix.specs</groupId>
-                                            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                    </artifactItems>
-                                    <outputDirectory>${project.build.directory}/sources</outputDirectory>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>package</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <minmemory>128m</minmemory>
-                            <maxmemory>512m</maxmemory>
-                            <sourcepath>${project.build.directory}/sources</sourcepath>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
diff --git a/trunk/jsr303-api-1.0.0/pom.xml b/trunk/jsr303-api-1.0.0/pom.xml
deleted file mode 100644
index 9241095..0000000
--- a/trunk/jsr303-api-1.0.0/pom.xml
+++ /dev/null
@@ -1,176 +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.specs</groupId>
-        <artifactId>specs</artifactId>
-        <version>2.1.0</version>
-    </parent>
-    
-    <groupId>org.apache.servicemix.specs</groupId>
-    <artifactId>org.apache.servicemix.specs.jsr303-api-1.0.0</artifactId>
-    <packaging>bundle</packaging>
-    <version>2.1.0</version>
-    <name>Apache ServiceMix :: Specs :: JSR-303 API 1.0.0</name>
-    
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>javax.validation</groupId>
-            <artifactId>validation-api</artifactId>
-            <version>1.0.0.GA</version>
-        </dependency>
-    </dependencies>
-    
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Description>${project.description}</Bundle-Description>
-                        <Export-Package>javax.validation*;version=1.0.0;-split-package:=merge-first;-noimport:=true</Export-Package>
-                        <Import-Package>*</Import-Package>
-                        <Private-Package>org.apache.servicemix.specs.locator;-split-package:=merge-first</Private-Package>
-                        <Bundle-Activator>org.apache.servicemix.specs.locator.Activator</Bundle-Activator>
-                        <Implementation-Title>Apache ServiceMix</Implementation-Title>
-                        <Implementation-Version>${project.version}</Implementation-Version>
-                    </instructions>
-                    <unpackBundle>true</unpackBundle>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <artifactSet>
-                                <includes>
-                                    <include>javax.validation:validation-api</include>
-                                    <include>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</include>
-                                    <include>${project.groupId}:${project.artifactId}</include>
-                                </includes>
-                            </artifactSet>
-                            <filters>
-                                <filter>
-                                    <artifact>javax.validation:validation-api</artifact>
-                                    <excludes>
-                                        <exclude>javax/**</exclude>
-                                    </excludes>
-                                </filter>
-                                <filter>
-                                    <artifact>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</artifact>
-                                    <excludes>
-                                        <exclude>org/**</exclude>
-                                    </excludes>
-                                </filter>
-                            </filters>
-                            <createSourcesJar>${createSourcesJar}</createSourcesJar>
-                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-                            <createDependencyReducedPom>true</createDependencyReducedPom>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-    
-    <profiles>
-        <profile>
-            <id>deploy</id>
-            <properties>
-                <createSourcesJar>true</createSourcesJar>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-source-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>attach-sources</id>
-                                <phase>process-classes</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-dependency-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>unpack-sources</id>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>unpack</goal>
-                                </goals>
-                                <configuration>
-                                    <artifactItems>
-                                        <artifactItem>
-                                            <groupId>org.apache.servicemix.specs</groupId>
-                                            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                    </artifactItems>
-                                    <outputDirectory>${project.build.directory}/sources</outputDirectory>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>package</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <minmemory>128m</minmemory>
-                            <maxmemory>512m</maxmemory>
-                            <sourcepath>${project.build.directory}/sources</sourcepath>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
diff --git a/trunk/jsr303-api-1.0.0/src/main/java/javax/validation/Validation.java b/trunk/jsr303-api-1.0.0/src/main/java/javax/validation/Validation.java
deleted file mode 100644
index 20a3efd..0000000
--- a/trunk/jsr303-api-1.0.0/src/main/java/javax/validation/Validation.java
+++ /dev/null
@@ -1,433 +0,0 @@
-// $Id: Validation.java 17620 2009-10-04 19:19:28Z hardy.ferentschik $
-/*
-* JBoss, Home of Professional Open Source
-* Copyright 2009, Red Hat, Inc. and/or its affiliates, and individual contributors
-* by the @authors tag. See the copyright.txt in the distribution for a
-* full listing of individual contributors.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-* http://www.apache.org/licenses/LICENSE-2.0
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-package javax.validation;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.Map;
-import java.util.WeakHashMap;
-import javax.validation.bootstrap.GenericBootstrap;
-import javax.validation.bootstrap.ProviderSpecificBootstrap;
-import javax.validation.spi.BootstrapState;
-import javax.validation.spi.ValidationProvider;
-
-/**
- * This class is the entry point for Bean Validation. There are three ways
- * to bootstrap it:
- * <ul>
- * <li>
- * The easiest approach is to build the default <code>ValidatorFactory</code>.
- * <pre>{@code ValidatorFactory factory = Validation.buildDefaultValidatorFactory();}</pre>
- * In this case, the default validation provider resolver
- * will be used to locate available providers.
- * The chosen provider is defined as followed:
- * <ul>
- * <li>if the XML configuration defines a provider, this provider is used</li>
- * <li>if the XML configuration does not define a provider or if no XML configuration
- * is present the first provider returned by the
- * <code>ValidationProviderResolver</code> instance is used.</li>
- * </ul>
- * </li>
- * <li>
- * The second bootstrap approach allows to choose a custom
- * <code>ValidationProviderResolver</code>. The chosen
- * <code>ValidationProvider</code> is then determined in the same way
- * as in the default bootstrapping case (see above).
- * <pre>{@code
- * Configuration<?> configuration = Validation
- *    .byDefaultProvider()
- *    .providerResolver( new MyResolverStrategy() )
- *    .configure();
- * ValidatorFactory factory = configuration.buildValidatorFactory();}
- * </pre>
- * </li>
- * <li>
- * The third approach allows you to specify explicitly and in
- * a type safe fashion the expected provider.
- * <p/>
- * Optionally you can choose a custom <code>ValidationProviderResolver</code>.
- * <pre>{@code
- * ACMEConfiguration configuration = Validation
- *    .byProvider(ACMEProvider.class)
- *    .providerResolver( new MyResolverStrategy() )  // optionally set the provider resolver
- *    .configure();
- * ValidatorFactory factory = configuration.buildValidatorFactory();}
- * </pre>
- * </li>
- * </ul>
- * Note:<br/>
- * <ul>
- * <li>
- * The <code>ValidatorFactory</code> object built by the bootstrap process should be cached
- * and shared amongst <code>Validator</code> consumers.
- * </li>
- * <li>
- * This class is thread-safe.
- * </li>
- * </ul>
- *
- * @author Emmanuel Bernard
- * @author Hardy Ferentschik
- */
-public class Validation {
-
-	/**
-	 * Build and return a <code>ValidatorFactory</code> instance based on the
-	 * default Bean Validation provider and following the XML configuration.
-	 * <p/>
-	 * The provider list is resolved using the default validation provider resolver
-	 * logic.
-	 * <p/> The code is semantically equivalent to
-	 * <code>Validation.byDefaultProvider().configure().buildValidatorFactory()</code>
-	 *
-	 * @return <code>ValidatorFactory</code> instance.
-	 *
-	 * @throws ValidationException if the ValidatorFactory cannot be built
-	 */
-	public static ValidatorFactory buildDefaultValidatorFactory() {
-		return byDefaultProvider().configure().buildValidatorFactory();
-	}
-
-	/**
-	 * Build a <code>Configuration</code>. The provider list is resolved
-	 * using the strategy provided to the bootstrap state.
-	 * <pre>
-	 * Configuration&lt?&gt; configuration = Validation
-	 *    .byDefaultProvider()
-	 *    .providerResolver( new MyResolverStrategy() )
-	 *    .configure();
-	 * ValidatorFactory factory = configuration.buildValidatorFactory();
-	 * </pre>
-	 * The provider can be specified in the XML configuration. If the XML
-	 * configuration does not exsist or if no provider is specified,
-	 * the first available provider will be returned.
-	 *
-	 * @return instance building a generic <code>Configuration</code>
-	 *         compliant with the bootstrap state provided.
-	 */
-	public static GenericBootstrap byDefaultProvider() {
-		return new GenericBootstrapImpl();
-	}
-
-	/**
-	 * Build a <code>Configuration</code> for a particular provider implementation.
-	 * Optionally overrides the provider resolution strategy used to determine the provider.
-	 * <p/>
-	 * Used by applications targeting a specific provider programmatically.
-	 * <p/>
-	 * <pre>
-	 * ACMEConfiguration configuration =
-	 *     Validation.byProvider(ACMEProvider.class)
-	 *             .providerResolver( new MyResolverStrategy() )
-	 *             .configure();
-	 * </pre>,
-	 * where <code>ACMEConfiguration</code> is the
-	 * <code>Configuration</code> sub interface uniquely identifying the
-	 * ACME Bean Validation provider. and <code>ACMEProvider</code> is the
-	 * <code>ValidationProvider</code> implementation of the ACME provider.
-	 *
-	 * @param providerType the <code>ValidationProvider</code> implementation type
-	 *
-	 * @return instance building a provider specific <code>Configuration</code>
-	 *         sub interface implementation.
-	 */
-	public static <T extends Configuration<T>, U extends ValidationProvider<T>>
-	ProviderSpecificBootstrap<T> byProvider(Class<U> providerType) {
-		return new ProviderSpecificBootstrapImpl<T, U>( providerType );
-	}
-
-	//private class, not exposed
-	private static class ProviderSpecificBootstrapImpl<T extends Configuration<T>, U extends ValidationProvider<T>>
-			implements ProviderSpecificBootstrap<T> {
-
-		private final Class<U> validationProviderClass;
-		private ValidationProviderResolver resolver;
-
-		public ProviderSpecificBootstrapImpl(Class<U> validationProviderClass) {
-			this.validationProviderClass = validationProviderClass;
-		}
-
-		/**
-		 * Optionally define the provider resolver implementation used.
-		 * If not defined, use the default ValidationProviderResolver
-		 *
-		 * @param resolver ValidationProviderResolver implementation used
-		 *
-		 * @return self
-		 */
-		public ProviderSpecificBootstrap<T> providerResolver(ValidationProviderResolver resolver) {
-			this.resolver = resolver;
-			return this;
-		}
-
-		/**
-		 * Determine the provider implementation suitable for byProvider(Class)
-		 * and delegate the creation of this specific Configuration subclass to the provider.
-		 *
-		 * @return a Configuration sub interface implementation
-		 */
-		public T configure() {
-			if ( validationProviderClass == null ) {
-				throw new ValidationException(
-						"builder is mandatory. Use Validation.byDefaultProvider() to use the generic provider discovery mechanism"
-				);
-			}
-			//used mostly as a BootstrapState
-			GenericBootstrapImpl state = new GenericBootstrapImpl();
-			if ( resolver == null ) {
-				resolver = state.getDefaultValidationProviderResolver();
-			}
-			else {
-				//stay null if no resolver is defined
-				state.providerResolver( resolver );
-			}
-
-			List<ValidationProvider<?>> resolvers;
-			try {
-				resolvers = resolver.getValidationProviders();
-			}
-			catch ( RuntimeException re ) {
-				throw new ValidationException( "Unable to get available provider resolvers.", re );
-			}
-
-			for ( ValidationProvider provider : resolvers ) {
-				if ( validationProviderClass.isAssignableFrom( provider.getClass() ) ) {
-					ValidationProvider<T> specificProvider = validationProviderClass.cast( provider );
-					return specificProvider.createSpecializedConfiguration( state );
-
-				}
-			}
-			throw new ValidationException( "Unable to find provider: " + validationProviderClass );
-		}
-	}
-
-	//private class, not exposed
-	private static class GenericBootstrapImpl implements GenericBootstrap, BootstrapState {
-
-		private ValidationProviderResolver resolver;
-		private ValidationProviderResolver defaultResolver;
-
-		public GenericBootstrap providerResolver(ValidationProviderResolver resolver) {
-			this.resolver = resolver;
-			return this;
-		}
-
-		public ValidationProviderResolver getValidationProviderResolver() {
-			return resolver;
-		}
-
-		public ValidationProviderResolver getDefaultValidationProviderResolver() {
-			if ( defaultResolver == null ) {
-				defaultResolver = new DefaultValidationProviderResolver();
-			}
-			return defaultResolver;
-		}
-
-		public Configuration<?> configure() {
-			ValidationProviderResolver resolver = this.resolver == null ?
-					getDefaultValidationProviderResolver() :
-					this.resolver;
-
-			List<ValidationProvider<?>> resolvers;
-			try {
-				resolvers = resolver.getValidationProviders();
-			}
-			catch ( RuntimeException re ) {
-				throw new ValidationException( "Unable to get available provider resolvers.", re );
-			}
-
-			if ( resolvers.size() == 0 ) {
-				//FIXME looks like an assertion error almost
-				throw new ValidationException( "Unable to find a default provider" );
-			}
-
-			Configuration<?> config;
-			try {
-				config = resolver.getValidationProviders().get( 0 ).createGenericConfiguration( this );
-			}
-			catch ( RuntimeException re ) {
-				throw new ValidationException( "Unable to instantiate Configuration.", re );
-			}
-
-			return config;
-		}
-	}
-
-	/**
-	 * Find <code>ValidationProvider</code> according to the default <code>ValidationProviderResolver</code> defined in the
-	 * Bean Validation specification. This implementation uses the current classloader or the classloader which has loaded
-	 * the current class if the current class loader is unavailable. The classloader is used to retrieve the Service Provider files.
-	 * <p>
-	 * This class implements the Service Provider pattern described <a href="http://java.sun.com/j2se/1.5.0/docs/guide/jar/jar.html#Service%20Provider">here</a>.
-	 * Since we cannot rely on Java 6 we have to reimplement the <code>Service</code> functionality.
-	 * </p>
-	 *
-	 * @author Emmanuel Bernard
-	 * @author Hardy Ferentschik
-	 */
-	private static class DefaultValidationProviderResolver implements ValidationProviderResolver {
-
-		//cache per classloader for an appropriate discovery
-		//keep them in a weak hashmap to avoid memory leaks and allow proper hot redeployment
-		//TODO use a WeakConcurrentHashMap
-		//FIXME The List<VP> does keep a strong reference to the key ClassLoader, use the same model as JPA CachingPersistenceProviderResolver
-		private static final Map<ClassLoader, List<ValidationProvider<?>>> providersPerClassloader =
-				new WeakHashMap<ClassLoader, List<ValidationProvider<?>>>();
-
-		private static final String SERVICES_FILE = "META-INF/services/" + ValidationProvider.class.getName();
-
-		public List<ValidationProvider<?>> getValidationProviders() {
-			ClassLoader classloader = GetClassLoader.fromContext();
-			if ( classloader == null ) {
-				classloader = GetClassLoader.fromClass( DefaultValidationProviderResolver.class );
-			}
-
-			List<ValidationProvider<?>> providers;
-			synchronized ( providersPerClassloader ) {
-				providers = providersPerClassloader.get( classloader );
-			}
-
-			if ( providers == null ) {
-				providers = new ArrayList<ValidationProvider<?>>();
-				try {
-					// If we are deployed into an OSGi environment, leverage it
-					Class<? extends ValidationProvider> providerClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(ValidationProvider.class);
-					if (providerClass != null) {
-						providers.add(providerClass.newInstance());
-					}
-				} catch (Throwable e) {
-					// Do nothing here
-				} 
-				String name = null;
-				try {
-					Enumeration<URL> providerDefinitions = classloader.getResources( SERVICES_FILE );
-					while ( providerDefinitions.hasMoreElements() ) {
-						URL url = providerDefinitions.nextElement();
-						InputStream stream = url.openStream();
-						try {
-							BufferedReader reader = new BufferedReader( new InputStreamReader( stream ), 100 );
-							name = reader.readLine();
-							while ( name != null ) {
-								name = name.trim();
-								if ( !name.startsWith( "#" ) ) {
-									final Class<?> providerClass = loadClass(
-											name,
-											DefaultValidationProviderResolver.class
-									);
-
-									providers.add(
-											( ValidationProvider ) providerClass.newInstance()
-									);
-								}
-								name = reader.readLine();
-							}
-						}
-						finally {
-							stream.close();
-						}
-					}
-				}
-				catch ( IOException e ) {
-					throw new ValidationException( "Unable to read " + SERVICES_FILE, e );
-				}
-				catch ( ClassNotFoundException e ) {
-					//TODO is it better to not fail the whole loading because of a black sheep?
-					throw new ValidationException( "Unable to load Bean Validation provider " + name, e );
-				}
-				catch ( IllegalAccessException e ) {
-					throw new ValidationException( "Unable to instanciate Bean Validation provider" + name, e );
-				}
-				catch ( InstantiationException e ) {
-					throw new ValidationException( "Unable to instanciate Bean Validation provider" + name, e );
-				}
-
-				synchronized ( providersPerClassloader ) {
-					providersPerClassloader.put( classloader, providers );
-				}
-			}
-
-			return providers;
-		}
-
-		private static Class<?> loadClass(String name, Class<?> caller) throws ClassNotFoundException {
-			try {
-				//try context classloader, if fails try caller classloader
-				ClassLoader loader = GetClassLoader.fromContext();
-				if ( loader != null ) {
-					return loader.loadClass( name );
-				}
-			}
-			catch ( ClassNotFoundException e ) {
-				//trying caller classloader
-				if ( caller == null ) {
-					throw e;
-				}
-			}
-			return Class.forName( name, true, GetClassLoader.fromClass( caller ) );
-		}
-	}
-
-	private static class GetClassLoader implements PrivilegedAction<ClassLoader> {
-		private final Class<?> clazz;
-
-		public static ClassLoader fromContext() {
-			final GetClassLoader action = new GetClassLoader( null );
-			if ( System.getSecurityManager() != null ) {
-				return AccessController.doPrivileged( action );
-			}
-			else {
-				return action.run();
-			}
-		}
-
-		public static ClassLoader fromClass(Class<?> clazz) {
-			if ( clazz == null ) {
-				throw new IllegalArgumentException( "Class is null" );
-			}
-			final GetClassLoader action = new GetClassLoader( clazz );
-			if ( System.getSecurityManager() != null ) {
-				return AccessController.doPrivileged( action );
-			}
-			else {
-				return action.run();
-			}
-		}
-
-		private GetClassLoader(Class<?> clazz) {
-			this.clazz = clazz;
-		}
-
-		public ClassLoader run() {
-			if ( clazz != null ) {
-				return clazz.getClassLoader();
-			}
-			else {
-				return Thread.currentThread().getContextClassLoader();
-			}
-		}
-	}
-}
-
diff --git a/trunk/jsr311-api-0.8/pom.xml b/trunk/jsr311-api-0.8/pom.xml
deleted file mode 100644
index 877bffd..0000000
--- a/trunk/jsr311-api-0.8/pom.xml
+++ /dev/null
@@ -1,168 +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.specs</groupId>
-        <artifactId>specs</artifactId>
-        <version>2.1.0</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.specs</groupId>
-    <artifactId>org.apache.servicemix.specs.jsr311-api-0.8</artifactId>
-    <packaging>bundle</packaging>
-    <version>2.1.0</version>
-    <name>Apache ServiceMix :: Specs :: JSR-311 API 0.8</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>javax.ws.rs</groupId>             
-            <artifactId>jsr311-api</artifactId>
-            <version>0.8</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Description>${project.description}</Bundle-Description>
-                        <Export-Package>javax.ws.rs*;version=0.8;-split-package:=merge-first</Export-Package>
-                        <Import-Package>*</Import-Package>
-                        <Private-Package>org.apache.servicemix.specs.locator;-split-package:=merge-first;-noimport:=true</Private-Package>
-                        <Bundle-Activator>org.apache.servicemix.specs.locator.Activator</Bundle-Activator>
-                        <Implementation-Title>Apache ServiceMix</Implementation-Title>
-                        <Implementation-Version>${project.version}</Implementation-Version>
-                    </instructions>
-                    <unpackBundle>true</unpackBundle>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <artifactSet>
-                                <includes>
-                                    <include>javax.ws.rs:jsr311-api</include>
-                                    <include>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</include>
-                                </includes>
-                            </artifactSet>
-                            <filters>
-                                <filter>
-                                    <artifact>javax.ws.rs:jsr311-api</artifact>
-                                    <excludes>
-                                        <exclude>javax/**</exclude>
-                                    </excludes>
-                                </filter>
-                                <filter>
-                                    <artifact>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</artifact>
-                                    <excludes>
-                                        <exclude>org/**</exclude>
-                                    </excludes>
-                                </filter>
-                            </filters>
-                            <createSourcesJar>${createSourcesJar}</createSourcesJar>
-                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-                            <createDependencyReducedPom>true</createDependencyReducedPom>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>deploy</id>
-            <properties>
-                <createSourcesJar>true</createSourcesJar>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-dependency-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>unpack-sources</id>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>unpack</goal>
-                                </goals>
-                                <configuration>
-                                    <artifactItems>
-                                        <artifactItem>
-                                            <groupId>javax.ws.rs</groupId>
-                                            <artifactId>jsr311-api</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                        <artifactItem>
-                                            <groupId>org.apache.servicemix.specs</groupId>
-                                            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                    </artifactItems>
-                                    <outputDirectory>${project.build.directory}/sources</outputDirectory>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>package</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <minmemory>128m</minmemory>
-                            <maxmemory>512m</maxmemory>
-                            <sourcepath>${project.build.directory}/sources</sourcepath>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
diff --git a/trunk/jsr311-api-0.8/src/main/java/javax/ws/rs/ext/FactoryFinder.java b/trunk/jsr311-api-0.8/src/main/java/javax/ws/rs/ext/FactoryFinder.java
deleted file mode 100644
index 46a72a9..0000000
--- a/trunk/jsr311-api-0.8/src/main/java/javax/ws/rs/ext/FactoryFinder.java
+++ /dev/null
@@ -1,152 +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 javax.ws.rs.ext;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.Properties;
-
-class FactoryFinder {
-
-    /**
-     * Creates an instance of the specified class using the specified 
-     * <code>ClassLoader</code> object.
-     *
-     * @exception ClassNotFoundException if the given class could not be found
-     *            or could not be instantiated
-     */
-    private static Object newInstance(String className,
-            ClassLoader classLoader) throws ClassNotFoundException {
-        try {
-            Class spiClass;
-            if (classLoader == null) {
-                spiClass = Class.forName(className);
-            } else {
-                spiClass = classLoader.loadClass(className);
-            }
-            return spiClass.newInstance();
-        } catch (ClassNotFoundException x) {
-            throw x;
-        } catch (Exception x) {
-            throw new ClassNotFoundException(
-                    "Provider " + className + " could not be instantiated: " + x,
-                    x);
-        }
-    }
-
-    /**
-     * Finds the implementation <code>Class</code> object for the given
-     * factory name, or if that fails, finds the <code>Class</code> object
-     * for the given fallback class name. The arguments supplied MUST be
-     * used in order. If using the first argument is successful, the second
-     * one will not be used.
-     * <P>
-     * This method is package private so that this code can be shared.
-     *
-     * @return the <code>Class</code> object of the specified message factory;
-     *         may not be <code>null</code>
-     *
-     * @param factoryId             the name of the factory to find, which is
-     *                              a system property
-     * @param fallbackClassName     the implementation class name, which is
-     *                              to be used only if nothing else
-     *                              is found; <code>null</code> to indicate that
-     *                              there is no fallback class name
-     * @exception ClassNotFoundException if there is an error
-     */
-    static Object find(String factoryId, String fallbackClassName) throws ClassNotFoundException {
-        try {
-            // If we are deployed into an OSGi environment, leverage it
-            Class factoryClass = FactoryFinder.class.getClassLoader().loadClass(factoryId);
-            Class spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(factoryClass, factoryId);
-            if (spiClass != null) {
-                return spiClass.newInstance();
-            }
-        } catch (Throwable e) {
-        }
-
-        ClassLoader classLoader;
-        try {
-            classLoader = Thread.currentThread().getContextClassLoader();
-        } catch (Exception x) {
-            throw new ClassNotFoundException(x.toString(), x);
-        }
-
-        String serviceId = "META-INF/services/" + factoryId;
-        // try to find services in CLASSPATH
-        try {
-            InputStream is = null;
-            if (classLoader == null) {
-                is = ClassLoader.getSystemResourceAsStream(serviceId);
-            } else {
-                is = classLoader.getResourceAsStream(serviceId);
-            }
-
-            if (is != null) {
-                BufferedReader rd =
-                        new BufferedReader(new InputStreamReader(is, "UTF-8"));
-
-                String factoryClassName = rd.readLine();
-                rd.close();
-
-                if (factoryClassName != null &&
-                        !"".equals(factoryClassName)) {
-                    return newInstance(factoryClassName, classLoader);
-                }
-            }
-        } catch (Exception ex) {
-        }
-
-
-        // try to read from $java.home/lib/jaxrs.properties
-        try {
-            String javah = System.getProperty("java.home");
-            String configFile = javah + File.separator +
-                    "lib" + File.separator + "jaxrs.properties";
-            File f = new File(configFile);
-            if (f.exists()) {
-                Properties props = new Properties();
-                props.load(new FileInputStream(f));
-                String factoryClassName = props.getProperty(factoryId);
-                return newInstance(factoryClassName, classLoader);
-            }
-        } catch (Exception ex) {
-        }
-
-
-        // Use the system property
-        try {
-            String systemProp =
-                    System.getProperty(factoryId);
-            if (systemProp != null) {
-                return newInstance(systemProp, classLoader);
-            }
-        } catch (SecurityException se) {
-        }
-
-        if (fallbackClassName == null) {
-            throw new ClassNotFoundException(
-                    "Provider for " + factoryId + " cannot be found", null);
-        }
-
-        return newInstance(fallbackClassName, classLoader);
-    }
-}
diff --git a/trunk/jsr311-api-1.0/pom.xml b/trunk/jsr311-api-1.0/pom.xml
deleted file mode 100644
index fb5dfeb..0000000
--- a/trunk/jsr311-api-1.0/pom.xml
+++ /dev/null
@@ -1,168 +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.specs</groupId>
-        <artifactId>specs</artifactId>
-        <version>2.1.0</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.specs</groupId>
-    <artifactId>org.apache.servicemix.specs.jsr311-api-1.0</artifactId>
-    <packaging>bundle</packaging>
-    <version>2.1.0</version>
-    <name>Apache ServiceMix :: Specs :: JSR-311 API 1.0</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>javax.ws.rs</groupId>             
-            <artifactId>jsr311-api</artifactId>
-            <version>1.0</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Description>${project.description}</Bundle-Description>
-                        <Export-Package>javax.ws.rs*;version=1.0;-split-package:=merge-first;-noimport:=true</Export-Package>
-                        <Import-Package>*</Import-Package>
-                        <Private-Package>org.apache.servicemix.specs.locator;-split-package:=merge-first</Private-Package>
-                        <Bundle-Activator>org.apache.servicemix.specs.locator.Activator</Bundle-Activator>
-                        <Implementation-Title>Apache ServiceMix</Implementation-Title>
-                        <Implementation-Version>${project.version}</Implementation-Version>
-                    </instructions>
-                    <unpackBundle>true</unpackBundle>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <artifactSet>
-                                <includes>
-                                    <include>javax.ws.rs:jsr311-api</include>
-                                    <include>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</include>
-                                </includes>
-                            </artifactSet>
-                            <filters>
-                                <filter>
-                                    <artifact>javax.ws.rs:jsr311-api</artifact>
-                                    <excludes>
-                                        <exclude>javax/**</exclude>
-                                    </excludes>
-                                </filter>
-                                <filter>
-                                    <artifact>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</artifact>
-                                    <excludes>
-                                        <exclude>org/**</exclude>
-                                    </excludes>
-                                </filter>
-                            </filters>
-                            <createSourcesJar>${createSourcesJar}</createSourcesJar>
-                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-                            <createDependencyReducedPom>true</createDependencyReducedPom>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>deploy</id>
-            <properties>
-                <createSourcesJar>true</createSourcesJar>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-dependency-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>unpack-sources</id>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>unpack</goal>
-                                </goals>
-                                <configuration>
-                                    <artifactItems>
-                                        <artifactItem>
-                                            <groupId>javax.ws.rs</groupId>
-                                            <artifactId>jsr311-api</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                        <artifactItem>
-                                            <groupId>org.apache.servicemix.specs</groupId>
-                                            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                    </artifactItems>
-                                    <outputDirectory>${project.build.directory}/sources</outputDirectory>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>package</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <minmemory>128m</minmemory>
-                            <maxmemory>512m</maxmemory>
-                            <sourcepath>${project.build.directory}/sources</sourcepath>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
diff --git a/trunk/jsr311-api-1.0/src/main/java/javax/ws/rs/ext/FactoryFinder.java b/trunk/jsr311-api-1.0/src/main/java/javax/ws/rs/ext/FactoryFinder.java
deleted file mode 100644
index ec878db..0000000
--- a/trunk/jsr311-api-1.0/src/main/java/javax/ws/rs/ext/FactoryFinder.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * The contents of this file are subject to the terms
- * of the Common Development and Distribution License
- * (the "License").  You may not use this file except
- * in compliance with the License.
- *
- * You can obtain a copy of the license at
- * http://www.opensource.org/licenses/cddl1.php
- * See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-/*
- * FactoryFinder.java
- *
- * Created on November 16, 2007, 3:14 PM
- *
- */
-package javax.ws.rs.ext;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.Properties;
-
-class FactoryFinder {
-
-    /**
-     * Creates an instance of the specified class using the specified 
-     * <code>ClassLoader</code> object.
-     *
-     * @exception ClassNotFoundException if the given class could not be found
-     *            or could not be instantiated
-     */
-    private static Object newInstance(String className,
-            ClassLoader classLoader) throws ClassNotFoundException {
-        try {
-            Class spiClass;
-            if (classLoader == null) {
-                spiClass = Class.forName(className);
-            } else {
-                spiClass = classLoader.loadClass(className);
-            }
-            return spiClass.newInstance();
-        } catch (ClassNotFoundException x) {
-            throw x;
-        } catch (Exception x) {
-            throw new ClassNotFoundException(
-                    "Provider " + className + " could not be instantiated: " + x,
-                    x);
-        }
-    }
-
-    /**
-     * Finds the implementation <code>Class</code> object for the given
-     * factory name, or if that fails, finds the <code>Class</code> object
-     * for the given fallback class name. The arguments supplied MUST be
-     * used in order. If using the first argument is successful, the second
-     * one will not be used.
-     * <P>
-     * This method is package private so that this code can be shared.
-     *
-     * @return the <code>Class</code> object of the specified message factory;
-     *         may not be <code>null</code>
-     *
-     * @param factoryId             the name of the factory to find, which is
-     *                              a system property
-     * @param fallbackClassName     the implementation class name, which is
-     *                              to be used only if nothing else
-     *                              is found; <code>null</code> to indicate that
-     *                              there is no fallback class name
-     * @exception WebServiceException if there is an error
-     */
-    static Object find(String factoryId, String fallbackClassName) throws ClassNotFoundException {
-        try {
-            // If we are deployed into an OSGi environment, leverage it
-            Class factoryClass = FactoryFinder.class.getClassLoader().loadClass(factoryId);
-            Class spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(factoryClass, factoryId);
-            if (spiClass != null) {
-                return spiClass.newInstance();
-            }
-        } catch (Throwable e) {
-        }
-
-        ClassLoader classLoader;
-        try {
-            classLoader = Thread.currentThread().getContextClassLoader();
-        } catch (Exception x) {
-            throw new ClassNotFoundException(x.toString(), x);
-        }
-
-        String serviceId = "META-INF/services/" + factoryId;
-        // try to find services in CLASSPATH
-        try {
-            InputStream is;
-            if (classLoader == null) {
-                is = ClassLoader.getSystemResourceAsStream(serviceId);
-            } else {
-                is = classLoader.getResourceAsStream(serviceId);
-            }
-
-            if (is != null) {
-                BufferedReader rd =
-                        new BufferedReader(new InputStreamReader(is, "UTF-8"));
-
-                String factoryClassName = rd.readLine();
-                rd.close();
-
-                if (factoryClassName != null &&
-                        !"".equals(factoryClassName)) {
-                    return newInstance(factoryClassName, classLoader);
-                }
-            }
-        } catch (Exception ex) {
-        }
-
-
-        // try to read from $java.home/lib/jaxrs.properties
-        try {
-            String javah = System.getProperty("java.home");
-            String configFile = javah + File.separator +
-                    "lib" + File.separator + "jaxrs.properties";
-            File f = new File(configFile);
-            if (f.exists()) {
-                Properties props = new Properties();
-                props.load(new FileInputStream(f));
-                String factoryClassName = props.getProperty(factoryId);
-                return newInstance(factoryClassName, classLoader);
-            }
-        } catch (Exception ex) {
-        }
-
-
-        // Use the system property
-        try {
-            String systemProp =
-                    System.getProperty(factoryId);
-            if (systemProp != null) {
-                return newInstance(systemProp, classLoader);
-            }
-        } catch (SecurityException se) {
-        }
-
-        if (fallbackClassName == null) {
-            throw new ClassNotFoundException(
-                    "Provider for " + factoryId + " cannot be found", null);
-        }
-
-        return newInstance(fallbackClassName, classLoader);
-    }
-}
diff --git a/trunk/jsr311-api-1.1.1/pom.xml b/trunk/jsr311-api-1.1.1/pom.xml
deleted file mode 100644
index fd31b45..0000000
--- a/trunk/jsr311-api-1.1.1/pom.xml
+++ /dev/null
@@ -1,184 +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/xsd/maven-4.0.0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.servicemix.specs</groupId>
-        <artifactId>specs</artifactId>
-        <version>2.1.0</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.specs</groupId>
-    <artifactId>org.apache.servicemix.specs.jsr311-api-1.1.1</artifactId>
-    <packaging>bundle</packaging>
-    <version>2.1.0</version>
-    <name>Apache ServiceMix :: Specs :: JSR-311 API 1.1.1</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>javax.ws.rs</groupId>
-            <artifactId>jsr311-api</artifactId>
-            <version>1.1.1</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-
-    <repositories>
-        <!-- temporarily add java.net repo until JAX-RS 1.1.1 API is on the central repo -->
-        <repository>
-            <id>java.net.2</id>
-            <name>Java Net 2 Repository</name>
-            <url>http://download.java.net/maven/2</url>
-            <releases>
-                <enabled>true</enabled>
-            </releases>
-            <snapshots>
-                <enabled>false</enabled>
-            </snapshots>
-        </repository>
-    </repositories>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Description>${project.description}</Bundle-Description>
-                        <Export-Package>javax.ws.rs*;version=1.1.1;-split-package:=merge-first;-noimport:=true</Export-Package>
-                        <Import-Package>*</Import-Package>
-                        <Private-Package>org.apache.servicemix.specs.locator;-split-package:=merge-first</Private-Package>
-                        <Bundle-Activator>org.apache.servicemix.specs.locator.Activator</Bundle-Activator>
-                        <Implementation-Title>Apache ServiceMix</Implementation-Title>
-                        <Implementation-Version>${project.version}</Implementation-Version>
-                        <DynamicImport-Package>*</DynamicImport-Package>
-                    </instructions>
-                    <unpackBundle>true</unpackBundle>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <artifactSet>
-                                <includes>
-                                    <include>javax.ws.rs:jsr311-api</include>
-                                    <include>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</include>
-                                </includes>
-                            </artifactSet>
-                            <filters>
-                                <filter>
-                                    <artifact>javax.ws.rs:jsr311-api</artifact>
-                                    <excludes>
-                                        <exclude>javax/**</exclude>
-                                    </excludes>
-                                </filter>
-                                <filter>
-                                    <artifact>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</artifact>
-                                    <excludes>
-                                        <exclude>org/**</exclude>
-                                    </excludes>
-                                </filter>
-                            </filters>
-                            <createSourcesJar>${createSourcesJar}</createSourcesJar>
-                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-                            <createDependencyReducedPom>true</createDependencyReducedPom>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>deploy</id>
-            <properties>
-                <createSourcesJar>true</createSourcesJar>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-dependency-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>unpack-sources</id>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>unpack</goal>
-                                </goals>
-                                <configuration>
-                                    <artifactItems>
-                                        <artifactItem>
-                                            <groupId>javax.ws.rs</groupId>
-                                            <artifactId>jsr311-api</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                        <artifactItem>
-                                            <groupId>org.apache.servicemix.specs</groupId>
-                                            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                    </artifactItems>
-                                    <outputDirectory>${project.build.directory}/sources</outputDirectory>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>package</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <minmemory>128m</minmemory>
-                            <maxmemory>512m</maxmemory>
-                            <sourcepath>${project.build.directory}/sources</sourcepath>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
diff --git a/trunk/jsr311-api-1.1.1/src/main/java/javax/ws/rs/ext/FactoryFinder.java b/trunk/jsr311-api-1.1.1/src/main/java/javax/ws/rs/ext/FactoryFinder.java
deleted file mode 100644
index c82a1aa..0000000
--- a/trunk/jsr311-api-1.1.1/src/main/java/javax/ws/rs/ext/FactoryFinder.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * The contents of this file are subject to the terms
- * of the Common Development and Distribution License
- * (the "License").  You may not use this file except
- * in compliance with the License.
- *
- * You can obtain a copy of the license at
- * http://www.opensource.org/licenses/cddl1.php
- * See the License for the specific language governing
- * permissions and limitations under the License.
- */
-package javax.ws.rs.ext;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.Properties;
-
-public class FactoryFinder {
-
-    /**
-     * Creates an instance of the specified class using the specified
-     * <code>ClassLoader</code> object.
-     *
-     * @throws ClassNotFoundException if the given class could not be found
-     *                                or could not be instantiated
-     */
-    private static Object newInstance(String className,
-                                      ClassLoader classLoader) throws ClassNotFoundException {
-        try {
-            Class spiClass;
-            if (classLoader == null) {
-                spiClass = Class.forName(className);
-            } else {
-                spiClass = classLoader.loadClass(className);
-            }
-            return spiClass.newInstance();
-        } catch (ClassNotFoundException x) {
-            throw x;
-        } catch (Exception x) {
-            throw new ClassNotFoundException(
-                    "Provider " + className + " could not be instantiated: " + x,
-                    x);
-        }
-    }
-
-    /**
-     * Finds the implementation <code>Class</code> object for the given
-     * factory name, or if that fails, finds the <code>Class</code> object
-     * for the given fallback class name. The arguments supplied MUST be
-     * used in order. If using the first argument is successful, the second
-     * one will not be used.
-     * <p/>
-     * This method is package private so that this code can be shared.
-     *
-     * @param factoryId         the name of the factory to find, which is
-     *                          a system property
-     * @param fallbackClassName the implementation class name, which is
-     *                          to be used only if nothing else
-     *                          is found; <code>null</code> to indicate that
-     *                          there is no fallback class name
-     * @return the <code>Class</code> object of the specified message factory;
-     *         may not be <code>null</code>
-     * @throws WebServiceException if there is an error
-     */
-    static Object find(String factoryId, String fallbackClassName) throws ClassNotFoundException {
-        try {
-            // If we are deployed into an OSGi environment, leverage it
-            Class factoryClass = FactoryFinder.class.getClassLoader().loadClass(factoryId);
-            Class spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(factoryClass, factoryId);
-            if (spiClass != null) {
-                return spiClass.newInstance();
-            }
-        } catch (Throwable e) {
-        }
-
-        ClassLoader classLoader;
-        try {
-            classLoader = Thread.currentThread().getContextClassLoader();
-        } catch (Exception x) {
-            throw new ClassNotFoundException(x.toString(), x);
-        }
-
-        String serviceId = "META-INF/services/" + factoryId;
-        // try to find services in CLASSPATH
-        try {
-            InputStream is;
-            if (classLoader == null) {
-                is = ClassLoader.getSystemResourceAsStream(serviceId);
-            } else {
-                is = classLoader.getResourceAsStream(serviceId);
-            }
-
-            if (is != null) {
-                BufferedReader rd =
-                        new BufferedReader(new InputStreamReader(is, "UTF-8"));
-
-                String factoryClassName = rd.readLine();
-                rd.close();
-
-                if (factoryClassName != null &&
-                        !"".equals(factoryClassName)) {
-                    return newInstance(factoryClassName, classLoader);
-                }
-            }
-        } catch (Exception ex) {
-        }
-
-
-        // try to read from $java.home/lib/jaxrs.properties
-        try {
-            String javah = System.getProperty("java.home");
-            String configFile = javah + File.separator +
-                    "lib" + File.separator + "jaxrs.properties";
-            File f = new File(configFile);
-            if (f.exists()) {
-                Properties props = new Properties();
-                props.load(new FileInputStream(f));
-                String factoryClassName = props.getProperty(factoryId);
-                return newInstance(factoryClassName, classLoader);
-            }
-        } catch (Exception ex) {
-        }
-
-
-        // Use the system property
-        try {
-            String systemProp =
-                    System.getProperty(factoryId);
-            if (systemProp != null) {
-                return newInstance(systemProp, classLoader);
-            }
-        } catch (SecurityException se) {
-        }
-
-        if (fallbackClassName == null) {
-            throw new ClassNotFoundException(
-                    "Provider for " + factoryId + " cannot be found", null);
-        }
-
-        return newInstance(fallbackClassName, classLoader);
-    }
-
-}
diff --git a/trunk/jsr311-api-1.1/pom.xml b/trunk/jsr311-api-1.1/pom.xml
deleted file mode 100644
index 3454e5c..0000000
--- a/trunk/jsr311-api-1.1/pom.xml
+++ /dev/null
@@ -1,184 +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.specs</groupId>
-        <artifactId>specs</artifactId>
-        <version>2.1.0</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.specs</groupId>
-    <artifactId>org.apache.servicemix.specs.jsr311-api-1.1</artifactId>
-    <packaging>bundle</packaging>
-    <version>2.1.0</version>
-    <name>Apache ServiceMix :: Specs :: JSR-311 API 1.1</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>javax.ws.rs</groupId>             
-            <artifactId>jsr311-api</artifactId>
-            <version>1.1</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-
-    <repositories>
-       <!-- temporarily add java.net repo until JAX-RS 1.1 API is in central repo -->
-       <repository>
-            <id>java.net.2</id>
-            <name>Java Net 2 Repository</name>
-            <url>http://download.java.net/maven/2</url>
-            <releases>
-                <enabled>true</enabled>
-            </releases>
-            <snapshots>     
-                <enabled>false</enabled>
-            </snapshots>     
-        </repository>
-    </repositories>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Description>${project.description}</Bundle-Description>
-                        <Export-Package>javax.ws.rs*;version=1.1;-split-package:=merge-first</Export-Package>
-                        <Import-Package>*</Import-Package>
-                        <Private-Package>org.apache.servicemix.specs.locator;-split-package:=merge-first;-noimport:=true</Private-Package>
-                        <Bundle-Activator>org.apache.servicemix.specs.locator.Activator</Bundle-Activator>
-                        <Implementation-Title>Apache ServiceMix</Implementation-Title>
-                        <Implementation-Version>${project.version}</Implementation-Version>
-                        <DynamicImport-Package>*</DynamicImport-Package>
-                    </instructions>
-                    <unpackBundle>true</unpackBundle>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <artifactSet>
-                                <includes>
-                                    <include>javax.ws.rs:jsr311-api</include>
-                                    <include>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</include>
-                                </includes>
-                            </artifactSet>
-                            <filters>
-                                <filter>
-                                    <artifact>javax.ws.rs:jsr311-api</artifact>
-                                    <excludes>
-                                        <exclude>javax/**</exclude>
-                                    </excludes>
-                                </filter>
-                                <filter>
-                                    <artifact>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</artifact>
-                                    <excludes>
-                                        <exclude>org/**</exclude>
-                                    </excludes>
-                                </filter>
-                            </filters>
-                            <createSourcesJar>${createSourcesJar}</createSourcesJar>
-                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-                            <createDependencyReducedPom>true</createDependencyReducedPom>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>deploy</id>
-            <properties>
-                <createSourcesJar>true</createSourcesJar>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-dependency-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>unpack-sources</id>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>unpack</goal>
-                                </goals>
-                                <configuration>
-                                    <artifactItems>
-                                        <artifactItem>
-                                            <groupId>javax.ws.rs</groupId>
-                                            <artifactId>jsr311-api</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                        <artifactItem>
-                                            <groupId>org.apache.servicemix.specs</groupId>
-                                            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                    </artifactItems>
-                                    <outputDirectory>${project.build.directory}/sources</outputDirectory>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>package</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <minmemory>128m</minmemory>
-                            <maxmemory>512m</maxmemory>
-                            <sourcepath>${project.build.directory}/sources</sourcepath>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
diff --git a/trunk/jsr311-api-1.1/src/main/java/javax/ws/rs/ext/FactoryFinder.java b/trunk/jsr311-api-1.1/src/main/java/javax/ws/rs/ext/FactoryFinder.java
deleted file mode 100644
index ec878db..0000000
--- a/trunk/jsr311-api-1.1/src/main/java/javax/ws/rs/ext/FactoryFinder.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * The contents of this file are subject to the terms
- * of the Common Development and Distribution License
- * (the "License").  You may not use this file except
- * in compliance with the License.
- *
- * You can obtain a copy of the license at
- * http://www.opensource.org/licenses/cddl1.php
- * See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-/*
- * FactoryFinder.java
- *
- * Created on November 16, 2007, 3:14 PM
- *
- */
-package javax.ws.rs.ext;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.Properties;
-
-class FactoryFinder {
-
-    /**
-     * Creates an instance of the specified class using the specified 
-     * <code>ClassLoader</code> object.
-     *
-     * @exception ClassNotFoundException if the given class could not be found
-     *            or could not be instantiated
-     */
-    private static Object newInstance(String className,
-            ClassLoader classLoader) throws ClassNotFoundException {
-        try {
-            Class spiClass;
-            if (classLoader == null) {
-                spiClass = Class.forName(className);
-            } else {
-                spiClass = classLoader.loadClass(className);
-            }
-            return spiClass.newInstance();
-        } catch (ClassNotFoundException x) {
-            throw x;
-        } catch (Exception x) {
-            throw new ClassNotFoundException(
-                    "Provider " + className + " could not be instantiated: " + x,
-                    x);
-        }
-    }
-
-    /**
-     * Finds the implementation <code>Class</code> object for the given
-     * factory name, or if that fails, finds the <code>Class</code> object
-     * for the given fallback class name. The arguments supplied MUST be
-     * used in order. If using the first argument is successful, the second
-     * one will not be used.
-     * <P>
-     * This method is package private so that this code can be shared.
-     *
-     * @return the <code>Class</code> object of the specified message factory;
-     *         may not be <code>null</code>
-     *
-     * @param factoryId             the name of the factory to find, which is
-     *                              a system property
-     * @param fallbackClassName     the implementation class name, which is
-     *                              to be used only if nothing else
-     *                              is found; <code>null</code> to indicate that
-     *                              there is no fallback class name
-     * @exception WebServiceException if there is an error
-     */
-    static Object find(String factoryId, String fallbackClassName) throws ClassNotFoundException {
-        try {
-            // If we are deployed into an OSGi environment, leverage it
-            Class factoryClass = FactoryFinder.class.getClassLoader().loadClass(factoryId);
-            Class spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(factoryClass, factoryId);
-            if (spiClass != null) {
-                return spiClass.newInstance();
-            }
-        } catch (Throwable e) {
-        }
-
-        ClassLoader classLoader;
-        try {
-            classLoader = Thread.currentThread().getContextClassLoader();
-        } catch (Exception x) {
-            throw new ClassNotFoundException(x.toString(), x);
-        }
-
-        String serviceId = "META-INF/services/" + factoryId;
-        // try to find services in CLASSPATH
-        try {
-            InputStream is;
-            if (classLoader == null) {
-                is = ClassLoader.getSystemResourceAsStream(serviceId);
-            } else {
-                is = classLoader.getResourceAsStream(serviceId);
-            }
-
-            if (is != null) {
-                BufferedReader rd =
-                        new BufferedReader(new InputStreamReader(is, "UTF-8"));
-
-                String factoryClassName = rd.readLine();
-                rd.close();
-
-                if (factoryClassName != null &&
-                        !"".equals(factoryClassName)) {
-                    return newInstance(factoryClassName, classLoader);
-                }
-            }
-        } catch (Exception ex) {
-        }
-
-
-        // try to read from $java.home/lib/jaxrs.properties
-        try {
-            String javah = System.getProperty("java.home");
-            String configFile = javah + File.separator +
-                    "lib" + File.separator + "jaxrs.properties";
-            File f = new File(configFile);
-            if (f.exists()) {
-                Properties props = new Properties();
-                props.load(new FileInputStream(f));
-                String factoryClassName = props.getProperty(factoryId);
-                return newInstance(factoryClassName, classLoader);
-            }
-        } catch (Exception ex) {
-        }
-
-
-        // Use the system property
-        try {
-            String systemProp =
-                    System.getProperty(factoryId);
-            if (systemProp != null) {
-                return newInstance(systemProp, classLoader);
-            }
-        } catch (SecurityException se) {
-        }
-
-        if (fallbackClassName == null) {
-            throw new ClassNotFoundException(
-                    "Provider for " + factoryId + " cannot be found", null);
-        }
-
-        return newInstance(fallbackClassName, classLoader);
-    }
-}
diff --git a/trunk/jsr339-api-m10/pom.xml b/trunk/jsr339-api-m10/pom.xml
deleted file mode 100644
index e2b1c8c..0000000
--- a/trunk/jsr339-api-m10/pom.xml
+++ /dev/null
@@ -1,168 +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/xsd/maven-4.0.0.xsd">
-
-    <!--
-
-        Licensed to the Apache Software Foundation (ASF) under one or more
-        contributor license agreements.  See the NOTICE file distributed with
-        this work for additional information regarding copyright ownership.
-        The ASF licenses this file to You under the Apache License, Version 2.0
-        (the "License"); you may not use this file except in compliance with
-        the License.  You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-        Unless required by applicable law or agreed to in writing, software
-        distributed under the License is distributed on an "AS IS" BASIS,
-        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-        See the License for the specific language governing permissions and
-        limitations under the License.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.servicemix.specs</groupId>
-        <artifactId>specs</artifactId>
-        <version>2.1.0</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.specs</groupId>
-    <artifactId>org.apache.servicemix.specs.jsr339-api-m10</artifactId>
-    <packaging>bundle</packaging>
-    <version>2.1.0</version>
-    <name>Apache ServiceMix :: Specs :: JSR-339 API M10</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>javax.ws.rs</groupId>
-            <artifactId>javax.ws.rs-api</artifactId>
-            <version>2.0-m10</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Description>${project.description}</Bundle-Description>
-                        <Export-Package>javax.ws.rs*;version=2.0.0.m10;-split-package:=merge-first</Export-Package>
-                        <Import-Package>*</Import-Package>
-                        <Private-Package>org.apache.servicemix.specs.locator;-split-package:=merge-first;-noimport:=true</Private-Package>
-                        <Bundle-Activator>org.apache.servicemix.specs.locator.Activator</Bundle-Activator>
-                        <Implementation-Title>Apache ServiceMix</Implementation-Title>
-                        <Implementation-Version>${project.version}</Implementation-Version>
-                    </instructions>
-                    <unpackBundle>true</unpackBundle>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <artifactSet>
-                                <includes>
-                                    <include>javax.ws.rs:javax.ws.rs-api</include>
-                                    <include>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</include>
-                                </includes>
-                            </artifactSet>
-                            <filters>
-                                <filter>
-                                    <artifact>javax.ws.rs:javax.ws.rs-api</artifact>
-                                    <excludes>
-                                        <exclude>javax/**</exclude>
-                                    </excludes>
-                                </filter>
-                                <filter>
-                                    <artifact>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</artifact>
-                                    <excludes>
-                                        <exclude>org/**</exclude>
-                                    </excludes>
-                                </filter>
-                            </filters>
-                            <createSourcesJar>${createSourcesJar}</createSourcesJar>
-                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-                            <createDependencyReducedPom>true</createDependencyReducedPom>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>deploy</id>
-            <properties>
-                <createSourcesJar>true</createSourcesJar>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-dependency-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>unpack-sources</id>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>unpack</goal>
-                                </goals>
-                                <configuration>
-                                    <artifactItems>
-                                        <artifactItem>
-                                            <groupId>javax.ws.rs</groupId>
-                                            <artifactId>javax.ws.rs-api</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                        <artifactItem>
-                                            <groupId>org.apache.servicemix.specs</groupId>
-                                            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                    </artifactItems>
-                                    <outputDirectory>${project.build.directory}/sources</outputDirectory>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>package</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <minmemory>128m</minmemory>
-                            <maxmemory>512m</maxmemory>
-                            <sourcepath>${project.build.directory}/sources</sourcepath>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
\ No newline at end of file
diff --git a/trunk/jsr339-api-m10/src/main/java/javax/ws/rs/ext/FactoryFinder.java b/trunk/jsr339-api-m10/src/main/java/javax/ws/rs/ext/FactoryFinder.java
deleted file mode 100644
index c82a1aa..0000000
--- a/trunk/jsr339-api-m10/src/main/java/javax/ws/rs/ext/FactoryFinder.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * The contents of this file are subject to the terms
- * of the Common Development and Distribution License
- * (the "License").  You may not use this file except
- * in compliance with the License.
- *
- * You can obtain a copy of the license at
- * http://www.opensource.org/licenses/cddl1.php
- * See the License for the specific language governing
- * permissions and limitations under the License.
- */
-package javax.ws.rs.ext;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.Properties;
-
-public class FactoryFinder {
-
-    /**
-     * Creates an instance of the specified class using the specified
-     * <code>ClassLoader</code> object.
-     *
-     * @throws ClassNotFoundException if the given class could not be found
-     *                                or could not be instantiated
-     */
-    private static Object newInstance(String className,
-                                      ClassLoader classLoader) throws ClassNotFoundException {
-        try {
-            Class spiClass;
-            if (classLoader == null) {
-                spiClass = Class.forName(className);
-            } else {
-                spiClass = classLoader.loadClass(className);
-            }
-            return spiClass.newInstance();
-        } catch (ClassNotFoundException x) {
-            throw x;
-        } catch (Exception x) {
-            throw new ClassNotFoundException(
-                    "Provider " + className + " could not be instantiated: " + x,
-                    x);
-        }
-    }
-
-    /**
-     * Finds the implementation <code>Class</code> object for the given
-     * factory name, or if that fails, finds the <code>Class</code> object
-     * for the given fallback class name. The arguments supplied MUST be
-     * used in order. If using the first argument is successful, the second
-     * one will not be used.
-     * <p/>
-     * This method is package private so that this code can be shared.
-     *
-     * @param factoryId         the name of the factory to find, which is
-     *                          a system property
-     * @param fallbackClassName the implementation class name, which is
-     *                          to be used only if nothing else
-     *                          is found; <code>null</code> to indicate that
-     *                          there is no fallback class name
-     * @return the <code>Class</code> object of the specified message factory;
-     *         may not be <code>null</code>
-     * @throws WebServiceException if there is an error
-     */
-    static Object find(String factoryId, String fallbackClassName) throws ClassNotFoundException {
-        try {
-            // If we are deployed into an OSGi environment, leverage it
-            Class factoryClass = FactoryFinder.class.getClassLoader().loadClass(factoryId);
-            Class spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(factoryClass, factoryId);
-            if (spiClass != null) {
-                return spiClass.newInstance();
-            }
-        } catch (Throwable e) {
-        }
-
-        ClassLoader classLoader;
-        try {
-            classLoader = Thread.currentThread().getContextClassLoader();
-        } catch (Exception x) {
-            throw new ClassNotFoundException(x.toString(), x);
-        }
-
-        String serviceId = "META-INF/services/" + factoryId;
-        // try to find services in CLASSPATH
-        try {
-            InputStream is;
-            if (classLoader == null) {
-                is = ClassLoader.getSystemResourceAsStream(serviceId);
-            } else {
-                is = classLoader.getResourceAsStream(serviceId);
-            }
-
-            if (is != null) {
-                BufferedReader rd =
-                        new BufferedReader(new InputStreamReader(is, "UTF-8"));
-
-                String factoryClassName = rd.readLine();
-                rd.close();
-
-                if (factoryClassName != null &&
-                        !"".equals(factoryClassName)) {
-                    return newInstance(factoryClassName, classLoader);
-                }
-            }
-        } catch (Exception ex) {
-        }
-
-
-        // try to read from $java.home/lib/jaxrs.properties
-        try {
-            String javah = System.getProperty("java.home");
-            String configFile = javah + File.separator +
-                    "lib" + File.separator + "jaxrs.properties";
-            File f = new File(configFile);
-            if (f.exists()) {
-                Properties props = new Properties();
-                props.load(new FileInputStream(f));
-                String factoryClassName = props.getProperty(factoryId);
-                return newInstance(factoryClassName, classLoader);
-            }
-        } catch (Exception ex) {
-        }
-
-
-        // Use the system property
-        try {
-            String systemProp =
-                    System.getProperty(factoryId);
-            if (systemProp != null) {
-                return newInstance(systemProp, classLoader);
-            }
-        } catch (SecurityException se) {
-        }
-
-        if (fallbackClassName == null) {
-            throw new ClassNotFoundException(
-                    "Provider for " + factoryId + " cannot be found", null);
-        }
-
-        return newInstance(fallbackClassName, classLoader);
-    }
-
-}
diff --git a/trunk/locator/pom.xml b/trunk/locator/pom.xml
deleted file mode 100644
index 9b14187..0000000
--- a/trunk/locator/pom.xml
+++ /dev/null
@@ -1,88 +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.specs</groupId>
-        <artifactId>specs</artifactId>
-        <version>2.1.0</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.specs</groupId>
-    <artifactId>org.apache.servicemix.specs.locator</artifactId>
-    <packaging>jar</packaging>
-    <version>2.1.0</version>
-    <name>Apache ServiceMix :: Specs :: Locator</name>
-
-    <dependencies>
-         <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <version>4.8</version>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-    <profiles>
-        <profile>
-            <id>deploy</id>
-            <properties>
-                <createSourcesJar>true</createSourcesJar>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-source-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>attach-sources</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>package</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <minmemory>128m</minmemory>
-                            <maxmemory>512m</maxmemory>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
diff --git a/trunk/locator/src/main/java/org/apache/servicemix/specs/locator/Activator.java b/trunk/locator/src/main/java/org/apache/servicemix/specs/locator/Activator.java
deleted file mode 100644
index 9e61f8b..0000000
--- a/trunk/locator/src/main/java/org/apache/servicemix/specs/locator/Activator.java
+++ /dev/null
@@ -1,188 +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.specs.locator;
-
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleEvent;
-import org.osgi.framework.SynchronousBundleListener;
-
-public class Activator implements BundleActivator, SynchronousBundleListener {
-
-    private static boolean debug = false;
-
-    private ConcurrentMap<Long, Map<String, Callable<Class>>> factories = new ConcurrentHashMap<Long, Map<String, Callable<Class>>>();
-
-    private BundleContext bundleContext;
-
-    static {
-        try {
-            String prop = System.getProperty("org.apache.servicemix.specs.debug");
-            debug = prop != null && !"false".equals(prop);
-        } catch (Throwable t) { }
-    }
-
-    /**
-     * <p>Output debugging messages.</p>
-     *
-     * @param msg <code>String</code> to print to <code>stderr</code>.
-     */
-    protected void debugPrintln(String msg) {
-        if (debug) {
-            System.err.println("Spec(" + bundleContext.getBundle().getBundleId() + "): " + msg);
-        }
-    }
-
-    public synchronized void start(BundleContext bundleContext) throws Exception {
-        this.bundleContext = bundleContext;
-        debugPrintln("activating");
-        debugPrintln("adding bundle listener");
-        bundleContext.addBundleListener(this);
-        debugPrintln("checking existing bundles");
-        for (Bundle bundle : bundleContext.getBundles()) {
-            if (bundle.getState() == Bundle.RESOLVED || bundle.getState() == Bundle.STARTING ||
-                    bundle.getState() == Bundle.ACTIVE || bundle.getState() == Bundle.STOPPING) {
-                register(bundle);
-            }
-        }
-        debugPrintln("activated");
-    }
-
-    public synchronized void stop(BundleContext bundleContext) throws Exception {
-        debugPrintln("deactivating");
-        bundleContext.removeBundleListener(this);
-        while (!factories.isEmpty()) {
-            unregister(factories.keySet().iterator().next());
-        }
-        debugPrintln("deactivated");
-        this.bundleContext = null;
-    }
-
-    public void bundleChanged(BundleEvent event) {
-        if (event.getType() == BundleEvent.RESOLVED) {
-            register(event.getBundle());
-        } else if (event.getType() == BundleEvent.UNRESOLVED || event.getType() == BundleEvent.UNINSTALLED) {
-            unregister(event.getBundle().getBundleId());
-        }
-    }
-
-    protected void register(final Bundle bundle) {
-        debugPrintln("checking bundle " + bundle.getBundleId());
-        Map<String, Callable<Class>> map = factories.get(bundle.getBundleId());
-        Enumeration e = bundle.findEntries("META-INF/services/", "*", false);
-        if (e != null) {
-            while (e.hasMoreElements()) {
-                final URL u = (URL) e.nextElement();
-                final String url = u.toString();
-                if (url.endsWith("/")) {
-                    continue;
-                }
-                final String factoryId = url.substring(url.lastIndexOf("/") + 1);
-                if (map == null) {
-                    map = new HashMap<String, Callable<Class>>();
-                    factories.put(bundle.getBundleId(), map);
-                }
-                map.put(factoryId, new BundleFactoryLoader(factoryId, u, bundle));
-            }
-        }
-        if (map != null) {
-            for (Map.Entry<String, Callable<Class>> entry : map.entrySet()) {
-                debugPrintln("registering service for key " + entry.getKey() + " with value " + entry.getValue());
-                OsgiLocator.register(entry.getKey(), entry.getValue());
-            }
-        }
-    }
-
-    protected void unregister(long bundleId) {
-        Map<String, Callable<Class>> map = factories.remove(bundleId);
-        if (map != null) {
-            for (Map.Entry<String, Callable<Class>> entry : map.entrySet()) {
-                debugPrintln("unregistering service for key " + entry.getKey() + " with value " + entry.getValue());
-                OsgiLocator.unregister(entry.getKey(), entry.getValue());
-            }
-        }
-    }
-
-    private class BundleFactoryLoader implements Callable<Class> {
-        private final String factoryId;
-        private final URL u;
-        private final Bundle bundle;
-        private volatile Class<?> clazz;
-
-        public BundleFactoryLoader(String factoryId, URL u, Bundle bundle) {
-            this.factoryId = factoryId;
-            this.u = u;
-            this.bundle = bundle;
-        }
-
-        public Class call() throws Exception {
-            try {
-                debugPrintln("loading factory for key: " + factoryId);
-                
-                if (clazz == null){
-                    synchronized (this) {
-                        if (clazz == null){
-                            debugPrintln("creating factory for key: " + factoryId);
-                            BufferedReader br = new BufferedReader(new InputStreamReader(u.openStream(), "UTF-8"));
-                            String factoryClassName = br.readLine();
-                            br.close();
-                            debugPrintln("factory implementation: " + factoryClassName);
-                            clazz = bundle.loadClass(factoryClassName);
-                        }
-                    }
-                }
-                return clazz;
-            } catch (Exception e) {
-                debugPrintln("exception caught while creating factory: " + e);
-                throw e;
-            } catch (Error e) {
-                debugPrintln("error caught while creating factory: " + e);
-                throw e;
-            }
-        }
-
-        @Override
-        public String toString() {
-           return u.toString();
-        }
-
-        @Override
-        public int hashCode() {
-           return u.hashCode();
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (obj instanceof BundleFactoryLoader) {
-                return u.equals(((BundleFactoryLoader) obj).u);
-            } else {
-                return false;
-            }
-        }
-    }
-}
diff --git a/trunk/locator/src/main/java/org/apache/servicemix/specs/locator/OsgiLocator.java b/trunk/locator/src/main/java/org/apache/servicemix/specs/locator/OsgiLocator.java
deleted file mode 100644
index d38dfef..0000000
--- a/trunk/locator/src/main/java/org/apache/servicemix/specs/locator/OsgiLocator.java
+++ /dev/null
@@ -1,174 +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.specs.locator;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.Callable;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-
-public class OsgiLocator {
-
-    public static final long DEFAULT_TIMEOUT = 0l;
-    public static final String TIMEOUT = "org.apache.servicemix.specs.timeout";
-
-    private static Map<String, List<Callable<Class>>> factories;
-    
-    private static ReadWriteLock lock = new ReentrantReadWriteLock();
-
-    private OsgiLocator() {
-    }
-
-    public static void unregister(String id, Callable<Class> factory) {
-        lock.writeLock().lock();
-        try {
-            if (factories != null) {
-                List<Callable<Class>> l = factories.get(id);
-                if (l != null) {
-                    l.remove(factory);
-                }
-            }
-        } finally {
-            lock.writeLock().unlock();
-        }
-    }
-
-    public static void register(String id, Callable<Class> factory) {
-        lock.writeLock().lock();
-        try {
-            if (factories == null) {
-                factories = new HashMap<String, List<Callable<Class>>>();
-            }
-            List<Callable<Class>> l = factories.get(id);
-            if (l ==  null) {
-                l = new ArrayList<Callable<Class>>();
-                factories.put(id, l);
-            }
-            l.add(0, factory);
-            synchronized (lock) {
-                lock.notifyAll();
-            }
-        } finally {
-            lock.writeLock().unlock();
-        }
-    }
-
-
-    public static <T> Class<? extends T> locate(Class<T> factoryId) {
-        return locate(factoryId, factoryId.getName());
-    }
-
-    private static long getTimeout() {
-        long timeout = DEFAULT_TIMEOUT;
-        try {
-            String prop = System.getProperty(TIMEOUT);
-            if (prop != null) {
-                timeout = Long.parseLong(prop);
-            }
-        } catch (Throwable t) { }
-        return timeout;
-    }
-
-    public static <T> Class<? extends T> locate(Class<T> factoryClass, String factoryId) {
-        long timeout = getTimeout();
-        if (timeout <= 0) {
-            return doLocate(factoryClass, factoryId);
-        }
-        long t0 = System.currentTimeMillis();
-        long t1 = t0;
-        while (t1 - t0 < timeout) {
-            Class<? extends T> impl = doLocate(factoryClass, factoryId);
-            if (impl != null) {
-                return impl;
-            }
-            synchronized (lock) {
-                try {
-                    lock.wait(timeout - (t1 - t0));
-                } catch (InterruptedException e) {
-                    return null;
-                }
-            }
-            t1 = System.currentTimeMillis();
-        }
-        return null;
-    }
-
-    private static <T> Class<? extends T> doLocate(Class<T> factoryClass, String factoryId) {
-        lock.readLock().lock();
-        try {
-            if (factories != null) {
-                List<Callable<Class>> l = factories.get(factoryId);
-                if (l != null && !l.isEmpty()) {
-                    // look up the System property first
-                    String factoryClassName = System.getProperty(factoryId);
-                    try {
-                        for (Callable<Class> i : l) {
-                            Class c = null;
-                            try {
-                                c = i.call();
-                            } catch (Exception ex) {
-                                // do nothing here
-                            }
-                            if (c != null && factoryClass == c.getClassLoader().loadClass(factoryClass.getName())
-                                     && (factoryClassName == null || c.getName().equals(factoryClassName)))
-                            {
-                                return c;
-                            }
-                        }
-                    } catch (Exception ex) {
-                        // do nothing here
-                    }  
-                }
-            }
-            return null;
-        } finally {
-            lock.readLock().unlock();
-        }
-    }
-
-    public static <T> List<Class<? extends T>> locateAll(Class<T> factoryId) {
-        return locateAll(factoryId, factoryId.getName());
-    }
-
-    public static <T> List<Class<? extends T>> locateAll(Class<T> factoryClass, String factoryId) {
-        lock.readLock().lock();
-        try {
-            List<Class<? extends T>> classes = new ArrayList<Class<? extends T>>();
-            if (factories != null) {
-                List<Callable<Class>> l = factories.get(factoryId);
-                if (l != null) {
-                    for (Callable<Class> i : l) {
-                    	try {
-                            Class c = i.call();
-                            if (c != null && factoryClass.isAssignableFrom(c)) {
-                        	    classes.add(c);
-                            }
-                    	} catch (Exception e) {
-                    	}
-    				}
-                }
-            }
-            return classes;
-        } finally {
-            lock.readLock().unlock();
-        }
-    }
-
-}
diff --git a/trunk/locator/src/test/java/org/apache/servicemix/specs/locator/MockCallable.java b/trunk/locator/src/test/java/org/apache/servicemix/specs/locator/MockCallable.java
deleted file mode 100644
index 9b5d8c0..0000000
--- a/trunk/locator/src/test/java/org/apache/servicemix/specs/locator/MockCallable.java
+++ /dev/null
@@ -1,27 +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.specs.locator;
-
-import java.util.concurrent.Callable;
-
-public class MockCallable implements Callable<Class> {
-   
-    public Class call() throws Exception {
-        return this.getClass();
-    }
-
-}
diff --git a/trunk/locator/src/test/java/org/apache/servicemix/specs/locator/MockCallable2.java b/trunk/locator/src/test/java/org/apache/servicemix/specs/locator/MockCallable2.java
deleted file mode 100644
index 301ab14..0000000
--- a/trunk/locator/src/test/java/org/apache/servicemix/specs/locator/MockCallable2.java
+++ /dev/null
@@ -1,27 +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.specs.locator;
-
-import java.util.concurrent.Callable;
-
-public class MockCallable2 implements Callable<Class> {
-   
-    public Class call() throws Exception {
-        return this.getClass();
-    }
-
-}
diff --git a/trunk/locator/src/test/java/org/apache/servicemix/specs/locator/OsgiLocatorTest.java b/trunk/locator/src/test/java/org/apache/servicemix/specs/locator/OsgiLocatorTest.java
deleted file mode 100644
index a416834..0000000
--- a/trunk/locator/src/test/java/org/apache/servicemix/specs/locator/OsgiLocatorTest.java
+++ /dev/null
@@ -1,83 +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.specs.locator;
-
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-public class OsgiLocatorTest extends Assert {
-    
-    @BeforeClass
-    public static void setup() {
-        OsgiLocator.register("Factory", new MockCallable());
-        OsgiLocator.register("Factory", new MockCallable2());
-    }
-
-    @Test
-    public void testLocatorWithSystemProperty() {
-        System.setProperty(OsgiLocator.TIMEOUT, "0");
-        System.setProperty("Factory", "org.apache.servicemix.specs.locator.MockCallable");
-        Class clazz = OsgiLocator.locate(Object.class, "Factory");
-        assertNotNull("Expected to find a class", clazz);
-        assertEquals("Got the wrong class", MockCallable.class.getName(), clazz.getName());
-
-        System.setProperty("Factory", "org.apache.servicemix.specs.locator");
-        clazz = OsgiLocator.locate(Object.class, "Factory");
-        assertNull("Did not expect to find a class", clazz);
-    }
-
-    @Test
-    public void testLocatorWithoutSystemProperty() {
-        System.setProperty(OsgiLocator.TIMEOUT, "0");
-        System.clearProperty("Factory");
-        Class clazz = OsgiLocator.locate(Object.class, "Factory");
-        assertNotNull("Expected to find a class", clazz);
-        assertEquals("Got the wrong class", MockCallable2.class.getName(), clazz.getName());
-    }
-
-    @Test
-    public void testLocatorWithSystemPropertyAndTimeout() {
-        long timeout = 1000;
-        System.setProperty(OsgiLocator.TIMEOUT, Long.toString(timeout));
-        System.setProperty("Factory", "org.apache.servicemix.specs.locator.MockCallable");
-        Class clazz = OsgiLocator.locate(Object.class, "Factory");
-        assertNotNull("Expected to find a class", clazz);
-        assertEquals("Got the wrong class.", MockCallable.class.getName(), clazz.getName());
-
-        System.setProperty("Factory", "org.apache.servicemix.specs.locator");
-        long t0 = System.currentTimeMillis();
-        clazz = OsgiLocator.locate(Object.class, "Factory");
-        long t1 = System.currentTimeMillis();
-        assertNull("Did not expect to find a class", clazz);
-        assertTrue("Timeout issue", (t1 - t0) > timeout / 2);
-    }
-
-    @Test
-    public void testLocatorWithoutSystemPropertyAndTimeout() {
-        long timeout = 1000;
-        System.setProperty(OsgiLocator.TIMEOUT, Long.toString(timeout));
-        System.clearProperty("Factory");
-        long t0 = System.currentTimeMillis();
-        Class clazz = OsgiLocator.locate(Object.class, "Factory");
-        long t1 = System.currentTimeMillis();
-        assertNotNull("Expected to find a class", clazz);
-        assertEquals("Got the wrong class", MockCallable2.class.getName(), clazz.getName());
-        assertTrue("Timeout issue", (t1 - t0) < timeout / 2);
-    }
-
-}
diff --git a/trunk/pom.xml b/trunk/pom.xml
deleted file mode 100644
index 10e9cf4..0000000
--- a/trunk/pom.xml
+++ /dev/null
@@ -1,378 +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</groupId>
-        <artifactId>servicemix-pom</artifactId>
-        <relativePath>../servicemix-pom/pom.xml</relativePath>
-        <version>5</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.specs</groupId>
-    <artifactId>specs</artifactId>
-    <packaging>pom</packaging>
-    <version>2.1.0</version>
-    <name>Apache ServiceMix :: Specs</name>
-    <inceptionYear>2007</inceptionYear>
-
-    <modules>
-        <module>locator</module>
-        <module>activator</module>
-        <module>saaj-api-1.3</module>
-        <module>stax-api-1.0</module>
-        <module>stax-api-1.2</module>
-        <module>jain-sip-api-1.2</module>
-        <module>jaxb-api-2.0</module>
-        <module>jaxb-api-2.1</module>
-        <module>jaxb-api-2.2</module>
-        <module>jaxp-api-1.3</module>
-        <module>jaxp-api-1.4</module>
-        <module>jaxws-api-2.0</module>
-        <module>jaxws-api-2.1</module>
-        <module>jaxws-api-2.2</module>
-        <module>jbi-api-1.0</module>
-        <module>scripting-api-1.0</module>
-        <module>jsr250-1.0</module>
-        <module>jsr311-api-0.8</module>
-        <module>jsr311-api-1.0</module>
-        <module>jsr311-api-1.1</module>
-        <module>jsr311-api-1.1.1</module>
-        <module>jsr339-api-m10</module>
-        <module>javamail-api-1.4</module>
-        <module>activation-api-1.1</module>
-        <module>java-persistence-api-1.1.1</module>
-        <module>java-persistence-api-2.0</module>
-        <module>jsr303-api-1.0.0</module>
-        <module>jcr-api-2.0</module>
-        <module>assembly</module>
-    </modules>
-
-    <scm>
-        <connection>scm:svn:http://svn.apache.org/repos/asf/servicemix/smx4/specs/tags/specs-2.1.0</connection>
-        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/servicemix/smx4/specs/tags/specs-2.1.0</developerConnection>
-        <url>http://svn.apache.org/viewvc/servicemix/smx4/specs/tags/specs-2.1.0</url>
-    </scm>
-
-    <issueManagement>
-        <system>jira</system>
-        <url>http://issues.apache.org/jira/browse/SMX4</url>
-    </issueManagement>
-
-    <prerequisites>
-        <maven>2.0.7</maven>
-    </prerequisites>
-
-    <properties>
-        <osgi.version>4.2.0</osgi.version>
-    </properties>
-
-    <repositories>
-        <!-- Default repository -->
-        <repository>
-            <id>central</id>
-            <name>Default maven repo</name>
-            <url>http://repo1.maven.org/maven2</url>
-        </repository>
-        <!-- ServiceMix repo -->
-        <repository>
-            <id>servicemix</id>
-            <name>Apache ServiceMix Repository</name>
-            <url>http://svn.apache.org/repos/asf/servicemix/m2-repo</url>
-        </repository>
-    </repositories>
-
-    <pluginRepositories>
-        <!-- ServiceMix repo -->
-        <pluginRepository>
-            <id>servicemix</id>
-            <name>Apache ServiceMix Repository</name>
-            <url>http://svn.apache.org/repos/asf/servicemix/m2-repo</url>
-        </pluginRepository>
-        <!-- JApiDiff-->
-        <pluginRepository>
-            <id>japidiff</id>
-            <name>JApiDiff Repository</name>
-            <url>http://japidiff.googlecode.com/svn/m2-repo</url>
-        </pluginRepository>
-    </pluginRepositories>
-
-    <dependencies>
-        <!-- adding the OSGi JAR everywhere to ensure javadoc can get built -->
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <version>${osgi.version}</version>
-            <scope>provided</scope>
-        </dependency>
-    </dependencies>
-
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>org.apache.servicemix.legal</groupId>
-                <artifactId>legal</artifactId>
-                <version>1.0</version>
-                <type>xml</type>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-
-    <build>
-        <defaultGoal>install</defaultGoal>
-
-        <pluginManagement>
-            <plugins>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-jar-plugin</artifactId>
-                    <version>2.1</version>
-                </plugin>
-                <!--
-                   Adding some extra config to what has already been defined in org.apache:apache-7:pom
-                -->
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-release-plugin</artifactId>
-                    <configuration>
-                        <preparationGoals>clean install</preparationGoals>
-                        <arguments>-Prelease,deploy</arguments>
-                        <autoVersionSubmodules>true</autoVersionSubmodules>
-                    </configuration>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.felix</groupId>
-                    <artifactId>maven-bundle-plugin</artifactId>
-                    <version>2.1.0</version>
-                    <extensions>true</extensions>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-compiler-plugin</artifactId>
-                    <version>2.0.2</version>
-                    <configuration>
-                        <source>1.5</source>
-                        <target>1.5</target>
-                        <maxmem>256M</maxmem>
-                        <fork>${compiler.fork}</fork>
-                    </configuration>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-idea-plugin</artifactId>
-                    <version>2.1</version>
-                    <configuration>
-                        <downloadSources>true</downloadSources>
-                        <downloadJavadocs>true</downloadJavadocs>
-                    </configuration>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-surefire-plugin</artifactId>
-                    <version>2.3.1</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-shade-plugin</artifactId>
-                    <version>1.1</version>
-                </plugin>
-                <plugin>
-                    <groupId>com.google.code.japidiff</groupId>
-                    <artifactId>maven-japidiff-plugin</artifactId>
-                    <version>1.2</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-eclipse-plugin</artifactId>
-                    <version>2.5.1</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-javadoc-plugin</artifactId>
-                    <version>2.4</version>
-                </plugin>
-            </plugins>
-        </pluginManagement>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-dependency-plugin</artifactId>
-                <version>2.0</version>
-                <executions>
-                    <execution>
-                        <id>copy-legal</id>
-                        <phase>generate-resources</phase>
-                        <goals>
-                            <goal>copy</goal>
-                        </goals>
-                        <configuration>
-                            <artifactItems>
-                                <artifactItem>
-                                    <groupId>org.apache.servicemix.legal</groupId>
-                                    <artifactId>legal</artifactId>
-                                    <version>1.0</version>
-                                    <type>xml</type>
-                                    <outputDirectory>target/legal/</outputDirectory>
-                                </artifactItem>
-                            </artifactItems>
-                            <stripVersion>true</stripVersion>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-remote-resources-plugin</artifactId>
-                <version>1.0</version>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>process</goal>
-                        </goals>
-                        <configuration>
-                            <resourceBundles>
-                                <resourceBundle>org.apache:apache-jar-resource-bundle:1.4</resourceBundle>
-                            </resourceBundles>
-                            <supplementalModels>
-                                <supplementalModel>target/legal/legal.xml</supplementalModel>
-                            </supplementalModels>
-                            <properties>
-                                <addLicense>true</addLicense>
-                                <addArtifact>true</addArtifact>
-                                <projectName>Apache ServiceMix</projectName>
-                            </properties>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <reporting>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-javadoc-plugin</artifactId>
-                <version>2.3</version>
-                <configuration>
-                    <minmemory>128m</minmemory>
-                    <maxmemory>512m</maxmemory>
-                    <breakiterator>true</breakiterator>
-                    <quiet>true</quiet>
-                    <verbose>false</verbose>
-                    <source>1.5</source>
-                    <linksource>true</linksource>
-                    <links>
-                        <link>http://download.oracle.com/javase/1.5.0/docs/api/</link>
-                        <link>http://download.oracle.com/javaee/5/api/</link>
-                        <link>http://www.osgi.org/javadoc/r4/</link>
-                    </links>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jxr-plugin</artifactId>
-                <version>2.0</version>
-            </plugin>
-        </plugins>
-    </reporting>
-
-    <profiles>
-        <profile>
-            <id>fastinstall</id>
-            <properties>
-                <maven.test.skip>true</maven.test.skip>
-            </properties>
-        </profile>
-        <profile>
-            <id>rat</id>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>rat-maven-plugin</artifactId>
-                        <version>1.0-alpha-3</version>
-                        <executions>
-                            <execution>
-                                <phase>verify</phase>
-                                <goals>
-                                    <goal>check</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <reportFile>${project.build.directory}/${project.build.finalName}.rat</reportFile>
-                            <excludes>
-                                <exclude>**/target/**/*</exclude>
-                                <!-- IDEA files -->
-                                <exclude>**/*.iml</exclude>
-                                <exclude>**/*.ipr</exclude>
-                                <exclude>**/*.iws</exclude>
-                                <!-- Eclipse files -->
-                                <exclude>**/.*</exclude>
-                                <exclude>**/eclipse-classes/**/*</exclude>
-                            </excludes>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>release</id>
-            <build>
-                <plugins>
-                    <!-- We want to deploy the artifact to a staging location for perusal -->
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-deploy-plugin</artifactId>
-                        <version>2.3</version>
-                        <inherited>true</inherited>
-                        <configuration>
-                            <altDeploymentRepository>${deploy.altRepository}</altDeploymentRepository>
-                            <updateReleaseInfo>true</updateReleaseInfo>
-                        </configuration>
-                    </plugin>
-                    <!-- We want to sign the artifact, the POM, and all attached artifacts -->
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-gpg-plugin</artifactId>
-                        <version>1.0-alpha-4</version>
-                        <executions>
-                            <execution>
-                                <goals>
-                                    <goal>sign</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>deploy</id>
-            <build>
-                <defaultGoal>deploy</defaultGoal>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
diff --git a/trunk/saaj-api-1.3/pom.xml b/trunk/saaj-api-1.3/pom.xml
deleted file mode 100644
index 8ae78a2..0000000
--- a/trunk/saaj-api-1.3/pom.xml
+++ /dev/null
@@ -1,169 +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.specs</groupId>
-        <artifactId>specs</artifactId>
-        <version>2.1.0</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.specs</groupId>
-    <artifactId>org.apache.servicemix.specs.saaj-api-1.3</artifactId>
-    <packaging>bundle</packaging>
-    <version>2.1.0</version>
-    <name>Apache ServiceMix :: Specs :: SAAJ API 1.3</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-saaj_1.3_spec</artifactId>
-            <version>1.1</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Description>${project.description}</Bundle-Description>
-                        <Export-Package>javax.xml.soap*;version=1.3;-split-package:=merge-first;-noimport:=true</Export-Package>
-                        <Import-Package>*</Import-Package>
-                        <Private-Package>org.apache.servicemix.specs.locator;-split-package:=merge-first</Private-Package>
-                        <Bundle-Activator>org.apache.servicemix.specs.locator.Activator</Bundle-Activator>
-                        <Implementation-Title>Apache ServiceMix</Implementation-Title>
-                        <Implementation-Version>${project.version}</Implementation-Version>
-                    </instructions>
-                    <unpackBundle>true</unpackBundle>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <artifactSet>
-                                <includes>
-                                    <include>org.apache.geronimo.specs:geronimo-saaj_1.3_spec</include>
-                                    <include>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</include>
-                                    <include>${project.groupId}:${project.artifactId}</include>
-                                </includes>
-                            </artifactSet>
-                            <filters>
-                                <filter>
-                                    <artifact>org.apache.geronimo.specs:geronimo-saaj_1.3_spec</artifact>
-                                    <excludes>
-                                        <exclude>javax/**</exclude>
-                                    </excludes>
-                                </filter>
-                                <filter>
-                                    <artifact>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</artifact>
-                                    <excludes>
-                                        <exclude>org/**</exclude>
-                                    </excludes>
-                                </filter>
-                            </filters>
-                            <createSourcesJar>${createSourcesJar}</createSourcesJar>
-                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-                            <createDependencyReducedPom>true</createDependencyReducedPom>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>deploy</id>
-            <properties>
-                <createSourcesJar>true</createSourcesJar>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-dependency-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>unpack-sources</id>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>unpack</goal>
-                                </goals>
-                                <configuration>
-                                    <artifactItems>
-                                        <artifactItem>
-                                            <groupId>org.apache.geronimo.specs</groupId>
-                                            <artifactId>geronimo-saaj_1.3_spec</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                        <artifactItem>
-                                            <groupId>org.apache.servicemix.specs</groupId>
-                                            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                    </artifactItems>
-                                    <outputDirectory>${project.build.directory}/sources</outputDirectory>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>package</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <minmemory>128m</minmemory>
-                            <maxmemory>512m</maxmemory>
-                            <sourcepath>${project.build.directory}/sources</sourcepath>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
diff --git a/trunk/saaj-api-1.3/src/main/java/javax/xml/soap/FactoryFinder.java b/trunk/saaj-api-1.3/src/main/java/javax/xml/soap/FactoryFinder.java
deleted file mode 100644
index ac9e9f5..0000000
--- a/trunk/saaj-api-1.3/src/main/java/javax/xml/soap/FactoryFinder.java
+++ /dev/null
@@ -1,221 +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 javax.xml.soap;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.Properties;
-
-/**
- * This class is used to locate factory classes for javax.xml.soap. It has package scope since it is
- * not part of JAXM and should not be accessed from other packages.
- */
-class FactoryFinder {
-    /**
-     * instantiates an object go the given classname.
-     *
-     * @param factoryClassName
-     * @return a factory object
-     * @throws SOAPException
-     */
-    private static Object newInstance(String factoryClassName) throws SOAPException {
-        ClassLoader classloader = null;
-        try {
-            classloader = Thread.currentThread().getContextClassLoader();
-        } catch (Exception exception) {
-            throw new SOAPException(exception.toString(), exception);
-        }
-
-        try {
-            Class factory = null;
-            if (classloader == null) {
-                factory = Class.forName(factoryClassName);
-            } else {
-                try {
-                    factory = classloader.loadClass(factoryClassName);
-                } catch (ClassNotFoundException cnfe) {
-                }
-            }
-            if (factory == null) {
-                classloader = FactoryFinder.class.getClassLoader();
-                factory = classloader.loadClass(factoryClassName);
-            }
-            return factory.newInstance();
-        } catch (ClassNotFoundException classnotfoundexception) {
-            throw new SOAPException(
-                    "Provider " + factoryClassName + " not found",
-                    classnotfoundexception);
-        } catch (Exception exception) {
-            throw new SOAPException(
-                    "Provider " + factoryClassName +
-                            " could not be instantiated: " +
-                            exception,
-                    exception);
-        }
-    }
-
-    /**
-     * Instantiates a factory object given the factory's property name and the default class name.
-     *
-     * @param factoryPropertyName
-     * @param defaultFactoryClassName
-     * @return a factory object
-     * @throws SOAPException
-     */
-    static Object find(Class factory,
-                       String defaultFactoryClassName) throws SOAPException {
-        return find(factory.getName(), factory, defaultFactoryClassName);
-    }
-    /**
-     * Instantiates a factory object given the factory's property name and the default class name.
-     *
-     * @param factoryPropertyName
-     * @param defaultFactoryClassName
-     * @return a factory object
-     * @throws SOAPException
-     */
-    static Object find(String factoryPropertyName,
-                       String defaultFactoryClassName) throws SOAPException {
-        return find(factoryPropertyName, null, defaultFactoryClassName);
-    }
-    /**
-     * Instantiates a factory object given the factory's property name and the default class name.
-     *
-     * @param factoryPropertyName
-     * @param defaultFactoryClassName
-     * @return a factory object
-     * @throws SOAPException
-     */
-    static Object find(String factoryPropertyName,
-                       Class factoryClass,
-                       String defaultFactoryClassName) throws SOAPException {
-        try {
-            // If we are deployed into an OSGi environment, leverage it
-            if (factoryClass == null) {
-                String factoryClassName = factoryPropertyName;
-                if (factoryPropertyName.equals("javax.xml.soap.MetaFactory")) {
-                    //this is an exception that the factoryPropertyName isn't
-                    //the actual factory class name, there is no class
-                    //javax.xml.soap.MetaFactory at all
-                    factoryClassName = "javax.xml.soap.SAAJMetaFactory";
-                }
-                ClassLoader cl = FactoryFinder.class.getClassLoader();
-                if (cl == null) {
-                    cl = Thread.currentThread().getContextClassLoader();
-                }
-                factoryClass = cl.loadClass(factoryClassName);
-            }
-            Class spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(factoryClass, factoryPropertyName);
-            if (spiClass != null) {
-                return spiClass.newInstance();
-            }
-        } catch (Throwable e) {
-        }
-
-        try {
-            String factoryClassName = System.getProperty(factoryPropertyName);
-            if (factoryClassName != null) {
-                return newInstance(factoryClassName);
-            }
-        } catch (SecurityException securityexception) {
-        }
-
-        try {
-            String propertiesFileName = System.getProperty("java.home")
-                    + File.separator + "lib"
-                    + File.separator + "jaxm.properties";
-            File file = new File(propertiesFileName);
-            if (file.exists()) {
-                FileInputStream fileInput = new FileInputStream(file);
-                Properties properties = new Properties();
-                properties.load(fileInput);
-                fileInput.close();
-                String factoryClassName = properties.getProperty(
-                        factoryPropertyName);
-                return newInstance(factoryClassName);
-            }
-        } catch (Exception exception1) {
-        }
-
-        String factoryResource = "META-INF/services/" + factoryPropertyName;
-
-        try {
-            InputStream inputstream = getResource(factoryResource);
-            if (inputstream != null) {
-                BufferedReader bufferedreader = new BufferedReader(
-                        new InputStreamReader(inputstream, "UTF-8"));
-                String factoryClassName = bufferedreader.readLine();
-                bufferedreader.close();
-                if ((factoryClassName != null) && !"".equals(factoryClassName)) {
-                    try {
-                        return newInstance(factoryClassName);
-                    } catch (Exception e) {
-                        throw new SOAPException(
-                                "Provider for " + factoryPropertyName + " cannot be found",
-                                null);
-                    }
-                }
-            }
-        } catch (Exception exception2) {
-        }
-
-        if (defaultFactoryClassName == null) {
-            throw new SOAPException(
-                    "Provider for " + factoryPropertyName + " cannot be found",
-                    null);
-        } else {
-            return newInstance(defaultFactoryClassName);
-        }
-    }
-
-    /**
-     * Returns an input stream for the specified resource.
-     * <p/>
-     * <p>This method will firstly try <code>ClassLoader.getSystemResourceAsStream()</code> then the
-     * class loader of the current thread with <code>getResourceAsStream()</code> and finally
-     * attempt <code>getResourceAsStream()</code> on <code>FactoryFinder.class.getClassLoader()</code>.
-     *
-     * @param factoryResource the resource name
-     * @return an InputStream that can be used to read that resource, or <code>null</code> if the
-     *         resource could not be resolved
-     */
-    private static InputStream getResource(String factoryResource) {
-        ClassLoader classloader = null;
-        try {
-            classloader = Thread.currentThread().getContextClassLoader();
-        } catch (SecurityException securityexception) {
-        }
-
-        InputStream inputstream;
-        if (classloader == null) {
-            inputstream =
-                    ClassLoader.getSystemResourceAsStream(factoryResource);
-        } else {
-            inputstream = classloader.getResourceAsStream(factoryResource);
-        }
-
-        if (inputstream == null) {
-            inputstream =
-                    FactoryFinder.class.getClassLoader().getResourceAsStream(
-                            factoryResource);
-        }
-        return inputstream;
-    }
-}
diff --git a/trunk/scripting-api-1.0/pom.xml b/trunk/scripting-api-1.0/pom.xml
deleted file mode 100644
index 992726d..0000000
--- a/trunk/scripting-api-1.0/pom.xml
+++ /dev/null
@@ -1,168 +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.specs</groupId>
-        <artifactId>specs</artifactId>
-        <version>2.1.0</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.specs</groupId>
-    <artifactId>org.apache.servicemix.specs.scripting-api-1.0</artifactId>
-    <packaging>bundle</packaging>
-    <version>2.1.0</version>
-    <name>Apache ServiceMix :: Specs :: Scripting API 1.0</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.livetribe</groupId>
-            <artifactId>livetribe-jsr223</artifactId>
-            <version>2.0.5</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Description>${project.description}</Bundle-Description>
-                        <Export-Package>javax.script*;version=1.0;-split-package:=merge-first;-noimport:=true</Export-Package>
-                        <Import-Package>*</Import-Package>
-                        <Private-Package>org.apache.servicemix.specs.locator;-split-package:=merge-first</Private-Package>
-                        <Bundle-Activator>org.apache.servicemix.specs.locator.Activator</Bundle-Activator>
-                        <Implementation-Title>Apache ServiceMix</Implementation-Title>
-                        <Implementation-Version>${project.version}</Implementation-Version>
-                    </instructions>
-                    <unpackBundle>true</unpackBundle>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <artifactSet>
-                                <includes>
-                                    <include>org.livetribe:livetribe-jsr223</include>
-                                    <include>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</include>
-                                </includes>
-                            </artifactSet>
-                            <filters>
-                                <filter>
-                                    <artifact>org.livetribe:livetribe-jsr223</artifact>
-                                    <excludes>
-                                        <exclude>javax/**</exclude>
-                                    </excludes>
-                                </filter>
-                                <filter>
-                                    <artifact>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</artifact>
-                                    <excludes>
-                                        <exclude>org/**</exclude>
-                                    </excludes>
-                                </filter>
-                            </filters>
-                            <createSourcesJar>${createSourcesJar}</createSourcesJar>
-                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-                            <createDependencyReducedPom>true</createDependencyReducedPom>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>deploy</id>
-            <properties>
-                <createSourcesJar>true</createSourcesJar>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-dependency-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>unpack-sources</id>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>unpack</goal>
-                                </goals>
-                                <configuration>
-                                    <artifactItems>
-                                        <artifactItem>
-                                            <groupId>org.livetribe</groupId>
-                                            <artifactId>livetribe-jsr223</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                        <artifactItem>
-                                            <groupId>org.apache.servicemix.specs</groupId>
-                                            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                    </artifactItems>
-                                    <outputDirectory>${project.build.directory}/sources</outputDirectory>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>package</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <minmemory>128m</minmemory>
-                            <maxmemory>512m</maxmemory>
-                            <sourcepath>${project.build.directory}/sources</sourcepath>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
diff --git a/trunk/scripting-api-1.0/src/main/java/javax/script/ScriptEngineManager.java b/trunk/scripting-api-1.0/src/main/java/javax/script/ScriptEngineManager.java
deleted file mode 100644
index a4df037..0000000
--- a/trunk/scripting-api-1.0/src/main/java/javax/script/ScriptEngineManager.java
+++ /dev/null
@@ -1,222 +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 javax.script;
-
-import java.io.*;
-import java.lang.annotation.AnnotationFormatError;
-import java.net.URL;
-import java.util.*;
-
-public class ScriptEngineManager {
-	
-    private final Set engineSpis = new HashSet();
-    private final Map<String, ScriptEngineFactory> byName = new HashMap<String, ScriptEngineFactory>();
-    private final Map<String, ScriptEngineFactory> registeredByName = new HashMap();
-    private final Map<String, ScriptEngineFactory> byExtension = new HashMap<String, ScriptEngineFactory>();
-    private final Map<String, ScriptEngineFactory> registeredByExtension = new HashMap<String, ScriptEngineFactory>();
-    private final Map<String, ScriptEngineFactory> byMimeType = new HashMap<String, ScriptEngineFactory>();
-    private final Map<String, ScriptEngineFactory> registeredByMimeType = new HashMap<String, ScriptEngineFactory>();
-    private Bindings globalScope;
-
-	public ScriptEngineManager() {
-		this(Thread.currentThread().getContextClassLoader());
-	}
-	
-	public ScriptEngineManager(ClassLoader classLoader) {
-        try
-        {
-            for (Enumeration factoryResources = classLoader.getResources("META-INF/services/javax.script.ScriptEngineFactory"); 
-				 factoryResources.hasMoreElements();) {
-                URL url = (URL) factoryResources.nextElement();
-				for (String className : getClassNames(url)) {
-                    try {
-                        Class factoryClass = classLoader.loadClass(className);
-                        Object object = factoryClass.newInstance();
-                        if (object instanceof ScriptEngineFactory) {
-                            ScriptEngineFactory factory = (ScriptEngineFactory) object;
-                            for (String name : factory.getNames()) {
-								byName.put(name, factory);
-							}
-							for (String extension : factory.getExtensions()) {
-								byExtension.put(extension, factory);
-							}
-							for (String mimeType : factory.getMimeTypes()) {
-								byMimeType.put(mimeType, factory);
-							}
-                            engineSpis.add(factory);
-                        }
-                    } catch(ClassNotFoundException doNothing) { 
-					} catch(IllegalAccessException doNothing) { 
-					} catch(InstantiationException doNothing) { 
-					} catch(LinkageError doNothing) { 
-					} catch(AnnotationFormatError doNothing) { 
-					}
-                }
-            }
-        } catch(IOException doNothing) { 
-		}
-	}
-
-    public Bindings getGlobalScope() {
-        return globalScope;
-    }
-
-    public void setGlobalScope(Bindings globalScope) {
-        this.globalScope = globalScope;
-    }
-
-    public void put(String key, Object value) {
-        if (globalScope != null) {
-            globalScope.put(key, value);
-		}
-    }
-
-    public Object get(String key) {
-        if (globalScope != null) {
-            return globalScope.get(key);
-        } else {
-            return null;
-		}
-    }
-
-    public ScriptEngine getEngineByName(String shortName) {
-		ScriptEngineFactory factory = null;
-        List<Class<? extends ScriptEngineFactory>> factoryClasses = org.apache.servicemix.specs.locator.OsgiLocator.locateAll(javax.script.ScriptEngineFactory.class);
-        for (Class<? extends ScriptEngineFactory> factoryClass : factoryClasses) {
-			try {
-				ScriptEngineFactory f = factoryClass.newInstance();
-				if (f.getNames().contains(shortName)) {
-					factory = f;
-					break;
-				}
-			} catch (Throwable doNothing) {
-			}
-		}
-        if (factory == null) {
-			factory = registeredByName.get(shortName);
-		}
-        if (factory == null) {
-            factory = byName.get(shortName);
-		}
-        if (factory == null) {
-            return null;
-        } else {
-            ScriptEngine engine = factory.getScriptEngine();
-            engine.setBindings(globalScope, ScriptContext.GLOBAL_SCOPE);
-            return engine;
-        }
-    }
-
-    public ScriptEngine getEngineByExtension(String extension) {
-		ScriptEngineFactory factory = null;
-        List<Class<? extends ScriptEngineFactory>> factoryClasses = org.apache.servicemix.specs.locator.OsgiLocator.locateAll(javax.script.ScriptEngineFactory.class);
-        for (Class<? extends ScriptEngineFactory> factoryClass : factoryClasses) {
-			try {
-				ScriptEngineFactory f = factoryClass.newInstance();
-				if (f.getExtensions().contains(extension)) {
-					factory = f;
-					break;
-				}
-			} catch (Throwable doNothing) {
-			}
-		}
-        if (factory == null) {
-			factory = registeredByExtension.get(extension);
-		}
-        if (factory == null) {
-            factory = byExtension.get(extension);
-		}
-        if (factory == null) {
-            return null;
-        } else {
-            ScriptEngine engine = factory.getScriptEngine();
-            engine.setBindings(globalScope, ScriptContext.GLOBAL_SCOPE);
-            return engine;
-        }
-    }
-
-    public ScriptEngine getEngineByMimeType(String mimeType) {
-		ScriptEngineFactory factory = null;
-        List<Class<? extends ScriptEngineFactory>> factoryClasses = org.apache.servicemix.specs.locator.OsgiLocator.locateAll(javax.script.ScriptEngineFactory.class);
-        for (Class<? extends ScriptEngineFactory> factoryClass : factoryClasses) {
-			try {
-				ScriptEngineFactory f = factoryClass.newInstance();
-				if (f.getMimeTypes().contains(mimeType)) {
-					factory = f;
-					break;
-				}
-			} catch (Throwable doNothing) {
-			}
-		}
-        if (factory == null) {
-			factory = registeredByMimeType.get(mimeType);
-		}
-        if(factory == null) {
-            factory = byMimeType.get(mimeType);
-		}
-        if (factory == null) {
-            return null;
-        } else {
-            ScriptEngine engine = factory.getScriptEngine();
-            engine.setBindings(globalScope, ScriptContext.GLOBAL_SCOPE);
-            return engine;
-        }
-    }
-
-    public List<ScriptEngineFactory> getEngineFactories() {
-        List<ScriptEngineFactory> factories = new ArrayList();
-        List<Class<? extends ScriptEngineFactory>> factoryClasses = org.apache.servicemix.specs.locator.OsgiLocator.locateAll(javax.script.ScriptEngineFactory.class);
-        for (Class<? extends ScriptEngineFactory> factoryClass : factoryClasses) {
-			try {
-				factories.add((ScriptEngineFactory) factoryClass.newInstance());
-			} catch (Throwable doNothing) {
-			}
-		}
-		factories.addAll(engineSpis);
-		return factories;
-    }
-
-    public void registerEngineName(String name, ScriptEngineFactory factory) {
-        registeredByName.put(name, factory);
-    }
-
-    public void registerEngineMimeType(String type, ScriptEngineFactory factory) {
-        registeredByMimeType.put(type, factory);
-    }
-
-    public void registerEngineExtension(String extension, ScriptEngineFactory factory) {
-        registeredByExtension.put(extension, factory);
-    }
-
-    private Iterable<String> getClassNames(URL url) {
-        Stack<String> stack = new Stack<String>();
-        try {
-            BufferedReader r = new BufferedReader(new InputStreamReader(url.openStream()));
-            String line;
-            while ((line = r.readLine()) != null) {
-                int comment = line.indexOf('#');
-                if (comment != -1) {
-                    line = line.substring(0, comment);
-				}
-                stack.push(line.trim());
-            }
-        } catch(IOException doNothing) { 
-		}
-        return stack;
-    }
-
-}
\ No newline at end of file
diff --git a/trunk/stax-api-1.0/pom.xml b/trunk/stax-api-1.0/pom.xml
deleted file mode 100644
index cc3a7bd..0000000
--- a/trunk/stax-api-1.0/pom.xml
+++ /dev/null
@@ -1,168 +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.specs</groupId>
-        <artifactId>specs</artifactId>
-        <version>2.1.0</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.specs</groupId>
-    <artifactId>org.apache.servicemix.specs.stax-api-1.0</artifactId>
-    <packaging>bundle</packaging>
-    <version>2.1.0</version>
-    <name>Apache ServiceMix :: Specs :: Stax API 1.0</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-stax-api_1.0_spec</artifactId>
-            <version>1.0.1</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Description>${project.description}</Bundle-Description>
-                        <Export-Package>javax.xml.stream*;version=1.0.1;-split-package:=merge-first;-noimport:=true</Export-Package>
-                        <Import-Package>*</Import-Package>
-                        <Private-Package>org.apache.servicemix.specs.locator;-split-package:=merge-first</Private-Package>
-                        <Bundle-Activator>org.apache.servicemix.specs.locator.Activator</Bundle-Activator>
-                        <Implementation-Title>Apache ServiceMix</Implementation-Title>
-                        <Implementation-Version>${project.version}</Implementation-Version>
-                    </instructions>
-                    <unpackBundle>true</unpackBundle>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <artifactSet>
-                                <includes>
-                                    <include>org.apache.geronimo.specs:geronimo-stax-api_1.0_spec</include>
-                                    <include>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</include>
-                                </includes>
-                            </artifactSet>
-                            <filters>
-                                <filter>
-                                    <artifact>org.apache.geronimo.specs:geronimo-stax-api_1.0_spec</artifact>
-                                    <excludes>
-                                        <exclude>javax/**</exclude>
-                                    </excludes>
-                                </filter>
-                                <filter>
-                                    <artifact>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</artifact>
-                                    <excludes>
-                                        <exclude>org/**</exclude>
-                                    </excludes>
-                                </filter>
-                            </filters>
-                            <createSourcesJar>${createSourcesJar}</createSourcesJar>
-                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-                            <createDependencyReducedPom>true</createDependencyReducedPom>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>deploy</id>
-            <properties>
-                <createSourcesJar>true</createSourcesJar>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-dependency-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>unpack-sources</id>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>unpack</goal>
-                                </goals>
-                                <configuration>
-                                    <artifactItems>
-                                        <artifactItem>
-                                            <groupId>org.apache.geronimo.specs</groupId>
-                                            <artifactId>geronimo-stax-api_1.0_spec</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                        <artifactItem>
-                                            <groupId>org.apache.servicemix.specs</groupId>
-                                            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                    </artifactItems>
-                                    <outputDirectory>${project.build.directory}/sources</outputDirectory>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>package</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <minmemory>128m</minmemory>
-                            <maxmemory>512m</maxmemory>
-                            <sourcepath>${project.build.directory}/sources</sourcepath>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
diff --git a/trunk/stax-api-1.0/src/main/java/javax/xml/stream/FactoryLocator.java b/trunk/stax-api-1.0/src/main/java/javax/xml/stream/FactoryLocator.java
deleted file mode 100644
index cd61b8d..0000000
--- a/trunk/stax-api-1.0/src/main/java/javax/xml/stream/FactoryLocator.java
+++ /dev/null
@@ -1,156 +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 javax.xml.stream;
-
-import java.io.InputStream;
-import java.io.File;
-import java.io.FileInputStream;
-
-import java.util.Arrays;
-import java.util.Properties;
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
-
-/*
- * Here is the beef on the finding the Factory Class
- * 
- * 1. Use the javax.xml.stream.XMLInputFactory system property. 2. Use the
- * properties file "lib/stax.properties" in the JRE directory. This
- * configuration file is in standard java.util.Properties format and contains
- * the fully qualified name of the implementation class with the key being the
- * system property defined above. 3. Use the Services API (as detailed in the
- * JAR specification), if available, to determine the classname. The Services
- * API will look for a classname in the file
- * META-INF/services/javax.xml.stream.XMLInputFactory in jars available to the
- * runtime. Platform default XMLInputFactory instance.
- * 
- * If the user provided a classloader we'll use that...if not, we'll assume the 
- * classloader of this class.
- */
-
-class FactoryLocator {
-	static Object locate(String factoryId) throws FactoryConfigurationError {
-		return locate(factoryId, null);
-	}
-
-	static Object locate(String factoryId, String[] altClassName)
-			throws FactoryConfigurationError {
-		return locate(factoryId, altClassName,
-                              Thread.currentThread().getContextClassLoader());
-	}
-
-	static Object locate(String factoryId, String[] altClassName,
-                         ClassLoader classLoader) throws FactoryConfigurationError {
-        try {
-            // If we are deployed into an OSGi environment, leverage it
-            ClassLoader cl = FactoryLocator.class.getClassLoader();
-            if (cl == null) {
-                cl = ClassLoader.getSystemClassLoader();
-            }
-            Class factoryClass = cl.loadClass(factoryId);
-            Class spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(factoryClass, factoryId);
-            if (spiClass != null) {
-                return spiClass.newInstance();
-            }
-        } catch (Throwable e) {
-        }
-
-        try {
-			String prop = System.getProperty(factoryId);
-			if (prop != null) {
-				return loadFactory(prop, classLoader);
-			}
-		} catch (Exception e) {
-		}
-
-		try {
-			String configFile = System.getProperty("java.home")
-					+ File.separator + "lib" + File.separator
-					+ "stax.properties";
-			File f = new File(configFile);
-			if (f.exists()) {
-				Properties props = new Properties();
-				props.load(new FileInputStream(f));
-				String factoryClassName = props.getProperty(factoryId);
-				return loadFactory(factoryClassName, classLoader);
-			}
-		} catch (Exception e) {
-		}
-
-		String serviceId = "META-INF/services/" + factoryId;
-		try {
-			InputStream is = null;
-
-			if (classLoader == null) {
-				is = ClassLoader.getSystemResourceAsStream(serviceId);
-			} else {
-				is = classLoader.getResourceAsStream(serviceId);
-			}
-
-			if (is != null) {
-				BufferedReader br = new BufferedReader(new InputStreamReader(
-						is, "UTF-8"));
-				String factoryClassName = br.readLine();
-				br.close();
-
-				if (factoryClassName != null && !"".equals(factoryClassName)) {
-					return loadFactory(factoryClassName, classLoader);
-				}
-			}
-		} catch (Exception ex) {
-		}
-
-		if (altClassName == null) {
-			throw new FactoryConfigurationError("Unable to locate factory for "
-					+ factoryId + ".", null);
-		}
-		return loadFactory(altClassName, classLoader);
-	}
-
-    private static Object loadFactory(String[] classNames, ClassLoader classLoader)
-            throws FactoryConfigurationError {
-        for (String className : classNames) {
-            try {
-                Class factoryClass = classLoader == null ? Class.forName(className)
-                        : classLoader.loadClass(className);
-
-                return factoryClass.newInstance();
-            } catch (Exception x) {
-            }
-        }
-        throw new FactoryConfigurationError("Requested factory "
-                + Arrays.asList(classNames).toString()
-                + " could not be instantiated");
-    }
-
-	private static Object loadFactory(String className, ClassLoader classLoader)
-			throws FactoryConfigurationError {
-		try {
-			Class factoryClass = classLoader == null ? Class.forName(className)
-					: classLoader.loadClass(className);
-
-			return factoryClass.newInstance();
-		} catch (ClassNotFoundException x) {
-			throw new FactoryConfigurationError("Requested factory "
-					+ className + " cannot be located.  Classloader ="
-					+ classLoader.toString(), x);
-		} catch (Exception x) {
-			throw new FactoryConfigurationError("Requested factory "
-					+ className + " could not be instantiated: " + x, x);
-		}
-	}
-}
diff --git a/trunk/stax-api-1.0/src/main/java/javax/xml/stream/XMLEventFactory.java b/trunk/stax-api-1.0/src/main/java/javax/xml/stream/XMLEventFactory.java
deleted file mode 100644
index 61ebacc..0000000
--- a/trunk/stax-api-1.0/src/main/java/javax/xml/stream/XMLEventFactory.java
+++ /dev/null
@@ -1,121 +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 javax.xml.stream;
-
-import java.util.Iterator;
-
-import javax.xml.namespace.NamespaceContext;
-import javax.xml.stream.events.ProcessingInstruction;
-import javax.xml.namespace.QName;
-import javax.xml.stream.events.Characters;
-import javax.xml.stream.events.Comment;
-import javax.xml.stream.events.DTD;
-import javax.xml.stream.events.EndElement;
-import javax.xml.stream.events.EntityDeclaration;
-import javax.xml.stream.events.Namespace;
-import javax.xml.stream.events.Attribute;
-import javax.xml.stream.events.EndDocument;
-import javax.xml.stream.events.EntityReference;
-import javax.xml.stream.events.StartDocument;
-import javax.xml.stream.events.StartElement;
-
-public abstract class XMLEventFactory {
-
-	protected XMLEventFactory() {
-	}
-
-	public static XMLEventFactory newInstance()
-			throws FactoryConfigurationError {
-            return (XMLEventFactory)FactoryLocator.locate("javax.xml.stream.XMLEventFactory",
-                    new String[] { "com.sun.xml.internal.stream.events.XMLEventFactoryImpl", "com.ibm.xml.xlxp.api.stax.XMLEventFactoryImpl" });
-	}
-
-	public static XMLEventFactory newInstance(String factoryId,
-			ClassLoader classLoader) throws FactoryConfigurationError {
-            return (XMLEventFactory)FactoryLocator.locate(factoryId,
-                    new String[] { "com.sun.xml.internal.stream.events.XMLEventFactoryImpl", "com.ibm.xml.xlxp.api.stax.XMLEventFactoryImpl" },
-                    classLoader);
-	}
-
-	public abstract void setLocation(Location location);
-
-	public abstract Attribute createAttribute(QName name, String value);
-
-	public abstract Attribute createAttribute(String localName, String value);
-
-	public abstract Attribute createAttribute(String prefix,
-			String namespaceURI, String localName, String value);
-
-	public abstract Namespace createNamespace(String namespaceUri);
-
-	public abstract Namespace createNamespace(String prefix, String namespaceUri);
-
-	public abstract StartElement createStartElement(QName name,
-			Iterator attributes, Iterator namespaces);
-
-	public abstract StartElement createStartElement(String prefix,
-			String namespaceUri, String localName);
-
-	public abstract StartElement createStartElement(String prefix,
-			String namespaceUri, String localName, Iterator attributes,
-			Iterator namespaces);
-
-	public abstract StartElement createStartElement(String prefix,
-			String namespaceUri, String localName, Iterator attributes,
-			Iterator namespaces, NamespaceContext context);
-
-	public abstract EndElement createEndElement(QName name, Iterator namespaces);
-
-	public abstract EndElement createEndElement(String prefix,
-			String namespaceUri, String localName);
-
-	public abstract EndElement createEndElement(String prefix,
-			String namespaceUri, String localName, Iterator namespaces);
-
-	public abstract Characters createCharacters(String content);
-
-	public abstract Characters createCData(String content);
-
-	public abstract Characters createSpace(String content);
-
-	public abstract Characters createIgnorableSpace(String content);
-
-	public abstract StartDocument createStartDocument();
-
-	public abstract StartDocument createStartDocument(String encoding);
-
-	public abstract StartDocument createStartDocument(String encoding,
-			String version);
-
-	public abstract StartDocument createStartDocument(String encoding,
-			String version, boolean standalone);
-
-	public abstract EndDocument createEndDocument();
-
-	public abstract EntityReference createEntityReference(String name,
-			EntityDeclaration declaration);
-
-	public abstract Comment createComment(String text);
-
-	public abstract ProcessingInstruction createProcessingInstruction(
-			String target, String data);
-
-	public abstract DTD createDTD(String dtd);
-}
diff --git a/trunk/stax-api-1.0/src/main/java/javax/xml/stream/XMLInputFactory.java b/trunk/stax-api-1.0/src/main/java/javax/xml/stream/XMLInputFactory.java
deleted file mode 100644
index e0e123c..0000000
--- a/trunk/stax-api-1.0/src/main/java/javax/xml/stream/XMLInputFactory.java
+++ /dev/null
@@ -1,124 +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 javax.xml.stream;
-
-import javax.xml.stream.util.XMLEventAllocator;
-
-public abstract class XMLInputFactory {
-	public static final java.lang.String ALLOCATOR = "javax.xml.stream.allocator";
-	public static final java.lang.String IS_COALESCING = "javax.xml.stream.isCoalescing";
-	public static final java.lang.String IS_NAMESPACE_AWARE = "javax.xml.stream.isNamespaceAware";
-	public static final java.lang.String IS_REPLACING_ENTITY_REFERENCES = "javax.xml.stream.isReplacingEntityReferences";
-	public static final java.lang.String IS_SUPPORTING_EXTERNAL_ENTITIES = "javax.xml.stream.isSupportingExternalEntities";
-	public static final java.lang.String IS_VALIDATING = "javax.xml.stream.isValidating";
-	public static final java.lang.String REPORTER = "javax.xml.stream.reporter";
-	public static final java.lang.String RESOLVER = "javax.xml.stream.resolver";
-	public static final java.lang.String SUPPORT_DTD = "javax.xml.stream.supportDTD";
-
-	protected XMLInputFactory() {
-	}
-
-	public static XMLInputFactory newInstance()
-			throws FactoryConfigurationError {
-		// We'll assume the XMLInputFactory from the RI as a backup.
-		return (XMLInputFactory)FactoryLocator.locate("javax.xml.stream.XMLInputFactory",
-                new String[] { "com.sun.xml.internal.stream.XMLInputFactoryImpl", "com.ibm.xml.xlxp.api.stax.XMLInputFactoryImpl" });
-	}
-
-	public static XMLInputFactory newInstance(java.lang.String factoryId,
-			java.lang.ClassLoader classLoader) throws FactoryConfigurationError {
-		// We'll assume the XMLInputFactory from the RI as a backup.
-		return (XMLInputFactory)FactoryLocator.locate(factoryId,
-                new String[] { "com.sun.xml.internal.stream.XMLInputFactoryImpl", "com.ibm.xml.xlxp.api.stax.XMLInputFactoryImpl" },
-                classLoader);
-	}
-
-	public abstract XMLStreamReader createXMLStreamReader(java.io.Reader reader)
-			throws XMLStreamException;
-
-	public abstract XMLStreamReader createXMLStreamReader(
-			javax.xml.transform.Source source) throws XMLStreamException;
-
-	public abstract XMLStreamReader createXMLStreamReader(
-			java.io.InputStream stream) throws XMLStreamException;
-
-	public abstract XMLStreamReader createXMLStreamReader(
-			java.io.InputStream stream, java.lang.String encoding)
-			throws XMLStreamException;
-
-	public abstract XMLStreamReader createXMLStreamReader(
-			java.lang.String systemId, java.io.InputStream stream)
-			throws XMLStreamException;
-
-	public abstract XMLStreamReader createXMLStreamReader(
-			java.lang.String systemId, java.io.Reader reader)
-			throws XMLStreamException;
-
-	public abstract XMLEventReader createXMLEventReader(java.io.Reader reader)
-			throws XMLStreamException;
-
-	public abstract XMLEventReader createXMLEventReader(
-			java.lang.String systemId, java.io.Reader reader)
-			throws XMLStreamException;
-
-	public abstract XMLEventReader createXMLEventReader(XMLStreamReader reader)
-			throws XMLStreamException;
-
-	public abstract XMLEventReader createXMLEventReader(
-			javax.xml.transform.Source source) throws XMLStreamException;
-
-	public abstract XMLEventReader createXMLEventReader(
-			java.io.InputStream stream) throws XMLStreamException;
-
-	public abstract XMLEventReader createXMLEventReader(
-			java.io.InputStream stream, java.lang.String encoding)
-			throws XMLStreamException;
-
-	public abstract XMLEventReader createXMLEventReader(
-			java.lang.String systemId, java.io.InputStream stream)
-			throws XMLStreamException;
-
-	public abstract XMLStreamReader createFilteredReader(
-			XMLStreamReader reader, StreamFilter filter)
-			throws XMLStreamException;
-
-	public abstract XMLEventReader createFilteredReader(XMLEventReader reader,
-			EventFilter filter) throws XMLStreamException;
-
-	public abstract XMLResolver getXMLResolver();
-
-	public abstract void setXMLResolver(XMLResolver resolver);
-
-	public abstract XMLReporter getXMLReporter();
-
-	public abstract void setXMLReporter(XMLReporter reporter);
-
-	public abstract void setProperty(java.lang.String name,
-			java.lang.Object value) throws java.lang.IllegalArgumentException;
-
-	public abstract java.lang.Object getProperty(java.lang.String name)
-			throws java.lang.IllegalArgumentException;
-
-	public abstract boolean isPropertySupported(java.lang.String name);
-
-	public abstract void setEventAllocator(XMLEventAllocator allocator);
-
-	public abstract XMLEventAllocator getEventAllocator();
-}
diff --git a/trunk/stax-api-1.0/src/main/java/javax/xml/stream/XMLOutputFactory.java b/trunk/stax-api-1.0/src/main/java/javax/xml/stream/XMLOutputFactory.java
deleted file mode 100644
index e8a27ff..0000000
--- a/trunk/stax-api-1.0/src/main/java/javax/xml/stream/XMLOutputFactory.java
+++ /dev/null
@@ -1,73 +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 javax.xml.stream;
-
-public abstract class XMLOutputFactory {
-	public static final String IS_REPAIRING_NAMESPACES = "javax.xml.stream.isRepairingNamespaces";
-
-	protected XMLOutputFactory() { }
-	
-	public static XMLOutputFactory newInstance()
-			throws FactoryConfigurationError {
-		return (XMLOutputFactory) FactoryLocator.locate("javax.xml.stream.XMLOutputFactory",
-                new String[] { "com.sun.xml.internal.stream.XMLOutputFactoryImpl", "com.ibm.xml.xlxp.api.stax.XMLOutputFactoryImpl" });
-	}
-
-	public static XMLInputFactory newInstance(String factoryId,
-			java.lang.ClassLoader classLoader) throws FactoryConfigurationError {
-		return (XMLInputFactory) FactoryLocator.locate(factoryId,
-                new String[] { "com.sun.xml.internal.stream.XMLOutputFactoryImpl", "com.ibm.xml.xlxp.api.stax.XMLOutputFactoryImpl" },
-                classLoader);
-	}
-
-	public abstract XMLStreamWriter createXMLStreamWriter(java.io.Writer stream)
-			throws XMLStreamException;
-
-	public abstract XMLStreamWriter createXMLStreamWriter(
-			java.io.OutputStream stream) throws XMLStreamException;
-
-	public abstract XMLStreamWriter createXMLStreamWriter(
-			java.io.OutputStream stream, String encoding)
-			throws XMLStreamException;
-
-	public abstract XMLStreamWriter createXMLStreamWriter(
-			javax.xml.transform.Result result) throws XMLStreamException;
-
-	public abstract XMLEventWriter createXMLEventWriter(
-			javax.xml.transform.Result result) throws XMLStreamException;
-
-	public abstract XMLEventWriter createXMLEventWriter(
-			java.io.OutputStream stream) throws XMLStreamException;
-
-	public abstract XMLEventWriter createXMLEventWriter(
-			java.io.OutputStream stream, String encoding)
-			throws XMLStreamException;
-
-	public abstract XMLEventWriter createXMLEventWriter(java.io.Writer stream)
-			throws XMLStreamException;
-
-	public abstract void setProperty(String name, Object value)
-			throws IllegalArgumentException;
-
-	public abstract Object getProperty(String name)
-			throws IllegalArgumentException;
-
-	public abstract boolean isPropertySupported(String name);
-}
diff --git a/trunk/stax-api-1.2/pom.xml b/trunk/stax-api-1.2/pom.xml
deleted file mode 100644
index 0e725b2..0000000
--- a/trunk/stax-api-1.2/pom.xml
+++ /dev/null
@@ -1,168 +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.specs</groupId>
-        <artifactId>specs</artifactId>
-        <version>2.1.0</version>
-    </parent>
-
-    <groupId>org.apache.servicemix.specs</groupId>
-    <artifactId>org.apache.servicemix.specs.stax-api-1.2</artifactId>
-    <packaging>bundle</packaging>
-    <version>2.1.0</version>
-    <name>Apache ServiceMix :: Specs :: Stax API 1.2</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-stax-api_1.2_spec</artifactId>
-            <version>1.0</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Description>${project.description}</Bundle-Description>
-                        <Export-Package>javax.xml.stream*;version=1.2;-split-package:=merge-first;-noimport:=true</Export-Package>
-                        <Import-Package>javax.xml.namespace;version=!,*</Import-Package>
-                        <Private-Package>org.apache.servicemix.specs.locator;-split-package:=merge-first</Private-Package>
-                        <Bundle-Activator>org.apache.servicemix.specs.locator.Activator</Bundle-Activator>
-                        <Implementation-Title>Apache ServiceMix</Implementation-Title>
-                        <Implementation-Version>${project.version}</Implementation-Version>
-                    </instructions>
-                    <unpackBundle>true</unpackBundle>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <artifactSet>
-                                <includes>
-                                    <include>org.apache.geronimo.specs:geronimo-stax-api_1.2_spec</include>
-                                    <include>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</include>
-                                </includes>
-                            </artifactSet>
-                            <filters>
-                                <filter>
-                                    <artifact>org.apache.geronimo.specs:geronimo-stax-api_1.2_spec</artifact>
-                                    <excludes>
-                                        <exclude>javax/**</exclude>
-                                    </excludes>
-                                </filter>
-                                <filter>
-                                    <artifact>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</artifact>
-                                    <excludes>
-                                        <exclude>org/**</exclude>
-                                    </excludes>
-                                </filter>
-                            </filters>
-                            <createSourcesJar>${createSourcesJar}</createSourcesJar>
-                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-                            <createDependencyReducedPom>true</createDependencyReducedPom>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>deploy</id>
-            <properties>
-                <createSourcesJar>true</createSourcesJar>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-dependency-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>unpack-sources</id>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>unpack</goal>
-                                </goals>
-                                <configuration>
-                                    <artifactItems>
-                                        <artifactItem>
-                                            <groupId>org.apache.geronimo.specs</groupId>
-                                            <artifactId>geronimo-stax-api_1.2_spec</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                        <artifactItem>
-                                            <groupId>org.apache.servicemix.specs</groupId>
-                                            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-                                            <classifier>sources</classifier>
-                                        </artifactItem>
-                                    </artifactItems>
-                                    <outputDirectory>${project.build.directory}/sources</outputDirectory>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>package</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <minmemory>128m</minmemory>
-                            <maxmemory>512m</maxmemory>
-                            <sourcepath>${project.build.directory}/sources</sourcepath>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
diff --git a/trunk/stax-api-1.2/src/main/java/javax/xml/stream/FactoryLocator.java b/trunk/stax-api-1.2/src/main/java/javax/xml/stream/FactoryLocator.java
deleted file mode 100644
index cd61b8d..0000000
--- a/trunk/stax-api-1.2/src/main/java/javax/xml/stream/FactoryLocator.java
+++ /dev/null
@@ -1,156 +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 javax.xml.stream;
-
-import java.io.InputStream;
-import java.io.File;
-import java.io.FileInputStream;
-
-import java.util.Arrays;
-import java.util.Properties;
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
-
-/*
- * Here is the beef on the finding the Factory Class
- * 
- * 1. Use the javax.xml.stream.XMLInputFactory system property. 2. Use the
- * properties file "lib/stax.properties" in the JRE directory. This
- * configuration file is in standard java.util.Properties format and contains
- * the fully qualified name of the implementation class with the key being the
- * system property defined above. 3. Use the Services API (as detailed in the
- * JAR specification), if available, to determine the classname. The Services
- * API will look for a classname in the file
- * META-INF/services/javax.xml.stream.XMLInputFactory in jars available to the
- * runtime. Platform default XMLInputFactory instance.
- * 
- * If the user provided a classloader we'll use that...if not, we'll assume the 
- * classloader of this class.
- */
-
-class FactoryLocator {
-	static Object locate(String factoryId) throws FactoryConfigurationError {
-		return locate(factoryId, null);
-	}
-
-	static Object locate(String factoryId, String[] altClassName)
-			throws FactoryConfigurationError {
-		return locate(factoryId, altClassName,
-                              Thread.currentThread().getContextClassLoader());
-	}
-
-	static Object locate(String factoryId, String[] altClassName,
-                         ClassLoader classLoader) throws FactoryConfigurationError {
-        try {
-            // If we are deployed into an OSGi environment, leverage it
-            ClassLoader cl = FactoryLocator.class.getClassLoader();
-            if (cl == null) {
-                cl = ClassLoader.getSystemClassLoader();
-            }
-            Class factoryClass = cl.loadClass(factoryId);
-            Class spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(factoryClass, factoryId);
-            if (spiClass != null) {
-                return spiClass.newInstance();
-            }
-        } catch (Throwable e) {
-        }
-
-        try {
-			String prop = System.getProperty(factoryId);
-			if (prop != null) {
-				return loadFactory(prop, classLoader);
-			}
-		} catch (Exception e) {
-		}
-
-		try {
-			String configFile = System.getProperty("java.home")
-					+ File.separator + "lib" + File.separator
-					+ "stax.properties";
-			File f = new File(configFile);
-			if (f.exists()) {
-				Properties props = new Properties();
-				props.load(new FileInputStream(f));
-				String factoryClassName = props.getProperty(factoryId);
-				return loadFactory(factoryClassName, classLoader);
-			}
-		} catch (Exception e) {
-		}
-
-		String serviceId = "META-INF/services/" + factoryId;
-		try {
-			InputStream is = null;
-
-			if (classLoader == null) {
-				is = ClassLoader.getSystemResourceAsStream(serviceId);
-			} else {
-				is = classLoader.getResourceAsStream(serviceId);
-			}
-
-			if (is != null) {
-				BufferedReader br = new BufferedReader(new InputStreamReader(
-						is, "UTF-8"));
-				String factoryClassName = br.readLine();
-				br.close();
-
-				if (factoryClassName != null && !"".equals(factoryClassName)) {
-					return loadFactory(factoryClassName, classLoader);
-				}
-			}
-		} catch (Exception ex) {
-		}
-
-		if (altClassName == null) {
-			throw new FactoryConfigurationError("Unable to locate factory for "
-					+ factoryId + ".", null);
-		}
-		return loadFactory(altClassName, classLoader);
-	}
-
-    private static Object loadFactory(String[] classNames, ClassLoader classLoader)
-            throws FactoryConfigurationError {
-        for (String className : classNames) {
-            try {
-                Class factoryClass = classLoader == null ? Class.forName(className)
-                        : classLoader.loadClass(className);
-
-                return factoryClass.newInstance();
-            } catch (Exception x) {
-            }
-        }
-        throw new FactoryConfigurationError("Requested factory "
-                + Arrays.asList(classNames).toString()
-                + " could not be instantiated");
-    }
-
-	private static Object loadFactory(String className, ClassLoader classLoader)
-			throws FactoryConfigurationError {
-		try {
-			Class factoryClass = classLoader == null ? Class.forName(className)
-					: classLoader.loadClass(className);
-
-			return factoryClass.newInstance();
-		} catch (ClassNotFoundException x) {
-			throw new FactoryConfigurationError("Requested factory "
-					+ className + " cannot be located.  Classloader ="
-					+ classLoader.toString(), x);
-		} catch (Exception x) {
-			throw new FactoryConfigurationError("Requested factory "
-					+ className + " could not be instantiated: " + x, x);
-		}
-	}
-}
diff --git a/trunk/stax-api-1.2/src/main/java/javax/xml/stream/XMLEventFactory.java b/trunk/stax-api-1.2/src/main/java/javax/xml/stream/XMLEventFactory.java
deleted file mode 100644
index b68c953..0000000
--- a/trunk/stax-api-1.2/src/main/java/javax/xml/stream/XMLEventFactory.java
+++ /dev/null
@@ -1,141 +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 javax.xml.stream;
-
-import java.util.Iterator;
-
-import javax.xml.namespace.NamespaceContext;
-import javax.xml.stream.events.ProcessingInstruction;
-import javax.xml.namespace.QName;
-import javax.xml.stream.events.Characters;
-import javax.xml.stream.events.Comment;
-import javax.xml.stream.events.DTD;
-import javax.xml.stream.events.EndElement;
-import javax.xml.stream.events.EntityDeclaration;
-import javax.xml.stream.events.Namespace;
-import javax.xml.stream.events.Attribute;
-import javax.xml.stream.events.EndDocument;
-import javax.xml.stream.events.EntityReference;
-import javax.xml.stream.events.StartDocument;
-import javax.xml.stream.events.StartElement;
-
-public abstract class XMLEventFactory {
-
-    protected XMLEventFactory() {
-    }
-
-    public static XMLEventFactory newInstance() throws FactoryConfigurationError {
-        return (XMLEventFactory)FactoryLocator.locate("javax.xml.stream.XMLEventFactory",
-                new String[] { "com.sun.xml.internal.stream.events.XMLEventFactoryImpl", "com.ibm.xml.xlxp.api.stax.XMLEventFactoryImpl" });
-    }
-
-    public static XMLEventFactory newFactory() throws FactoryConfigurationError {
-        return (XMLEventFactory)FactoryLocator.locate("javax.xml.stream.XMLEventFactory",
-                new String[] { "com.sun.xml.internal.stream.events.XMLEventFactoryImpl", "com.ibm.xml.xlxp.api.stax.XMLEventFactoryImpl" });
-    }
-
-    /**
-     * Create a new XMLEventFactory
-     *
-     * @deprecated to maintain API consistency.  All newInstance methods are
-     * replaced with corresponding newFactory methods.  The replacement
-     * newFactory(String factoryId, ClassLoader classLoader)
-     * method defines no changes in behavior from this method.
-     */
-    public static XMLEventFactory newInstance(String factoryId,
-                                              ClassLoader classLoader) throws FactoryConfigurationError {
-        return (XMLEventFactory)FactoryLocator.locate(factoryId,
-                new String[] { "com.sun.xml.internal.stream.events.XMLEventFactoryImpl", "com.ibm.xml.xlxp.api.stax.XMLEventFactoryImpl" },
-                classLoader);
-    }
-
-
-    public static XMLEventFactory newFactory(String factoryId,
-                                             ClassLoader classLoader) throws FactoryConfigurationError {
-        return (XMLEventFactory)FactoryLocator.locate(factoryId,
-                new String[] { "com.sun.xml.internal.stream.events.XMLEventFactoryImpl", "com.ibm.xml.xlxp.api.stax.XMLEventFactoryImpl" },
-                classLoader);
-    }
-
-    public abstract void setLocation(Location location);
-
-    public abstract Attribute createAttribute(QName name, String value);
-
-    public abstract Attribute createAttribute(String localName, String value);
-
-    public abstract Attribute createAttribute(String prefix,
-                                              String namespaceURI, String localName, String value);
-
-    public abstract Namespace createNamespace(String namespaceUri);
-
-    public abstract Namespace createNamespace(String prefix, String namespaceUri);
-
-    public abstract StartElement createStartElement(QName name,
-                                                    Iterator attributes, Iterator namespaces);
-
-    public abstract StartElement createStartElement(String prefix,
-                                                    String namespaceUri, String localName);
-
-    public abstract StartElement createStartElement(String prefix,
-                                                    String namespaceUri, String localName, Iterator attributes,
-                                                    Iterator namespaces);
-
-    public abstract StartElement createStartElement(String prefix,
-                                                    String namespaceUri, String localName, Iterator attributes,
-                                                    Iterator namespaces, NamespaceContext context);
-
-    public abstract EndElement createEndElement(QName name, Iterator namespaces);
-
-    public abstract EndElement createEndElement(String prefix,
-                                                String namespaceUri, String localName);
-
-    public abstract EndElement createEndElement(String prefix,
-                                                String namespaceUri, String localName, Iterator namespaces);
-
-    public abstract Characters createCharacters(String content);
-
-    public abstract Characters createCData(String content);
-
-    public abstract Characters createSpace(String content);
-
-    public abstract Characters createIgnorableSpace(String content);
-
-    public abstract StartDocument createStartDocument();
-
-    public abstract StartDocument createStartDocument(String encoding);
-
-    public abstract StartDocument createStartDocument(String encoding,
-                                                      String version);
-
-    public abstract StartDocument createStartDocument(String encoding,
-                                                      String version, boolean standalone);
-
-    public abstract EndDocument createEndDocument();
-
-    public abstract EntityReference createEntityReference(String name,
-                                                          EntityDeclaration declaration);
-
-    public abstract Comment createComment(String text);
-
-    public abstract ProcessingInstruction createProcessingInstruction(
-            String target, String data);
-
-    public abstract DTD createDTD(String dtd);
-}
\ No newline at end of file
diff --git a/trunk/stax-api-1.2/src/main/java/javax/xml/stream/XMLInputFactory.java b/trunk/stax-api-1.2/src/main/java/javax/xml/stream/XMLInputFactory.java
deleted file mode 100644
index f4348ea..0000000
--- a/trunk/stax-api-1.2/src/main/java/javax/xml/stream/XMLInputFactory.java
+++ /dev/null
@@ -1,149 +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 javax.xml.stream;
-
-import javax.xml.stream.util.XMLEventAllocator;
-
-public abstract class XMLInputFactory {
-    public static final java.lang.String ALLOCATOR = "javax.xml.stream.allocator";
-    public static final java.lang.String IS_COALESCING = "javax.xml.stream.isCoalescing";
-    public static final java.lang.String IS_NAMESPACE_AWARE = "javax.xml.stream.isNamespaceAware";
-    public static final java.lang.String IS_REPLACING_ENTITY_REFERENCES = "javax.xml.stream.isReplacingEntityReferences";
-    public static final java.lang.String IS_SUPPORTING_EXTERNAL_ENTITIES = "javax.xml.stream.isSupportingExternalEntities";
-    public static final java.lang.String IS_VALIDATING = "javax.xml.stream.isValidating";
-    public static final java.lang.String REPORTER = "javax.xml.stream.reporter";
-    public static final java.lang.String RESOLVER = "javax.xml.stream.resolver";
-    public static final java.lang.String SUPPORT_DTD = "javax.xml.stream.supportDTD";
-
-    protected XMLInputFactory() {
-    }
-
-    public static XMLInputFactory newInstance()
-            throws FactoryConfigurationError {
-        // We'll assume the XMLInputFactory from the RI as a backup.
-        return (XMLInputFactory)FactoryLocator.locate("javax.xml.stream.XMLInputFactory",
-                new String[] { "com.sun.xml.internal.stream.XMLInputFactoryImpl", "com.ibm.xml.xlxp.api.stax.XMLInputFactoryImpl" });
-    }
-
-    public static XMLInputFactory newFactory()
-            throws FactoryConfigurationError {
-        // We'll assume the XMLInputFactory from the RI as a backup.
-        return (XMLInputFactory)FactoryLocator.locate("javax.xml.stream.XMLInputFactory",
-                new String[] { "com.sun.xml.internal.stream.XMLInputFactoryImpl", "com.ibm.xml.xlxp.api.stax.XMLInputFactoryImpl" });
-    }
-
-
-    /**
-     * Create a new XMLInputFactory
-     *
-     * @deprecated to maintain API consistency.  All newInstance methods are
-     * replaced with corresponding newFactory methods.  The replacement
-     * newFactory(String factoryId, ClassLoader classLoader)
-     * method defines no changes in behavior from this method.
-     */
-    public static XMLInputFactory newInstance(java.lang.String factoryId,
-                                              java.lang.ClassLoader classLoader) throws FactoryConfigurationError {
-        // We'll assume the XMLInputFactory from the RI as a backup.
-        return (XMLInputFactory)FactoryLocator.locate(factoryId,
-                new String[] { "com.sun.xml.internal.stream.XMLInputFactoryImpl", "com.ibm.xml.xlxp.api.stax.XMLInputFactoryImpl" },
-                classLoader);
-    }
-
-
-    public static XMLInputFactory newFactory(java.lang.String factoryId,
-                                             java.lang.ClassLoader classLoader) throws FactoryConfigurationError {
-        // We'll assume the XMLInputFactory from the RI as a backup.
-        return (XMLInputFactory)FactoryLocator.locate(factoryId,
-                new String[] { "com.sun.xml.internal.stream.XMLInputFactoryImpl", "com.ibm.xml.xlxp.api.stax.XMLInputFactoryImpl" },
-                classLoader);
-    }
-
-    public abstract XMLStreamReader createXMLStreamReader(java.io.Reader reader)
-            throws XMLStreamException;
-
-    public abstract XMLStreamReader createXMLStreamReader(
-            javax.xml.transform.Source source) throws XMLStreamException;
-
-    public abstract XMLStreamReader createXMLStreamReader(
-            java.io.InputStream stream) throws XMLStreamException;
-
-    public abstract XMLStreamReader createXMLStreamReader(
-            java.io.InputStream stream, java.lang.String encoding)
-            throws XMLStreamException;
-
-    public abstract XMLStreamReader createXMLStreamReader(
-            java.lang.String systemId, java.io.InputStream stream)
-            throws XMLStreamException;
-
-    public abstract XMLStreamReader createXMLStreamReader(
-            java.lang.String systemId, java.io.Reader reader)
-            throws XMLStreamException;
-
-    public abstract XMLEventReader createXMLEventReader(java.io.Reader reader)
-            throws XMLStreamException;
-
-    public abstract XMLEventReader createXMLEventReader(
-            java.lang.String systemId, java.io.Reader reader)
-            throws XMLStreamException;
-
-    public abstract XMLEventReader createXMLEventReader(XMLStreamReader reader)
-            throws XMLStreamException;
-
-    public abstract XMLEventReader createXMLEventReader(
-            javax.xml.transform.Source source) throws XMLStreamException;
-
-    public abstract XMLEventReader createXMLEventReader(
-            java.io.InputStream stream) throws XMLStreamException;
-
-    public abstract XMLEventReader createXMLEventReader(
-            java.io.InputStream stream, java.lang.String encoding)
-            throws XMLStreamException;
-
-    public abstract XMLEventReader createXMLEventReader(
-            java.lang.String systemId, java.io.InputStream stream)
-            throws XMLStreamException;
-
-    public abstract XMLStreamReader createFilteredReader(
-            XMLStreamReader reader, StreamFilter filter)
-            throws XMLStreamException;
-
-    public abstract XMLEventReader createFilteredReader(XMLEventReader reader,
-                                                        EventFilter filter) throws XMLStreamException;
-
-    public abstract XMLResolver getXMLResolver();
-
-    public abstract void setXMLResolver(XMLResolver resolver);
-
-    public abstract XMLReporter getXMLReporter();
-
-    public abstract void setXMLReporter(XMLReporter reporter);
-
-    public abstract void setProperty(java.lang.String name,
-                                     java.lang.Object value) throws java.lang.IllegalArgumentException;
-
-    public abstract java.lang.Object getProperty(java.lang.String name)
-            throws java.lang.IllegalArgumentException;
-
-    public abstract boolean isPropertySupported(java.lang.String name);
-
-    public abstract void setEventAllocator(XMLEventAllocator allocator);
-
-    public abstract XMLEventAllocator getEventAllocator();
-}
\ No newline at end of file
diff --git a/trunk/stax-api-1.2/src/main/java/javax/xml/stream/XMLOutputFactory.java b/trunk/stax-api-1.2/src/main/java/javax/xml/stream/XMLOutputFactory.java
deleted file mode 100644
index 8d4753f..0000000
--- a/trunk/stax-api-1.2/src/main/java/javax/xml/stream/XMLOutputFactory.java
+++ /dev/null
@@ -1,104 +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 javax.xml.stream;
-
-public abstract class XMLOutputFactory {
-    public static final String IS_REPAIRING_NAMESPACES = "javax.xml.stream.isRepairingNamespaces";
-
-    protected XMLOutputFactory() { }
-
-    public static XMLOutputFactory newInstance() throws FactoryConfigurationError {
-        return (XMLOutputFactory) FactoryLocator.locate("javax.xml.stream.XMLOutputFactory",
-                new String[] { "com.sun.xml.internal.stream.XMLOutputFactoryImpl", "com.ibm.xml.xlxp.api.stax.XMLOutputFactoryImpl" });
-    }
-
-    /**
-     * Create a new XMLOutputFactory
-     *
-     * @deprecated This method has been deprecated because
-     * it returns an instance of XMLInputFactory, which is of the
-     * wrong class.  Use the new method
-     * newFactory(java.lang.String factoryId,java.lang.ClassLoader classLoader)
-     * instead.
-     */
-    public static XMLInputFactory newInstance(String factoryId,
-                                              java.lang.ClassLoader classLoader) throws FactoryConfigurationError {
-        return (XMLInputFactory) FactoryLocator.locate(factoryId,
-                new String[] { "com.sun.xml.internal.stream.XMLOutputFactoryImpl", "com.ibm.xml.xlxp.api.stax.XMLOutputFactoryImpl" }, classLoader);
-
-    }
-
-
-    /**
-     * Create a new XMLOutputFactory
-     *
-     * This is the replacement for the deprecated newInstance() method
-     */
-    public static XMLOutputFactory newFactory()	throws FactoryConfigurationError {
-        return (XMLOutputFactory) FactoryLocator.locate("javax.xml.stream.XMLOutputFactory",
-                new String[] { "com.sun.xml.internal.stream.XMLOutputFactoryImpl", "com.ibm.xml.xlxp.api.stax.XMLOutputFactoryImpl" });
-    }
-
-    /**
-     * Create a new XMLOutputFactory
-     *
-     * This is the replacement for the deprecated newInstance() method
-     */
-    public static XMLOutputFactory newFactory(String factoryId,	ClassLoader classLoader)
-            throws FactoryConfigurationError {
-        // essentially the same thing as deprecated newInstance(), but the correct return type.
-        return (XMLOutputFactory) FactoryLocator.locate(factoryId,
-                new String[] { "com.sun.xml.internal.stream.XMLOutputFactoryImpl", "com.ibm.xml.xlxp.api.stax.XMLOutputFactoryImpl" }, classLoader);
-    }
-
-    public abstract XMLStreamWriter createXMLStreamWriter(java.io.Writer stream)
-            throws XMLStreamException;
-
-    public abstract XMLStreamWriter createXMLStreamWriter(
-            java.io.OutputStream stream) throws XMLStreamException;
-
-    public abstract XMLStreamWriter createXMLStreamWriter(
-            java.io.OutputStream stream, String encoding)
-            throws XMLStreamException;
-
-    public abstract XMLStreamWriter createXMLStreamWriter(
-            javax.xml.transform.Result result) throws XMLStreamException;
-
-    public abstract XMLEventWriter createXMLEventWriter(
-            javax.xml.transform.Result result) throws XMLStreamException;
-
-    public abstract XMLEventWriter createXMLEventWriter(
-            java.io.OutputStream stream) throws XMLStreamException;
-
-    public abstract XMLEventWriter createXMLEventWriter(
-            java.io.OutputStream stream, String encoding)
-            throws XMLStreamException;
-
-    public abstract XMLEventWriter createXMLEventWriter(java.io.Writer stream)
-            throws XMLStreamException;
-
-    public abstract void setProperty(String name, Object value)
-            throws IllegalArgumentException;
-
-    public abstract Object getProperty(String name)
-            throws IllegalArgumentException;
-
-    public abstract boolean isPropertySupported(String name);
-}
\ No newline at end of file
