diff --git a/geronimo-jaxrs_1.1_spec/LICENSE b/geronimo-jaxrs_1.1_spec/LICENSE
deleted file mode 100644
index 75b5248..0000000
--- a/geronimo-jaxrs_1.1_spec/LICENSE
+++ /dev/null
@@ -1,202 +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/geronimo-jaxrs_1.1_spec/NOTICE b/geronimo-jaxrs_1.1_spec/NOTICE
deleted file mode 100644
index 36da19c..0000000
--- a/geronimo-jaxrs_1.1_spec/NOTICE
+++ /dev/null
@@ -1,5 +0,0 @@
-Apache Geronimo JAX-RS 1.1 API
-Copyright 2010 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
diff --git a/geronimo-jaxrs_1.1_spec/pom.xml b/geronimo-jaxrs_1.1_spec/pom.xml
deleted file mode 100644
index e9b0086..0000000
--- a/geronimo-jaxrs_1.1_spec/pom.xml
+++ /dev/null
@@ -1,86 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
--->
-
-<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">
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.geronimo.genesis</groupId>
-        <artifactId>genesis-java5-flava</artifactId>
-        <version>2.0</version>
-    </parent>
-
-    <groupId>org.apache.geronimo.specs</groupId>
-    <artifactId>geronimo-jaxrs_1.1_spec</artifactId>
-    <packaging>bundle</packaging>
-    <name>Apache Geronimo JAX-RS 1.1 API</name>
-    <version>1.0</version>
-    <description>Java API for RESTful Web Services 1.1</description>
-
-    <url>http://geronimo.apache.org/maven/${siteId}/${version}</url>
-    <distributionManagement>
-        <site>
-            <id>apache-website</id>
-            <url>${site.deploy.url}/maven/${siteId}/${version}</url>
-        </site>
-    </distributionManagement>
-
-    <properties>
-        <siteId>specs/${artifactId}</siteId>
-    </properties>
-
-    <scm>
-        <connection>scm:svn:http://svn.apache.org/repos/asf/geronimo/specs/tags/geronimo-jaxrs_1.1_spec-1.0</connection>
-        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/geronimo/specs/tags/geronimo-jaxrs_1.1_spec-1.0</developerConnection>
-        <url>http://svn.apache.org/viewcvs.cgi/geronimo/specs/tags/geronimo-jaxrs_1.1_spec-1.0</url>
-    </scm>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-osgi-locator</artifactId>
-            <version>1.0</version>
-            <scope>provided</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${groupId}.${artifactId};singleton=true</Bundle-SymbolicName>
-                        <Specification-Title>JSR-311 Java RESTful Web Services 1.1</Specification-Title>
-                        <Specification-Vendor>Sun Microsystems, Inc.</Specification-Vendor>
-                        <Specification-Version>1.1</Specification-Version>
-                        <Export-Package>javax.ws.rs*;version=1.1</Export-Package>
-                        <Import-Package>org.apache.geronimo.osgi.registry.api;resolution:=optional,*</Import-Package>
-                        <Private-Package>org.apache.geronimo.osgi.locator</Private-Package>
-                        <Bundle-Activator>org.apache.geronimo.osgi.locator.Activator</Bundle-Activator>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/ApplicationPath.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/ApplicationPath.java
deleted file mode 100644
index 2764a58..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/ApplicationPath.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.ws.rs;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target(value = ElementType.TYPE)
-@Retention(value = RetentionPolicy.RUNTIME)
-public @interface ApplicationPath {
-
-    public String value();
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/Consumes.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/Consumes.java
deleted file mode 100644
index d66b281..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/Consumes.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.ws.rs;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Inherited
-@Target(value = {ElementType.TYPE, ElementType.METHOD})
-@Retention(value = RetentionPolicy.RUNTIME)
-public @interface Consumes {
-
-    String[] value() default "*/*";
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/CookieParam.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/CookieParam.java
deleted file mode 100644
index 87c7cf0..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/CookieParam.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.ws.rs;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target(value = {ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD})
-@Retention(value = RetentionPolicy.RUNTIME)
-public @interface CookieParam {
-    String value();
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/DELETE.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/DELETE.java
deleted file mode 100644
index 3de72f9..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/DELETE.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.ws.rs;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target(value = ElementType.METHOD)
-@Retention(value = RetentionPolicy.RUNTIME)
-@HttpMethod(value = "DELETE")
-public @interface DELETE {
-
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/DefaultValue.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/DefaultValue.java
deleted file mode 100644
index f465100..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/DefaultValue.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.ws.rs;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target(value = {ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD})
-@Retention(value = RetentionPolicy.RUNTIME)
-public @interface DefaultValue {
-    String value();
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/Encoded.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/Encoded.java
deleted file mode 100644
index d418d2a..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/Encoded.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.ws.rs;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target(value = {ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD,
-                 ElementType.CONSTRUCTOR, ElementType.TYPE})
-@Retention(value = RetentionPolicy.RUNTIME)
-@Documented
-public @interface Encoded {
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/FormParam.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/FormParam.java
deleted file mode 100644
index acefe46..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/FormParam.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.ws.rs;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target(value = {ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD})
-@Retention(value = RetentionPolicy.RUNTIME)
-public @interface FormParam {
-    String value();
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/GET.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/GET.java
deleted file mode 100644
index 1df22c8..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/GET.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.ws.rs;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target(value = ElementType.METHOD)
-@Retention(value = RetentionPolicy.RUNTIME)
-@HttpMethod(value = "GET")
-public @interface GET {
-
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/HEAD.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/HEAD.java
deleted file mode 100644
index 3c01997..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/HEAD.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.ws.rs;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target(value = ElementType.METHOD)
-@Retention(value = RetentionPolicy.RUNTIME)
-@HttpMethod(value = "HEAD")
-public @interface HEAD {
-
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/HeaderParam.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/HeaderParam.java
deleted file mode 100644
index aa00910..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/HeaderParam.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.ws.rs;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target(value = {ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD})
-@Retention(value = RetentionPolicy.RUNTIME)
-@Documented
-public @interface HeaderParam {
-    String value();
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/HttpMethod.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/HttpMethod.java
deleted file mode 100644
index 9ed5b50..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/HttpMethod.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.ws.rs;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target(value = ElementType.ANNOTATION_TYPE)
-@Retention(value = RetentionPolicy.RUNTIME)
-@Documented
-public @interface HttpMethod {
-    public static final String DELETE  = "DELETE";
-    public static final String GET     = "GET";
-    public static final String HEAD    = "HEAD";
-    public static final String POST    = "POST";
-    public static final String PUT     = "PUT";
-    public static final String OPTIONS = "OPTIONS";
-
-    String value();
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/MatrixParam.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/MatrixParam.java
deleted file mode 100644
index 78f27e3..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/MatrixParam.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.ws.rs;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target(value = {ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD})
-@Retention(value = RetentionPolicy.RUNTIME)
-public @interface MatrixParam {
-    String value();
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/OPTIONS.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/OPTIONS.java
deleted file mode 100644
index 72d01c6..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/OPTIONS.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.ws.rs;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target(value = ElementType.METHOD)
-@Retention(value = RetentionPolicy.RUNTIME)
-@HttpMethod(value = "OPTIONS")
-public @interface OPTIONS {
-
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/POST.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/POST.java
deleted file mode 100644
index 49fc58a..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/POST.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.ws.rs;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target(value = ElementType.METHOD)
-@Retention(value = RetentionPolicy.RUNTIME)
-@HttpMethod(value = "POST")
-public @interface POST {
-
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/PUT.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/PUT.java
deleted file mode 100644
index 0378f50..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/PUT.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.ws.rs;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target(value = ElementType.METHOD)
-@Retention(value = RetentionPolicy.RUNTIME)
-@HttpMethod(value = "PUT")
-public @interface PUT {
-
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/Path.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/Path.java
deleted file mode 100644
index fac2be4..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/Path.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.ws.rs;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target(value = {ElementType.TYPE, ElementType.METHOD})
-@Retention(value = RetentionPolicy.RUNTIME)
-public @interface Path {
-    String value();
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/PathParam.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/PathParam.java
deleted file mode 100644
index 0ab5355..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/PathParam.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.ws.rs;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target(value = {ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD})
-@Retention(value = RetentionPolicy.RUNTIME)
-public @interface PathParam {
-    String value();
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/Produces.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/Produces.java
deleted file mode 100644
index 8bd18e8..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/Produces.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.ws.rs;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Inherited
-@Target(value = {ElementType.TYPE, ElementType.METHOD})
-@Retention(value = RetentionPolicy.RUNTIME)
-public @interface Produces {
-    String[] value() default "*/*";
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/QueryParam.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/QueryParam.java
deleted file mode 100644
index beb1ce1..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/QueryParam.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.ws.rs;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target(value = {ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD})
-@Retention(value = RetentionPolicy.RUNTIME)
-public @interface QueryParam {
-    String value();
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/WebApplicationException.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/WebApplicationException.java
deleted file mode 100644
index f6ccd13..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/WebApplicationException.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES 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;
-
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.Status;
-
-public class WebApplicationException extends RuntimeException {
-
-    private static final long serialVersionUID = 11660101L;
-
-    private final Response    response;
-
-    public WebApplicationException() {
-        this(Status.INTERNAL_SERVER_ERROR);
-    }
-
-    public WebApplicationException(int status) {
-        response = Response.status(status).build();
-    }
-
-    public WebApplicationException(Response.Status status) {
-        response = Response.status(status).build();
-    }
-
-    public WebApplicationException(Response response) {
-        this.response = response;
-    }
-
-    public WebApplicationException(Throwable cause) {
-        this(cause, Status.INTERNAL_SERVER_ERROR);
-    }
-
-    public WebApplicationException(Throwable cause, int status) {
-        super(cause);
-        response = Response.status(status).build();
-    }
-
-    public WebApplicationException(Throwable cause, Response.Status status) {
-        super(cause);
-        response = Response.status(status).build();
-    }
-
-    public WebApplicationException(Throwable cause, Response response) {
-        super(cause);
-        this.response = response;
-    }
-
-    public Response getResponse() {
-        return response;
-    }
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/Application.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/Application.java
deleted file mode 100644
index 41ea71d..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/Application.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.ws.rs.core;
-
-import java.util.Collections;
-import java.util.Set;
-
-public class Application {
-
-    public Set<java.lang.Class<?>> getClasses() {
-        return Collections.emptySet();
-    }
-
-    public Set<Object> getSingletons() {
-        return Collections.emptySet();
-    }
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/CacheControl.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/CacheControl.java
deleted file mode 100644
index 971356d..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/CacheControl.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES 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.core;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.ws.rs.ext.RuntimeDelegate;
-import javax.ws.rs.ext.RuntimeDelegate.HeaderDelegate;
-
-public class CacheControl {
-
-    private int                 maxAge          = -1;
-    private int                 sMaxAge         = -1;
-    private boolean             isPrivate       = false;
-    private boolean             noCache         = false;
-    private boolean             noStore         = false;
-    private boolean             noTransform     = true;
-    private boolean             mustRevalidate  = false;
-    private boolean             proxyRevalidate = false;
-    private Map<String, String> cacheExtensions = null;
-    private List<String>        noCacheFields   = null;
-    private List<String>        privateFields   = null;
-
-    public CacheControl() {
-        /* do nothing */
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj == this) {
-            return true;
-        }
-
-        /*
-         * TODO: should the check be for instanceof or for getClass()? this
-         * class is not final so checking instanceof for now.
-         */
-        if (!(obj instanceof CacheControl)) {
-            return false;
-        }
-
-        CacheControl other = (CacheControl)obj;
-
-        if (isPrivate != other.isPrivate()) {
-            return false;
-        }
-
-        if (noCache != other.isNoCache()) {
-            return false;
-        }
-
-        if (noStore != other.isNoStore()) {
-            return false;
-        }
-
-        if (noTransform != other.isNoTransform()) {
-            return false;
-        }
-
-        if (mustRevalidate != other.isMustRevalidate()) {
-            return false;
-        }
-
-        if (proxyRevalidate != other.isProxyRevalidate()) {
-            return false;
-        }
-
-        if (maxAge != other.getMaxAge()) {
-            return false;
-        }
-
-        if (sMaxAge != other.getSMaxAge()) {
-            return false;
-        }
-
-        if (!getCacheExtension().equals(other.getCacheExtension())) {
-            return false;
-        }
-
-        if (!getPrivateFields().equals(other.getPrivateFields())) {
-            return false;
-        }
-
-        if (!getNoCacheFields().equals(other.getNoCacheFields())) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = 17;
-        result = 31 * result + maxAge;
-        result = 31 * result + sMaxAge;
-        result = 31 * result + ((isPrivate) ? 1 : 0);
-        result = 31 * result + ((noCache) ? 1 : 0);
-        result = 31 * result + ((noStore) ? 1 : 0);
-        result = 31 * result + ((noTransform) ? 1 : 0);
-        result = 31 * result + ((mustRevalidate) ? 1 : 0);
-        result = 31 * result + ((proxyRevalidate) ? 1 : 0);
-        result = 31 * result + getCacheExtension().hashCode();
-        result = 31 * result + getNoCacheFields().hashCode();
-        result = 31 * result + getPrivateFields().hashCode();
-        return result;
-    }
-
-    public Map<String, String> getCacheExtension() {
-        if (cacheExtensions == null) {
-            cacheExtensions = new HashMap<String, String>();
-        }
-        return cacheExtensions;
-    }
-
-    public int getMaxAge() {
-        return maxAge;
-    }
-
-    public List<String> getNoCacheFields() {
-        if (noCacheFields == null) {
-            noCacheFields = new ArrayList<String>();
-        }
-        return noCacheFields;
-    }
-
-    public List<String> getPrivateFields() {
-        if (privateFields == null) {
-            privateFields = new ArrayList<String>();
-        }
-        return privateFields;
-    }
-
-    public int getSMaxAge() {
-        return sMaxAge;
-    }
-
-    public boolean isMustRevalidate() {
-        return mustRevalidate;
-    }
-
-    public boolean isNoCache() {
-        return noCache;
-    }
-
-    public boolean isNoStore() {
-        return noStore;
-    }
-
-    public boolean isNoTransform() {
-        return noTransform;
-    }
-
-    public boolean isPrivate() {
-        return isPrivate;
-    }
-
-    public boolean isProxyRevalidate() {
-        return proxyRevalidate;
-    }
-
-    public void setMaxAge(int maxAge) {
-        this.maxAge = maxAge;
-    }
-
-    public void setMustRevalidate(boolean mustRevalidate) {
-        this.mustRevalidate = mustRevalidate;
-    }
-
-    public void setNoCache(boolean noCache) {
-        this.noCache = noCache;
-    }
-
-    public void setNoStore(boolean noStore) {
-        this.noStore = noStore;
-    }
-
-    public void setNoTransform(boolean noTransform) {
-        this.noTransform = noTransform;
-    }
-
-    public void setPrivate(boolean isPrivate) {
-        this.isPrivate = isPrivate;
-    }
-
-    public void setProxyRevalidate(boolean proxyRevalidate) {
-        this.proxyRevalidate = proxyRevalidate;
-    }
-
-    public void setSMaxAge(int sMaxAge) {
-        this.sMaxAge = sMaxAge;
-    }
-
-    private final static HeaderDelegate<CacheControl> headerDelegate =
-                                                                         RuntimeDelegate
-                                                                             .getInstance()
-                                                                             .createHeaderDelegate(CacheControl.class);
-
-    @Override
-    public String toString() {
-        return headerDelegate.toString(this);
-    }
-
-    public static CacheControl valueOf(String value) {
-        return headerDelegate.fromString(value);
-    }
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/Context.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/Context.java
deleted file mode 100644
index b9a65a4..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/Context.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.ws.rs.core;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target(value = {ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD})
-@Retention(value = RetentionPolicy.RUNTIME)
-@Documented
-public @interface Context {
-
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/Cookie.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/Cookie.java
deleted file mode 100644
index 92b9113..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/Cookie.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.    
- */
-
-package javax.ws.rs.core;
-
-import javax.ws.rs.ext.RuntimeDelegate;
-import javax.ws.rs.ext.RuntimeDelegate.HeaderDelegate;
-
-public class Cookie {
-
-    public static final int DEFAULT_VERSION = 1;
-
-    private final String    name;
-    private final String    value;
-    private final String    path;
-    private final String    domain;
-    private final int       version;
-
-    public Cookie(String name, String value) {
-        this(name, value, null, null);
-    }
-
-    public Cookie(String name, String value, String path, String domain) {
-        this(name, value, path, domain, DEFAULT_VERSION);
-    }
-
-    public Cookie(String name, String value, String path, String domain, int version) {
-        if (name == null) {
-            throw new IllegalArgumentException();
-        }
-        this.name = name;
-        this.value = value;
-        this.path = path;
-        this.domain = domain;
-        this.version = version;
-    }
-
-    @Override
-    public boolean equals(java.lang.Object obj) {
-        if (this == obj) {
-            return true;
-        }
-
-        if (obj == null) {
-            return false;
-        }
-
-        // note that this must be a Cookie exactly
-        if (getClass() != obj.getClass()) {
-            return false;
-        }
-
-        Cookie other = (Cookie)obj;
-        if (!name.equals(other.name)) {
-            return false;
-        }
-
-        if (version != other.version) {
-            return false;
-        }
-
-        if (value == null) {
-            if (other.value != null) {
-                return false;
-            }
-        } else {
-            if (!value.equals(other.value)) {
-                return false;
-            }
-        }
-
-        if (path == null) {
-            if (other.path != null) {
-                return false;
-            }
-        } else {
-            if (!path.equals(other.path)) {
-                return false;
-            }
-        }
-
-        if (domain == null) {
-            if (other.domain != null) {
-                return false;
-            }
-        } else {
-            if (!domain.equals(other.domain)) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = 17;
-        result = 31 * result + name.hashCode();
-        result = 31 * result + ((value == null) ? 0 : value.hashCode());
-        result = 31 * result + ((path == null) ? 0 : path.hashCode());
-        result = 31 * result + ((domain == null) ? 0 : domain.hashCode());
-        result = 31 * result + version;
-        return result;
-    }
-
-    public String getDomain() {
-        return domain;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public String getValue() {
-        return value;
-    }
-
-    public int getVersion() {
-        return version;
-    }
-
-    private static final HeaderDelegate<Cookie> headerDelegate =
-                                                                   RuntimeDelegate
-                                                                       .getInstance()
-                                                                       .createHeaderDelegate(Cookie.class);
-
-    @Override
-    public String toString() {
-        return headerDelegate.toString(this);
-    }
-
-    public static Cookie valueOf(String value) {
-        return headerDelegate.fromString(value);
-    }
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/EntityTag.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/EntityTag.java
deleted file mode 100644
index fcda5a2..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/EntityTag.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES 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.core;
-
-import javax.ws.rs.ext.RuntimeDelegate;
-import javax.ws.rs.ext.RuntimeDelegate.HeaderDelegate;
-
-public class EntityTag {
-    private final boolean isWeak;
-    private final String  value;
-
-    public EntityTag(String value) {
-        this(value, false);
-    }
-
-    public EntityTag(String value, boolean weak) {
-        if (value == null) {
-            throw new IllegalArgumentException();
-        }
-        this.value = value;
-        this.isWeak = weak;
-    }
-
-    @Override
-    public boolean equals(java.lang.Object obj) {
-        if (this == obj) {
-            return true;
-        }
-
-        if (!(obj instanceof EntityTag)) {
-            return false;
-        }
-
-        EntityTag other = (EntityTag)obj;
-        if (isWeak != other.isWeak()) {
-            return false;
-        }
-
-        if (!value.equals(other.getValue())) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = 17;
-        result = 31 * result + ((isWeak) ? 1 : 0);
-        result = 31 * result + ((value == null) ? 0 : value.hashCode());
-        return result;
-    }
-
-    public String getValue() {
-        return value;
-    }
-
-    public boolean isWeak() {
-        return isWeak;
-    }
-
-    private static final HeaderDelegate<EntityTag> headerDelegate =
-                                                                      RuntimeDelegate
-                                                                          .getInstance()
-                                                                          .createHeaderDelegate(EntityTag.class);
-
-    @Override
-    public String toString() {
-        return headerDelegate.toString(this);
-    }
-
-    public static EntityTag valueOf(String value) {
-        return headerDelegate.fromString(value);
-    }
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/GenericEntity.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/GenericEntity.java
deleted file mode 100644
index 11c4b8e..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/GenericEntity.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 javax.ws.rs.core;
-
-import java.lang.reflect.GenericArrayType;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-
-public class GenericEntity<T> {
-    private final T    entity;
-    private final Type genericType;
-
-    protected GenericEntity(T entity) {
-        if (entity == null) {
-            throw new IllegalArgumentException();
-        }
-        this.entity = entity;
-
-        Type superclass = this.getClass().getGenericSuperclass();
-        this.genericType = ((ParameterizedType)superclass).getActualTypeArguments()[0];
-
-        // TODO: what if the user extends their GenericEntity superclass?
-    }
-
-    public GenericEntity(T entity, Type genericType) {
-        if (entity == null) {
-            throw new IllegalArgumentException();
-        }
-
-        if (genericType == null) {
-            throw new IllegalArgumentException();
-        }
-
-        checkCompatibility(entity.getClass(), genericType);
-        this.entity = entity;
-        this.genericType = genericType;
-    }
-
-    private void checkCompatibility(Class<?> rawType, Type genericType) {
-        if (genericType instanceof Class<?>) {
-            if (!((Class<?>)genericType).isAssignableFrom(rawType)) {
-                throw new IllegalArgumentException();
-            }
-        } else if (genericType instanceof ParameterizedType) {
-            checkCompatibility(rawType, ((ParameterizedType)genericType).getRawType());
-        } else if (genericType instanceof GenericArrayType) {
-            if (!rawType.isArray()) {
-                throw new IllegalArgumentException();
-            }
-            // check the array parameter
-            checkCompatibility(rawType.getComponentType(), ((GenericArrayType)genericType)
-                .getGenericComponentType());
-        }
-    }
-
-    public final T getEntity() {
-        return entity;
-    }
-
-    public final Class<?> getRawType() {
-        return entity.getClass();
-    }
-
-    public final Type getType() {
-        return genericType;
-    }
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/HttpHeaders.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/HttpHeaders.java
deleted file mode 100644
index 97f0752..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/HttpHeaders.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.ws.rs.core;
-
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-public interface HttpHeaders {
-    public static final String ACCEPT              = "Accept";
-    public static final String ACCEPT_CHARSET      = "Accept-Charset";
-    public static final String ACCEPT_ENCODING     = "Accept-Encoding";
-    public static final String ACCEPT_LANGUAGE     = "Accept-Language";
-    public static final String AUTHORIZATION       = "Authorization";
-    public static final String CACHE_CONTROL       = "Cache-Control";
-    public static final String CONTENT_ENCODING    = "Content-Encoding";
-    public static final String CONTENT_LANGUAGE    = "Content-Language";
-    public static final String CONTENT_LENGTH      = "Content-Length";
-    public static final String CONTENT_LOCATION    = "Content-Location";
-    public static final String CONTENT_TYPE        = "Content-Type";
-    public static final String COOKIE              = "Cookie";
-    public static final String DATE                = "Date";
-    public static final String ETAG                = "ETag";
-    public static final String EXPIRES             = "Expires";
-    public static final String HOST                = "Host";
-    public static final String IF_MATCH            = "If-Match";
-    public static final String IF_MODIFIED_SINCE   = "If-Modified-Since";
-    public static final String IF_NONE_MATCH       = "If-None-Match";
-    public static final String IF_UNMODIFIED_SINCE = "If-Unmodified-Since";
-    public static final String LAST_MODIFIED       = "Last-Modified";
-    public static final String LOCATION            = "Location";
-    public static final String SET_COOKIE          = "Set-Cookie";
-    public static final String USER_AGENT          = "User-Agent";
-    public static final String VARY                = "Vary";
-    public static final String WWW_AUTHENTICATE    = "WWW-Authenticate";
-
-    public List<Locale> getAcceptableLanguages();
-
-    public List<MediaType> getAcceptableMediaTypes();
-
-    public Map<String, Cookie> getCookies();
-
-    public Locale getLanguage();
-
-    public MediaType getMediaType();
-
-    public List<String> getRequestHeader(String name);
-
-    public MultivaluedMap<String, String> getRequestHeaders();
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/MediaType.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/MediaType.java
deleted file mode 100644
index b2863cb..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/MediaType.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.ws.rs.core;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Map;
-import java.util.TreeMap;
-
-import javax.ws.rs.ext.RuntimeDelegate;
-import javax.ws.rs.ext.RuntimeDelegate.HeaderDelegate;
-
-public class MediaType {
-    public static final String                     APPLICATION_ATOM_XML             =
-                                                                                        "application/atom+xml";
-
-    public static final MediaType                  APPLICATION_ATOM_XML_TYPE        =
-                                                                                        new MediaType(
-                                                                                                      "application",
-                                                                                                      "atom+xml");
-    public static final String                     APPLICATION_FORM_URLENCODED      =
-                                                                                        "application/x-www-form-urlencoded";
-    public static final MediaType                  APPLICATION_FORM_URLENCODED_TYPE =
-                                                                                        new MediaType(
-                                                                                                      "application",
-                                                                                                      "x-www-form-urlencoded");
-    public static final String                     APPLICATION_JSON                 =
-                                                                                        "application/json";
-    public static final MediaType                  APPLICATION_JSON_TYPE            =
-                                                                                        new MediaType(
-                                                                                                      "application",
-                                                                                                      "json");
-    public static final String                     APPLICATION_OCTET_STREAM         =
-                                                                                        "application/octet-stream";
-    public static final MediaType                  APPLICATION_OCTET_STREAM_TYPE    =
-                                                                                        new MediaType(
-                                                                                                      "application",
-                                                                                                      "octet-stream");
-    public static final String                     APPLICATION_SVG_XML              =
-                                                                                        "application/svg+xml";
-    public static final MediaType                  APPLICATION_SVG_XML_TYPE         =
-                                                                                        new MediaType(
-                                                                                                      "application",
-                                                                                                      "svg+xml");
-    public static final String                     APPLICATION_XHTML_XML            =
-                                                                                        "application/xhtml+xml";
-    public static final MediaType                  APPLICATION_XHTML_XML_TYPE       =
-                                                                                        new MediaType(
-                                                                                                      "application",
-                                                                                                      "xhtml+xml");
-    public static final String                     APPLICATION_XML                  =
-                                                                                        "application/xml";
-    public static final MediaType                  APPLICATION_XML_TYPE             =
-                                                                                        new MediaType(
-                                                                                                      "application",
-                                                                                                      "xml");
-    public static final String                     MEDIA_TYPE_WILDCARD              = "*";
-    public static final String                     MULTIPART_FORM_DATA              =
-                                                                                        "multipart/form-data";
-    public static final MediaType                  MULTIPART_FORM_DATA_TYPE         =
-                                                                                        new MediaType(
-                                                                                                      "multipart",
-                                                                                                      "form-data");
-    public static final String                     TEXT_HTML                        = "text/html";
-    public static final MediaType                  TEXT_HTML_TYPE                   =
-                                                                                        new MediaType(
-                                                                                                      "text",
-                                                                                                      "html");
-    public static final String                     TEXT_PLAIN                       = "text/plain";
-    public static final MediaType                  TEXT_PLAIN_TYPE                  =
-                                                                                        new MediaType(
-                                                                                                      "text",
-                                                                                                      "plain");
-    public static final String                     TEXT_XML                         = "text/xml";
-    public static final MediaType                  TEXT_XML_TYPE                    =
-                                                                                        new MediaType(
-                                                                                                      "text",
-                                                                                                      "xml");
-    public static final String                     WILDCARD                         = "*/*";
-    public static final MediaType                  WILDCARD_TYPE                    =
-                                                                                        new MediaType(
-                                                                                                      "*",
-                                                                                                      "*");
-
-    private final String                           type;
-    private final String                           subtype;
-    private final Map<String, String>              params;
-
-    private static final HeaderDelegate<MediaType> delegate                         =
-                                                                                        RuntimeDelegate
-                                                                                            .getInstance()
-                                                                                            .createHeaderDelegate(MediaType.class);
-
-    public MediaType(String type, String subtype, Map<String, String> parameters) {
-        if (type == null) {
-            this.type = MEDIA_TYPE_WILDCARD;
-        } else {
-            this.type = type;
-        }
-
-        if (subtype == null) {
-            this.subtype = MEDIA_TYPE_WILDCARD;
-        } else {
-            this.subtype = subtype;
-        }
-
-        if (parameters == null) {
-            this.params = Collections.emptyMap();
-        } else {
-            // need to use a temporary map here since for some reason the ordering is important.
-            Map<String, String> temp = new TreeMap<String, String>(new Comparator<String>() {
-                public int compare(String o1, String o2) {
-                    return o1.compareToIgnoreCase(o2);
-                }
-            });
-            // need to put in as all lower case keys for comparisons, hashcode, and output
-            for (String key : parameters.keySet()) {
-                temp.put(key.toLowerCase(), parameters.get(key));
-            }
-            this.params = Collections.unmodifiableMap(temp);
-        }
-    }
-
-    public MediaType(String type, String subtype) {
-        this(type, subtype, null);
-    }
-
-    public MediaType() {
-        this(MEDIA_TYPE_WILDCARD, MEDIA_TYPE_WILDCARD);
-    }
-
-    public static MediaType valueOf(String type) throws java.lang.IllegalArgumentException {
-        return delegate.fromString(type);
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public boolean isWildcardType() {
-        return MEDIA_TYPE_WILDCARD.equals(getType());
-    }
-
-    public String getSubtype() {
-        return subtype;
-    }
-
-    public boolean isWildcardSubtype() {
-        return MEDIA_TYPE_WILDCARD.equals(getSubtype());
-    }
-
-    public Map<String, String> getParameters() {
-        return params;
-    }
-
-    public boolean isCompatible(MediaType other) {
-        if (other == null) {
-            return false;
-        }
-        if (isWildcardType() || other.isWildcardType()) {
-            return true;
-        }
-        if (isWildcardSubtype() || other.isWildcardSubtype()) {
-            return getType().equalsIgnoreCase(other.getType());
-        }
-        return getType().equalsIgnoreCase(other.getType()) && getSubtype().equalsIgnoreCase(other
-            .getSubtype());
-    }
-
-    @Override
-    public boolean equals(java.lang.Object obj) {
-        if (this == obj) {
-            return true;
-        }
-
-        if (!(obj instanceof MediaType)) {
-            return false;
-        }
-
-        MediaType other = (MediaType)obj;
-
-        return getType().equalsIgnoreCase(other.getType()) && getSubtype().equalsIgnoreCase(other
-            .getSubtype())
-            && getParameters().equals(other.getParameters());
-    }
-
-    @Override
-    public int hashCode() {
-        int result = 17;
-        // be sure to lowercase for comparisions
-
-        // be careful about hash code. since not guaranteed that this is a final
-        // class, need to use methods. methods do not guarantee lowercase
-        result = 31 * result + getType().toLowerCase().hashCode();
-        result = 31 * result + getSubtype().toLowerCase().hashCode();
-        result = 31 * result + getParameters().hashCode();
-        return result;
-    }
-
-    @Override
-    public String toString() {
-        return delegate.toString(this);
-    }
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/MultivaluedMap.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/MultivaluedMap.java
deleted file mode 100644
index 42ff476..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/MultivaluedMap.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.ws.rs.core;
-
-import java.util.List;
-import java.util.Map;
-
-public interface MultivaluedMap<K, V> extends Map<K, List<V>> {
-    public void add(K key, V value);
-
-    public V getFirst(K key);
-
-    public void putSingle(K key, V value);
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/NewCookie.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/NewCookie.java
deleted file mode 100644
index eeff63b..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/NewCookie.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 javax.ws.rs.core;
-
-import javax.ws.rs.ext.RuntimeDelegate;
-import javax.ws.rs.ext.RuntimeDelegate.HeaderDelegate;
-
-public class NewCookie extends Cookie {
-    public static final int DEFAULT_MAX_AGE = -1;
-
-    private final String    comment;
-    private final int       maxAge;
-    private final boolean   isSecure;
-
-    public NewCookie(String name, String value) {
-        this(name, value, null, null, null, DEFAULT_MAX_AGE, false);
-    }
-
-    public NewCookie(String name,
-                     String value,
-                     String path,
-                     String domain,
-                     String comment,
-                     int maxAge,
-                     boolean isSecure) {
-        this(name, value, path, domain, DEFAULT_VERSION, comment, maxAge, isSecure);
-    }
-
-    public NewCookie(String name,
-                     String value,
-                     String path,
-                     String domain,
-                     int version,
-                     String comment,
-                     int maxAge,
-                     boolean isSecure) {
-        super(name, value, path, domain, version);
-        this.comment = comment;
-        this.maxAge = maxAge;
-        this.isSecure = isSecure;
-    }
-
-    public NewCookie(Cookie cookie) {
-        this(cookie, null, DEFAULT_MAX_AGE, false);
-    }
-
-    public NewCookie(Cookie cookie, String comment, int maxAge, boolean isSecure) {
-        super(cookie.getName(), cookie.getValue(), cookie.getPath(), cookie.getDomain(), cookie
-            .getVersion());
-        this.comment = comment;
-        this.maxAge = maxAge;
-        this.isSecure = isSecure;
-    }
-
-    @Override
-    public boolean equals(java.lang.Object obj) {
-        if (this == obj) {
-            return true;
-        }
-
-        if (obj == null) {
-            return false;
-        }
-
-        // note that this must be a NewCookie exactly
-        if (getClass() != obj.getClass()) {
-            return false;
-        }
-
-        NewCookie other = (NewCookie)obj;
-        if (!getName().equals(other.getName())) {
-            return false;
-        }
-
-        if (getVersion() != other.getVersion()) {
-            return false;
-        }
-
-        if (isSecure != other.isSecure) {
-            return false;
-        }
-
-        if (maxAge != other.maxAge) {
-            return false;
-        }
-
-        String value = getValue();
-        if (value == null) {
-            if (other.getValue() != null) {
-                return false;
-            }
-        } else {
-            if (!value.equals(other.getValue())) {
-                return false;
-            }
-        }
-
-        String path = getPath();
-        if (path == null) {
-            if (other.getPath() != null) {
-                return false;
-            }
-        } else {
-            if (!path.equals(other.getPath())) {
-                return false;
-            }
-        }
-
-        String domain = getDomain();
-        if (domain == null) {
-            if (other.getDomain() != null) {
-                return false;
-            }
-        } else {
-            if (!domain.equals(other.getDomain())) {
-                return false;
-            }
-        }
-
-        if (comment == null) {
-            if (other.comment != null) {
-                return false;
-            }
-        } else {
-            if (!comment.equals(other.comment)) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = super.hashCode();
-        result = 31 * result + ((comment == null) ? 0 : comment.hashCode());
-        result = 31 * result + maxAge;
-        result = 31 * result + ((isSecure) ? 1 : 0);
-        return result;
-    }
-
-    public String getComment() {
-        return comment;
-    }
-
-    public int getMaxAge() {
-        return maxAge;
-    }
-
-    public boolean isSecure() {
-        return isSecure;
-    }
-
-    public Cookie toCookie() {
-        return new Cookie(getName(), getValue(), getPath(), getDomain(), getVersion());
-    }
-
-    private static final HeaderDelegate<NewCookie> headerDelegate =
-                                                                      RuntimeDelegate
-                                                                          .getInstance()
-                                                                          .createHeaderDelegate(NewCookie.class);
-
-    @Override
-    public String toString() {
-        return headerDelegate.toString(this);
-    }
-
-    public static NewCookie valueOf(String value) {
-        return headerDelegate.fromString(value);
-    }
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/PathSegment.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/PathSegment.java
deleted file mode 100644
index 4436cff..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/PathSegment.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.ws.rs.core;
-
-public interface PathSegment {
-    public MultivaluedMap<String, String> getMatrixParameters();
-
-    public String getPath();
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/Request.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/Request.java
deleted file mode 100644
index fcd9355..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/Request.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES 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.core;
-
-import java.util.Date;
-import java.util.List;
-
-public interface Request {
-
-    public Response.ResponseBuilder evaluatePreconditions();
-
-    public Response.ResponseBuilder evaluatePreconditions(Date lastModified);
-
-    public Response.ResponseBuilder evaluatePreconditions(Date lastModified, EntityTag entityTag);
-
-    public Response.ResponseBuilder evaluatePreconditions(EntityTag entityTag);
-
-    public String getMethod();
-
-    public Variant selectVariant(List<Variant> variants);
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/Response.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/Response.java
deleted file mode 100644
index 382bc64..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/Response.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES 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.core;
-
-import java.net.URI;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.Locale;
-
-import javax.ws.rs.ext.RuntimeDelegate;
-
-public abstract class Response {
-
-    private final static RuntimeDelegate delegate = RuntimeDelegate.getInstance();
-
-    public abstract static class ResponseBuilder {
-        protected ResponseBuilder() {
-            // do nothing
-        }
-
-        public abstract Response build();
-
-        public abstract Response.ResponseBuilder cacheControl(CacheControl value);
-
-        @Override
-        public abstract Response.ResponseBuilder clone();
-
-        public abstract Response.ResponseBuilder contentLocation(URI value);
-
-        public abstract Response.ResponseBuilder cookie(NewCookie... values);
-
-        public abstract Response.ResponseBuilder entity(Object value);
-
-        public abstract Response.ResponseBuilder expires(Date value);
-
-        public abstract Response.ResponseBuilder header(String name, Object value);
-
-        public abstract Response.ResponseBuilder language(Locale value);
-
-        public abstract Response.ResponseBuilder language(String value);
-
-        public abstract Response.ResponseBuilder lastModified(Date value);
-
-        public abstract Response.ResponseBuilder location(URI value);
-
-        protected static Response.ResponseBuilder newInstance() {
-            return delegate.createResponseBuilder();
-        }
-
-        public abstract Response.ResponseBuilder status(int value);
-
-        public Response.ResponseBuilder status(Response.Status value) {
-            return delegate.createResponseBuilder().status(value.getStatusCode());
-        }
-
-        public Response.ResponseBuilder status(Response.StatusType status) {
-            return delegate.createResponseBuilder().status(status.getStatusCode());
-        }
-
-        public abstract Response.ResponseBuilder tag(EntityTag value);
-
-        public abstract Response.ResponseBuilder tag(String value);
-
-        public abstract Response.ResponseBuilder type(MediaType value);
-
-        public abstract Response.ResponseBuilder type(String type);
-
-        public abstract Response.ResponseBuilder variant(Variant value);
-
-        public abstract Response.ResponseBuilder variants(List<Variant> values);
-
-    }
-
-    public static enum Status implements StatusType {
-        OK(Family.SUCCESSFUL, 200, "OK"),
-        CREATED(Family.SUCCESSFUL, 201, "Created"),
-        ACCEPTED(Family.SUCCESSFUL, 202, "Accepted"),
-        NO_CONTENT(Family.SUCCESSFUL, 204, "No Content"),
-        MOVED_PERMANENTLY(Family.REDIRECTION, 301, "Moved Permanently"),
-        SEE_OTHER(Family.REDIRECTION, 303, "See Other"),
-        NOT_MODIFIED(Family.REDIRECTION, 304, "Not Modified"),
-        TEMPORARY_REDIRECT(Family.REDIRECTION, 307, "Temporary Redirect"),
-        BAD_REQUEST(Family.CLIENT_ERROR, 400,"Bad Request"),
-        UNAUTHORIZED(Family.CLIENT_ERROR, 401, "Unauthorized"),
-        FORBIDDEN(Family.CLIENT_ERROR, 403, "Forbidden"),
-        NOT_FOUND(Family.CLIENT_ERROR, 404, "Not Found"),
-        NOT_ACCEPTABLE(Family.CLIENT_ERROR, 406, "Not Acceptable"),
-        CONFLICT(Family.CLIENT_ERROR, 409, "Conflict"),
-        GONE(Family.CLIENT_ERROR, 410, "Gone"),
-        PRECONDITION_FAILED(Family.CLIENT_ERROR, 412, "Precondition Failed"),
-        UNSUPPORTED_MEDIA_TYPE(Family.CLIENT_ERROR, 415, "Unsupported Media Type"),
-        INTERNAL_SERVER_ERROR(Family.SERVER_ERROR, 500, "Internal Server Error"),
-        SERVICE_UNAVAILABLE(Family.SERVER_ERROR, 503, "Service Unavailable"), ;
-
-        private final Family family;
-        private final int    statusCode;
-        private final String reasonPhrase;
-
-        private Status(Family family, int statusCode, String reasonPhrase) {
-            this.family = family;
-            this.statusCode = statusCode;
-            this.reasonPhrase = reasonPhrase;
-        }
-
-        public static enum Family {
-            INFORMATIONAL,
-            SUCCESSFUL,
-            REDIRECTION,
-            CLIENT_ERROR,
-            SERVER_ERROR,
-            OTHER
-        }
-
-        public static Status fromStatusCode(int statusCode) {
-            for (Status s : values()) {
-                if (s.getStatusCode() == statusCode) {
-                    return s;
-                }
-            }
-            return null;
-        }
-
-        public int getStatusCode() {
-            return statusCode;
-        }
-
-        public Response.Status.Family getFamily() {
-            return family;
-        }
-
-        @Override
-        public String toString() {
-            return reasonPhrase;
-        }
-
-        public String getReasonPhrase() {
-            return reasonPhrase;
-        }
-    }
-
-    public interface StatusType {
-        public Response.Status.Family getFamily();
-
-        public String getReasonPhrase();
-
-        public int getStatusCode();
-    }
-
-    protected Response() {
-        // do nothing
-    }
-
-    public static Response.ResponseBuilder created(java.net.URI location) {
-        if (location == null) {
-            throw new IllegalArgumentException();
-        }
-        return status(Status.CREATED).location(location);
-    }
-
-    public static Response.ResponseBuilder fromResponse(Response response) {
-        ResponseBuilder builder = delegate.createResponseBuilder();
-        builder.status(response.getStatus());
-        builder.entity(response.getEntity());
-        MultivaluedMap<String, Object> metadata = response.getMetadata();
-        for (String key : metadata.keySet()) {
-            List<Object> values = metadata.get(key);
-            for (Object value : values) {
-                builder.header(key, value);
-            }
-        }
-        return builder;
-    }
-
-    public abstract Object getEntity();
-
-    public abstract MultivaluedMap<String, Object> getMetadata();
-
-    public abstract int getStatus();
-
-    public static Response.ResponseBuilder noContent() {
-        return status(Status.NO_CONTENT);
-    }
-
-    public static Response.ResponseBuilder notAcceptable(List<Variant> values) {
-        ResponseBuilder builder = status(Status.NOT_ACCEPTABLE);
-        if (values == null) {
-            return builder.variants(Collections.EMPTY_LIST);
-        }
-        return builder.variants(values);
-    }
-
-    public static Response.ResponseBuilder notModified() {
-        return status(Status.NOT_MODIFIED);
-    }
-
-    public static Response.ResponseBuilder notModified(EntityTag value) {
-        if (value == null) {
-            throw new IllegalArgumentException();
-        }
-        return status(Status.NOT_MODIFIED).tag(value);
-    }
-
-    public static Response.ResponseBuilder notModified(String value) {
-        if (value == null) {
-            throw new IllegalArgumentException();
-        }
-        return status(Status.NOT_MODIFIED).tag(value);
-    }
-
-    public static Response.ResponseBuilder ok() {
-        return status(Status.OK);
-    }
-
-    public static Response.ResponseBuilder ok(Object entity) {
-        return status(Status.OK).entity(entity);
-    }
-
-    public static Response.ResponseBuilder ok(Object entity, MediaType mediaType) {
-        return status(Status.OK).entity(entity).type(mediaType);
-    }
-
-    public static Response.ResponseBuilder ok(Object entity, String mediaType) {
-        return status(Status.OK).entity(entity).type(mediaType);
-    }
-
-    public static Response.ResponseBuilder ok(Object entity, Variant variant) {
-        return status(Status.OK).entity(entity).variant(variant);
-    }
-
-    public static Response.ResponseBuilder seeOther(URI location) {
-        if (location == null) {
-            throw new IllegalArgumentException();
-        }
-        return status(Status.SEE_OTHER).location(location);
-    }
-
-    public static Response.ResponseBuilder serverError() {
-        return status(Status.INTERNAL_SERVER_ERROR);
-    }
-
-    public static Response.ResponseBuilder status(int status) {
-        if (status < 100 || status > 599) {
-            throw new IllegalArgumentException();
-        }
-        return ResponseBuilder.newInstance().status(status);
-    }
-
-    public static Response.ResponseBuilder status(Response.Status status) {
-        if (status == null) {
-            throw new IllegalArgumentException();
-        }
-        return ResponseBuilder.newInstance().status(status);
-    }
-
-    public static Response.ResponseBuilder status(Response.StatusType status) {
-        if (status == null) {
-            throw new IllegalArgumentException();
-        }
-        return ResponseBuilder.newInstance().status(status);
-    }
-
-    public static Response.ResponseBuilder temporaryRedirect(URI location) {
-        return status(Status.TEMPORARY_REDIRECT).location(location);
-    }
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/SecurityContext.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/SecurityContext.java
deleted file mode 100644
index e48c8cd..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/SecurityContext.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.ws.rs.core;
-
-import java.security.Principal;
-
-public interface SecurityContext {
-    public static final java.lang.String BASIC_AUTH       = "BASIC";
-    public static final java.lang.String CLIENT_CERT_AUTH = "CLIENT_CERT";
-    public static final java.lang.String DIGEST_AUTH      = "DIGEST";
-    public static final java.lang.String FORM_AUTH        = "FORM";
-
-    public String getAuthenticationScheme();
-
-    public Principal getUserPrincipal();
-
-    public boolean isSecure();
-
-    public boolean isUserInRole(String role);
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/StreamingOutput.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/StreamingOutput.java
deleted file mode 100644
index 9d24f97..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/StreamingOutput.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.ws.rs.core;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-public interface StreamingOutput {
-    public void write(OutputStream os) throws IOException;
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/UriBuilder.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/UriBuilder.java
deleted file mode 100644
index 00ed3c2..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/UriBuilder.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES 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.core;
-
-import java.lang.reflect.Method;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.Map;
-
-import javax.ws.rs.ext.RuntimeDelegate;
-
-public abstract class UriBuilder {
-    protected UriBuilder() {
-        super();
-    }
-
-    public static UriBuilder fromPath(String value) {
-        return newInstance().replacePath(value);
-    }
-
-    public static UriBuilder fromResource(Class<?> resourceClass) {
-        return newInstance().path(resourceClass);
-    }
-
-    public static UriBuilder fromUri(String value) {
-        try {
-            return fromUri(new URI(value));
-        } catch (NullPointerException e) {
-            throw new IllegalArgumentException(e);
-        } catch (URISyntaxException e) {
-            throw new IllegalArgumentException(e);
-        }
-    }
-
-    public static UriBuilder fromUri(URI uri) {
-        return newInstance().uri(uri);
-    }
-
-    private final static RuntimeDelegate delegate = RuntimeDelegate.getInstance();
-
-    protected static UriBuilder newInstance() {
-        return delegate.createUriBuilder();
-    }
-
-    public abstract URI build(Object... values);
-
-    public abstract URI buildFromEncoded(Object... values);
-
-    public abstract URI buildFromEncodedMap(Map<String, ? extends Object> values);
-
-    public abstract URI buildFromMap(Map<String, ? extends Object> values);
-
-    @Override
-    public abstract UriBuilder clone();
-
-    public abstract UriBuilder fragment(String value);
-
-    public abstract UriBuilder host(String value);
-
-    public abstract UriBuilder matrixParam(String name, Object... values);
-
-    public abstract UriBuilder path(Class resourceClass);
-
-    public abstract UriBuilder path(Class resourceClass, String resourceMethodName);
-
-    public abstract UriBuilder path(Method resourceMethod);
-
-    public abstract UriBuilder path(String value);
-
-    public abstract UriBuilder port(int port);
-
-    public abstract UriBuilder queryParam(String name, Object... values);
-
-    public abstract UriBuilder replaceMatrix(String value);
-
-    public abstract UriBuilder replaceMatrixParam(String name, Object... values);
-
-    public abstract UriBuilder replacePath(String value);
-
-    public abstract UriBuilder replaceQuery(String value);
-
-    public abstract UriBuilder replaceQueryParam(String name, Object... values);
-
-    public abstract UriBuilder scheme(String value);
-
-    public abstract UriBuilder schemeSpecificPart(String value);
-
-    public abstract UriBuilder segment(String... values);
-
-    public abstract UriBuilder uri(URI value);
-
-    public abstract UriBuilder userInfo(String value);
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/UriBuilderException.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/UriBuilderException.java
deleted file mode 100644
index 8866c74..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/UriBuilderException.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.ws.rs.core;
-
-public class UriBuilderException extends RuntimeException {
-
-    private static final long serialVersionUID = 956255903370721193L;
-
-    public UriBuilderException() {
-        super();
-    }
-
-    public UriBuilderException(String msg) {
-        super(msg);
-    }
-
-    public UriBuilderException(String msg, Throwable cause) {
-        super(msg, cause);
-    }
-
-    public UriBuilderException(Throwable cause) {
-        super((cause == null ? null : cause.toString()), cause);
-    }
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/UriInfo.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/UriInfo.java
deleted file mode 100644
index 28493fe..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/UriInfo.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES 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.core;
-
-import java.net.URI;
-import java.util.List;
-
-public interface UriInfo {
-    public URI getAbsolutePath();
-
-    public UriBuilder getAbsolutePathBuilder();
-
-    public URI getBaseUri();
-
-    public UriBuilder getBaseUriBuilder();
-
-    public List<Object> getMatchedResources();
-
-    public List<String> getMatchedURIs();
-
-    public List<String> getMatchedURIs(boolean decode);
-
-    public String getPath();
-
-    public String getPath(boolean decode);
-
-    public MultivaluedMap<String, String> getPathParameters();
-
-    public MultivaluedMap<String, String> getPathParameters(boolean decode);
-
-    public List<PathSegment> getPathSegments();
-
-    public List<PathSegment> getPathSegments(boolean decode);
-
-    public MultivaluedMap<String, String> getQueryParameters();
-
-    public MultivaluedMap<String, String> getQueryParameters(boolean decode);
-
-    public URI getRequestUri();
-
-    public UriBuilder getRequestUriBuilder();
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/Variant.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/Variant.java
deleted file mode 100644
index 91f8160..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/core/Variant.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES 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.core;
-
-import java.util.Locale;
-
-import javax.ws.rs.ext.RuntimeDelegate;
-
-public class Variant {
-    public abstract static class VariantListBuilder {
-        protected VariantListBuilder() {
-            /* do nothing */
-        }
-
-        public abstract Variant.VariantListBuilder add();
-
-        public abstract java.util.List<Variant> build();
-
-        public abstract Variant.VariantListBuilder encodings(String... values);
-
-        public abstract Variant.VariantListBuilder languages(Locale... values);
-
-        public abstract Variant.VariantListBuilder mediaTypes(MediaType... values);
-
-        private final static RuntimeDelegate delegate = RuntimeDelegate.getInstance();
-
-        public static Variant.VariantListBuilder newInstance() {
-            return delegate.createVariantListBuilder();
-        }
-    }
-
-    public static Variant.VariantListBuilder encodings(String... values) {
-        return VariantListBuilder.newInstance().encodings(values);
-    }
-
-    public static Variant.VariantListBuilder languages(java.util.Locale... values) {
-        return VariantListBuilder.newInstance().languages(values);
-    }
-
-    public static Variant.VariantListBuilder mediaTypes(MediaType... values) {
-        return VariantListBuilder.newInstance().mediaTypes(values);
-    }
-
-    private final MediaType mediaType;
-    private final Locale    language;
-    private final String    encoding;
-
-    public Variant(MediaType mediaType, Locale language, String encoding) {
-        if (mediaType == null && language == null && encoding == null) {
-            throw new IllegalArgumentException();
-        }
-
-        this.mediaType = mediaType;
-        this.language = language;
-        this.encoding = encoding;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj == this) {
-            return true;
-        }
-
-        if (!(obj instanceof Variant)) {
-            return false;
-        }
-
-        Variant other = (Variant)obj;
-
-        String encoding = getEncoding();
-        if (encoding == null) {
-            if (other.getEncoding() != null) {
-                return false;
-            }
-        } else {
-            if (!encoding.equals(other.getEncoding())) {
-                return false;
-            }
-        }
-
-        Locale locale = getLanguage();
-        if (locale == null) {
-            if (other.getLanguage() != null) {
-                return false;
-            }
-        } else {
-            if (!locale.equals(other.getLanguage())) {
-                return false;
-            }
-        }
-
-        MediaType mt = getMediaType();
-        if (mt == null) {
-            if (other.getMediaType() != null) {
-                return false;
-            }
-        } else {
-            return mt.equals(other.getMediaType());
-        }
-
-        return true;
-    }
-
-    public String getEncoding() {
-        return encoding;
-    }
-
-    public java.util.Locale getLanguage() {
-        return language;
-    }
-
-    public MediaType getMediaType() {
-        return mediaType;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = 17;
-        result = 31 * result + ((language == null) ? 0 : language.hashCode());
-        result = 31 * result + ((encoding == null) ? 0 : encoding.hashCode());
-        result = 31 * result + ((mediaType == null) ? 0 : mediaType.hashCode());
-        return result;
-    }
-
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/ext/ContextResolver.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/ext/ContextResolver.java
deleted file mode 100644
index 774dcc3..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/ext/ContextResolver.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.ws.rs.ext;
-
-public interface ContextResolver<T> {
-    public T getContext(Class<?> rawType);
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/ext/ExceptionMapper.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/ext/ExceptionMapper.java
deleted file mode 100644
index d52468d..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/ext/ExceptionMapper.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.ws.rs.ext;
-
-import javax.ws.rs.core.Response;
-
-public interface ExceptionMapper<T extends Throwable> {
-    public Response toResponse(T throwable);
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/ext/MessageBodyReader.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/ext/MessageBodyReader.java
deleted file mode 100644
index 04e0b02..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/ext/MessageBodyReader.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.ws.rs.ext;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
-
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
-
-public interface MessageBodyReader<T> {
-    public boolean isReadable(Class<?> rawType,
-                              Type genericType,
-                              Annotation[] annotations,
-                              MediaType mediaType);
-
-    public T readFrom(Class<T> rawType,
-                      Type genericType,
-                      Annotation[] annotations,
-                      MediaType mediaType,
-                      MultivaluedMap<String, String> httpHeaders,
-                      InputStream entityStream) throws IOException;
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/ext/MessageBodyWriter.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/ext/MessageBodyWriter.java
deleted file mode 100644
index 7660223..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/ext/MessageBodyWriter.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.ws.rs.ext;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
-
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
-
-public interface MessageBodyWriter<T> {
-
-    public long getSize(T t,
-                        Class<?> rawType,
-                        Type genericType,
-                        Annotation[] annotations,
-                        MediaType mediaType);
-
-    public boolean isWriteable(Class<?> rawType,
-                               Type genericType,
-                               Annotation[] annotations,
-                               MediaType mediaType);
-
-    public void writeTo(T t,
-                        Class<?> rawType,
-                        Type genericType,
-                        Annotation[] annotations,
-                        MediaType mediaType,
-                        MultivaluedMap<String, Object> httpHeaders,
-                        OutputStream entityStream) throws IOException;
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/ext/Provider.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/ext/Provider.java
deleted file mode 100644
index 4943312..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/ext/Provider.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.ws.rs.ext;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target(value = ElementType.TYPE)
-@Retention(value = RetentionPolicy.RUNTIME)
-@Documented
-public @interface Provider {
-
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/ext/Providers.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/ext/Providers.java
deleted file mode 100644
index e6b4325..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/ext/Providers.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.ws.rs.ext;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
-
-import javax.ws.rs.core.MediaType;
-
-public interface Providers {
-    public <T> ContextResolver<T> getContextResolver(Class<T> rawType, MediaType mediaType);
-
-    public <T extends Throwable> ExceptionMapper<T> getExceptionMapper(Class<T> rawType);
-
-    public <T> MessageBodyReader<T> getMessageBodyReader(Class<T> rawType,
-                                                         Type genericType,
-                                                         Annotation[] annotations,
-                                                         MediaType mediaType);
-
-    public <T> MessageBodyWriter<T> getMessageBodyWriter(Class<T> rawType,
-                                                         Type genericType,
-                                                         Annotation[] annotations,
-                                                         MediaType mediaType);
-}
diff --git a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/ext/RuntimeDelegate.java b/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/ext/RuntimeDelegate.java
deleted file mode 100644
index 31a8749..0000000
--- a/geronimo-jaxrs_1.1_spec/src/main/java/javax/ws/rs/ext/RuntimeDelegate.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.lang.reflect.ReflectPermission;
-import java.io.File;
-import java.io.IOException;
-
-import javax.ws.rs.core.Application;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriBuilder;
-import javax.ws.rs.core.Variant;
-
-import org.apache.geronimo.osgi.locator.ProviderLocator;
-
-
-public abstract class RuntimeDelegate {
-    public static final String JAXRS_RUNTIME_DELEGATE_PROPERTY = "javax.ws.rs.ext.RuntimeDelegate";
-
-    public static interface HeaderDelegate<T> {
-        public T fromString(String str);
-
-        public String toString(T obj);
-    }
-
-    protected RuntimeDelegate() {
-        // do nothing
-    }
-
-    public abstract <T> T createEndpoint(Application app, java.lang.Class<T> type);
-
-    public abstract UriBuilder createUriBuilder();
-
-    public abstract Variant.VariantListBuilder createVariantListBuilder();
-
-    public abstract <T> RuntimeDelegate.HeaderDelegate<T> createHeaderDelegate(Class<T> headerType);
-
-    public abstract Response.ResponseBuilder createResponseBuilder();
-
-    private static volatile RuntimeDelegate delegate;
-
-    public static void setInstance(RuntimeDelegate delegate) throws SecurityException {
-        SecurityManager secManager = System.getSecurityManager();
-        if (secManager != null) {
-            secManager.checkPermission(new ReflectPermission("suppressAccessChecks"));
-        }
-        RuntimeDelegate.delegate = delegate;
-    }
-
-    public static RuntimeDelegate getInstance() {
-        if (delegate != null) {
-            return delegate;
-        }
-
-        // cannot synchronize on any instance so synchronize on class
-        synchronized (RuntimeDelegate.class) {
-            if (delegate != null) {
-                return delegate;
-            }
-
-            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-
-            // try META-INF/services/javax.ws.rs.ext.RuntimeDelegate
-            try {
-                // check the META-INF/services definitions, and return it if
-                // we find something.
-                Object service = ProviderLocator.getService(RuntimeDelegate.class.getName(), RuntimeDelegate.class, classLoader);
-                if (service != null) {
-                    delegate = (RuntimeDelegate)service;
-                    return delegate;
-                }
-            } catch (Exception ex) {
-                // ignore any errors, try additional creation methods
-            } catch (Error ex) {
-                // ignore any errors, try additional creation methods
-            }
-
-            String className = null;
-
-            try {
-                // try to read from $java.home/lib/jaxrpc.properties
-                className =  ProviderLocator.lookupByJREPropertyFile("lib" + File.separator + "jaxrpc.properties", RuntimeDelegate.class.getName());
-                if (className != null) {
-                    Class<?> delegateClass = ProviderLocator.loadClass(className,
-                        RuntimeDelegate.class, classLoader);
-                    delegate = (RuntimeDelegate)delegateClass.newInstance();
-                    return delegate;
-                }
-            } catch (IOException e) {
-                // do nothing
-            } catch (ClassNotFoundException e) {
-                // do nothing
-            } catch (InstantiationException e) {
-                // do nothing
-            } catch (IllegalAccessException e) {
-                // do nothing
-            }
-
-            // try system property
-            try {
-                className = System.getProperty("javax.ws.rs.ext.RuntimeDelegate");
-            } catch (SecurityException e) {
-                // do nothing
-            }
-
-            // if the system property is null or empty go ahead and use the
-            // default implementation class name
-
-            if (className == null || "".equals(className)) {
-                // dunno which should be the default. this might be interesting
-                // for OSGi purposes later to somehow set the
-                // "current implementation" to be the current default. dunno if
-                // spec allows for that
-                className = "org.apache.wink.common.internal.runtime.RuntimeDelegateImpl";
-            }
-
-            try {
-                Class<?> delegateClass = ProviderLocator.loadClass(className,
-                    RuntimeDelegate.class, classLoader);
-                delegate = (RuntimeDelegate)delegateClass.newInstance();
-                return delegate;
-            } catch (ClassNotFoundException e1) {
-                // do nothing
-            } catch (SecurityException e) {
-                // do nothing
-            } catch (InstantiationException e) {
-                // do nothing
-            } catch (IllegalAccessException e) {
-                // do nothing
-            }
-
-            throw new RuntimeException("Unable to create jax-rs RuntimeDelegate");
-        }
-    }
-}
