diff --git a/jaxrs-api/pom.xml b/jaxrs-api/pom.xml
index ac9d90c..55749c1 100644
--- a/jaxrs-api/pom.xml
+++ b/jaxrs-api/pom.xml
@@ -95,72 +95,10 @@
             <artifactId>jakarta.enterprise.cdi-api</artifactId>
         </dependency>
         <dependency>
-            <groupId>jakarta.xml.bind</groupId>
-            <artifactId>jakarta.xml.bind-api</artifactId>
-        </dependency>
-        <dependency>
             <groupId>org.junit.jupiter</groupId>
             <artifactId>junit-jupiter-api</artifactId>
             <scope>test</scope>
         </dependency>
-        <!-- JAXB Implementation -->
-        <dependency>
-            <groupId>org.glassfish.jaxb</groupId>
-            <artifactId>codemodel</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jaxb</groupId>
-            <artifactId>jaxb-core</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jaxb</groupId>
-            <artifactId>jaxb-jxc</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jaxb</groupId>
-            <artifactId>jaxb-runtime</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jaxb</groupId>
-            <artifactId>txw2</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jaxb</groupId>
-            <artifactId>jaxb-xjc</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jaxb</groupId>
-            <artifactId>xsom</artifactId>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>com.sun.istack</groupId>
-            <artifactId>istack-commons-runtime</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.sun.istack</groupId>
-            <artifactId>istack-commons-tools</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.sun.xml.bind.external</groupId>
-            <artifactId>relaxng-datatype</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.sun.xml.bind.external</groupId>
-            <artifactId>rngom</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <!-- End JAXB Implementation -->
         <dependency>
             <groupId>org.hamcrest</groupId>
             <artifactId>hamcrest</artifactId>
diff --git a/jaxrs-api/src/main/java/jakarta/ws/rs/core/Link.java b/jaxrs-api/src/main/java/jakarta/ws/rs/core/Link.java
index 6f03b86..dbd415c 100644
--- a/jaxrs-api/src/main/java/jakarta/ws/rs/core/Link.java
+++ b/jaxrs-api/src/main/java/jakarta/ws/rs/core/Link.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -16,18 +16,11 @@
 
 package jakarta.ws.rs.core;
 
-import javax.xml.namespace.QName;
 import java.net.URI;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
-import java.util.Map.Entry;
 
 import jakarta.ws.rs.ext.RuntimeDelegate;
-import jakarta.xml.bind.annotation.XmlAnyAttribute;
-import jakarta.xml.bind.annotation.XmlAttribute;
-import jakarta.xml.bind.annotation.adapters.XmlAdapter;
 
 /**
  * <p>
@@ -402,187 +395,4 @@
          */
         public Link buildRelativized(URI uri, Object... values);
     }
-
-    /**
-     * Value type for {@link jakarta.ws.rs.core.Link} that can be marshalled and
-     * unmarshalled by JAXB.
-     *
-     * Note that usage of this class requires the Jakarta XML Binding API and an implementation. The Jakarta RESTful Web
-     * Services implementation is not required to provide these dependencies.
-     *
-     * @see jakarta.ws.rs.core.Link.JaxbAdapter
-     * @since 2.0
-     * @deprecated
-     */
-    @Deprecated
-    public static class JaxbLink {
-
-        private URI uri;
-        private Map<QName, Object> params;
-
-        /**
-         * Default constructor needed during unmarshalling.
-         */
-        public JaxbLink() {
-        }
-
-        /**
-         * Construct an instance from a URI and no parameters.
-         *
-         * @param uri underlying URI.
-         */
-        public JaxbLink(final URI uri) {
-            this.uri = uri;
-        }
-
-        /**
-         * Construct an instance from a URI and some parameters.
-         *
-         * @param uri underlying URI.
-         * @param params parameters of this link.
-         */
-        public JaxbLink(final URI uri, final Map<QName, Object> params) {
-            this.uri = uri;
-            this.params = params;
-        }
-
-        /**
-         * Get the underlying URI for this link.
-         *
-         * @return underlying URI.
-         */
-        @XmlAttribute(name = "href")
-        public URI getUri() {
-            return uri;
-        }
-
-        /**
-         * Get the parameter map for this link.
-         *
-         * @return parameter map.
-         */
-        @XmlAnyAttribute
-        public Map<QName, Object> getParams() {
-            if (params == null) {
-                params = new HashMap<QName, Object>();
-            }
-            return params;
-        }
-
-        /**
-         * Set the underlying URI for this link.
-         *
-         * This setter is needed for JAXB unmarshalling.
-         */
-        void setUri(final URI uri) {
-            this.uri = uri;
-        }
-
-        /**
-         * Set the parameter map for this link.
-         *
-         * This setter is needed for JAXB unmarshalling.
-         */
-        void setParams(final Map<QName, Object> params) {
-            this.params = params;
-        }
-
-        @Override
-        public boolean equals(final Object o) {
-            if (this == o) {
-                return true;
-            }
-            if (!(o instanceof JaxbLink)) {
-                return false;
-            }
-
-            JaxbLink jaxbLink = (JaxbLink) o;
-
-            if (uri != null ? !uri.equals(jaxbLink.uri) : jaxbLink.uri != null) {
-                return false;
-            }
-
-            if (params == jaxbLink.params) {
-                return true;
-            }
-            if (params == null) {
-                // if this.params is 'null', consider other.params equal to empty
-                return jaxbLink.params.isEmpty();
-            }
-            if (jaxbLink.params == null) {
-                // if other.params is 'null', consider this.params equal to empty
-                return params.isEmpty();
-            }
-
-            return params.equals(jaxbLink.params);
-        }
-
-        @Override
-        public int hashCode() {
-            return Objects.hash(uri, params);
-        }
-
-    }
-
-    /**
-     * An implementation of JAXB {@link jakarta.xml.bind.annotation.adapters.XmlAdapter} that maps the JAX-RS
-     * {@link jakarta.ws.rs.core.Link} type to a value that can be marshalled and unmarshalled by JAXB. The following example
-     * shows how to use this adapter on a JAXB bean class:
-     *
-     * <pre>
-     * &#64;XmlRootElement
-     * public class MyModel {
-     *
-     *   private Link link;
-     *
-     *   &#64;XmlElement(name="link")
-     *   &#64;XmlJavaTypeAdapter(JaxbAdapter.class)
-     *   public Link getLink() {
-     *     return link;
-     *   }
-     *   ...
-     * }
-     * </pre>
-     *
-     * Note that usage of this class requires the Jakarta XML Binding API and an implementation. The Jakarta RESTful Web
-     * Services implementation is not required to provide these dependencies.
-     *
-     * @see jakarta.ws.rs.core.Link.JaxbLink
-     * @since 2.0
-     * @deprecated
-     */
-    @Deprecated
-    public static class JaxbAdapter extends XmlAdapter<JaxbLink, Link> {
-
-        /**
-         * Convert a {@link JaxbLink} into a {@link Link}.
-         *
-         * @param v instance of type {@link JaxbLink}.
-         * @return mapped instance of type {@link JaxbLink}
-         */
-        @Override
-        public Link unmarshal(final JaxbLink v) {
-            Link.Builder lb = Link.fromUri(v.getUri());
-            for (Entry<QName, Object> e : v.getParams().entrySet()) {
-                lb.param(e.getKey().getLocalPart(), e.getValue().toString());
-            }
-            return lb.build();
-        }
-
-        /**
-         * Convert a {@link Link} into a {@link JaxbLink}.
-         *
-         * @param v instance of type {@link Link}.
-         * @return mapped instance of type {@link JaxbLink}.
-         */
-        @Override
-        public JaxbLink marshal(final Link v) {
-            JaxbLink jl = new JaxbLink(v.getUri());
-            for (Entry<String, String> e : v.getParams().entrySet()) {
-                final String name = e.getKey();
-                jl.getParams().put(new QName("", name), e.getValue());
-            }
-            return jl;
-        }
-    }
 }
diff --git a/jaxrs-api/src/main/java/module-info.java b/jaxrs-api/src/main/java/module-info.java
index aa24390..b0dd78b 100644
--- a/jaxrs-api/src/main/java/module-info.java
+++ b/jaxrs-api/src/main/java/module-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -19,8 +19,6 @@
  */
 module jakarta.ws.rs {
 
-    requires static jakarta.xml.bind;
-
     requires java.logging;
 
     exports jakarta.ws.rs;
@@ -33,6 +31,4 @@
     uses jakarta.ws.rs.client.ClientBuilder;
     uses jakarta.ws.rs.ext.RuntimeDelegate;
     uses jakarta.ws.rs.sse.SseEventSource.Builder;
-
-    opens jakarta.ws.rs.core to jakarta.xml.bind;
 }
diff --git a/jaxrs-api/src/test/java/jakarta/ws/rs/core/JaxbLinkTest.java b/jaxrs-api/src/test/java/jakarta/ws/rs/core/JaxbLinkTest.java
deleted file mode 100644
index 99af1e7..0000000
--- a/jaxrs-api/src/test/java/jakarta/ws/rs/core/JaxbLinkTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (c) 2014, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package jakarta.ws.rs.core;
-
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.net.URI;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.xml.namespace.QName;
-import javax.xml.transform.stream.StreamSource;
-
-import org.junit.jupiter.api.Test;
-
-import jakarta.xml.bind.JAXBContext;
-import jakarta.xml.bind.JAXBElement;
-import jakarta.xml.bind.Marshaller;
-import jakarta.xml.bind.Unmarshaller;
-
-/**
- * Unit test for JAX-RS Link marshalling and unmarshalling via JAXB.
- *
- * @author Marek Potociar (marek.potociar at oracle.com)
- */
-public class JaxbLinkTest {
-
-    @Test
-    public void testSerializationOfJaxbLink() throws Exception {
-        JAXBContext jaxbContext = JAXBContext.newInstance(Link.JaxbLink.class);
-        final Marshaller marshaller = jaxbContext.createMarshaller();
-        final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
-
-        Map<QName, Object> expectedParams = new HashMap<QName, Object>();
-        final QName qName = new QName("http://example.ns", "foo");
-        expectedParams.put(qName, "test");
-        final URI expectedUri = URI.create("/foo/bar");
-        Link.JaxbLink expected = new Link.JaxbLink(expectedUri, expectedParams);
-
-        final StringWriter writer = new StringWriter();
-
-        JAXBElement<Link.JaxbLink> jaxbLinkJAXBElement = new JAXBElement<Link.JaxbLink>(new QName("", "link"), Link.JaxbLink.class, expected);
-        marshaller.marshal(jaxbLinkJAXBElement, writer);
-
-        final Link.JaxbLink actual = unmarshaller.unmarshal(new StreamSource(
-                new StringReader(writer.toString())), Link.JaxbLink.class).getValue();
-
-        assertEquals(expected, actual, "Unmarshalled JaxbLink instance not equal to the marshalled one.");
-        assertEquals(expectedUri, actual.getUri(), "Unmarshalled JaxbLink instance URI not equal to original.");
-        assertEquals(expectedParams, actual.getParams(), "Unmarshalled JaxbLink instance params not equal to original.");
-    }
-
-    @Test
-    public void testEqualsHashCode() throws Exception {
-        Link.JaxbLink first = new Link.JaxbLink();
-        Link.JaxbLink second = new Link.JaxbLink();
-
-        // trigger lazy initialization on first
-        first.getParams();
-
-        assertThat(first, equalTo(second));
-        assertThat(second, equalTo(first));
-        assertThat(first.hashCode(), equalTo(second.hashCode()));
-    }
-}
diff --git a/jaxrs-tck/pom.xml b/jaxrs-tck/pom.xml
index 3f336b4..f87f056 100644
--- a/jaxrs-tck/pom.xml
+++ b/jaxrs-tck/pom.xml
@@ -34,6 +34,15 @@
         <version>4.0.0-SNAPSHOT</version>
     </parent>
 
+    <properties>
+        <json.api.version>2.0.1</json.api.version>
+        <json.bind.api.version>2.0.0</json.bind.api.version>
+        <xml.bind.api.version>4.0.0</xml.bind.api.version>
+        <servlet.api.version>6.0.0</servlet.api.version>
+        <common.httpclient.version>3.1</common.httpclient.version>
+        <arquillian.version>1.8.0.Final</arquillian.version>
+    </properties>
+
     <dependencies>
         <dependency>
             <groupId>jakarta.ws.rs</groupId>
@@ -44,13 +53,13 @@
         <dependency>
             <groupId>jakarta.json.bind</groupId>
             <artifactId>jakarta.json.bind-api</artifactId>
-            <version>2.0.0</version>
+            <version>${json.bind.api.version}</version>
         </dependency>
 
         <dependency>
             <groupId>jakarta.json</groupId>
             <artifactId>jakarta.json-api</artifactId>
-            <version>2.0.1</version>
+            <version>${json.api.version}</version>
         </dependency>
 
         <dependency>
@@ -61,7 +70,7 @@
         <dependency>
             <groupId>commons-httpclient</groupId>
             <artifactId>commons-httpclient</artifactId>
-            <version>3.1</version>
+            <version>${common.httpclient.version}</version>
         </dependency>
 
         <dependency>
@@ -72,7 +81,7 @@
         <dependency>
             <groupId>org.jboss.arquillian.junit5</groupId>
             <artifactId>arquillian-junit5-container</artifactId>
-            <version>1.8.0.Final</version>
+            <version>${arquillian.version}</version>
         </dependency>
 
         <dependency>
@@ -83,6 +92,7 @@
         <dependency>
             <groupId>jakarta.xml.bind</groupId>
             <artifactId>jakarta.xml.bind-api</artifactId>
+            <version>${xml.bind.api.version}</version>
         </dependency>
 
         <dependency>
@@ -93,7 +103,7 @@
         <dependency>
             <groupId>jakarta.servlet</groupId>
             <artifactId>jakarta.servlet-api</artifactId>
-            <version>6.0.0</version>
+            <version>${servlet.api.version}</version>
             <scope>provided</scope>
         </dependency>
 
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/api/rs/core/linkjaxbadapter/JAXRSClientIT.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/api/rs/core/linkjaxbadapter/JAXRSClientIT.java
deleted file mode 100644
index 6b4d33e..0000000
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/api/rs/core/linkjaxbadapter/JAXRSClientIT.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright (c) 2014, 2020 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package ee.jakarta.tck.ws.rs.api.rs.core.linkjaxbadapter;
-
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.nio.charset.Charset;
-
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.TestInfo;
-
-import jakarta.ws.rs.core.Link;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.ext.RuntimeDelegate;
-import ee.jakarta.tck.ws.rs.common.JAXRSCommonClient;
-import ee.jakarta.tck.ws.rs.lib.util.TestUtil;
-import jakarta.xml.bind.JAXBContext;
-import jakarta.xml.bind.JAXBException;
-import jakarta.xml.bind.Marshaller;
-import jakarta.xml.bind.Unmarshaller;
-
-import org.junit.jupiter.api.Tag;
-
-/*
- * @class.setup_props: webServerHost;
- *                     webServerPort;
- *                     ts_home;
- */
-public class JAXRSClientIT extends JAXRSCommonClient {
-
-    private static final long serialVersionUID = -5902280515880564932L;
-
-    protected static final String url = "some://where.at:port/";
-
-    protected static final String rel = "Relation";
-
-    protected static final String media = MediaType.APPLICATION_SVG_XML;
-
-    protected static final String title = "XTitleX";
-
-    protected static final String[] param_names = { "name1", "name2" };
-
-    protected static final String[] param_vals = { "val1", "val2" };
-
-    @BeforeEach
-    void logStartTest(TestInfo testInfo) {
-        TestUtil.logMsg("STARTING TEST : " + testInfo.getDisplayName());
-    }
-
-    @AfterEach
-    void logFinishTest(TestInfo testInfo) {
-        TestUtil.logMsg("FINISHED TEST : " + testInfo.getDisplayName());
-    }
-
-    /*
-     * @testName: marshallTest
-     * 
-     * @assertion_ids: JAXRS:JAVADOC:815; JAXRS:JAVADOC:816;
-     * 
-     * @test_Strategy:
-     */
-    @Test
-    @Tag("xml_binding")
-    public void marshallTest() throws Fault {
-        Link link = RuntimeDelegate.getInstance().createLinkBuilder().uri(url).title(title).rel(rel).type(media)
-                .param(param_names[0], param_vals[0]).param(param_names[1], param_vals[1]).build();
-        Model model = new Model(link);
-
-        ByteArrayOutputStream ostream = new ByteArrayOutputStream(1000);
-        JAXBContext jc = null;
-        Marshaller marshaller = null;
-        byte[] array = null;
-        try {
-            jc = JAXBContext.newInstance(Model.class);
-            marshaller = jc.createMarshaller();
-            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
-            marshaller.marshal(model, ostream);
-
-            array = ostream.toByteArray();
-            String string = new String(array, Charset.defaultCharset());
-            assertContains(string, "link href=", "Marshalled Link", string,
-                    "does not contain expected uri reference field");
-            assertContains(string, url, "Marshalled Link", string, " does not contain expected uri reference", url);
-            assertContains(string, media, "MediaType has not been marshalled in", string);
-            assertContains(string, title, "Title has not been marshalled in", string);
-            assertContains(string, rel, "Relation has not been marshalled in", string);
-            assertContains(string, param_names[0], "parameter name", param_names[0], "has not been marshalled in",
-                    string);
-            assertContains(string, param_names[1], "parameter name", param_names[1], "has not been marshalled in",
-                    string);
-            assertContains(string, param_vals[0], "parameter value", param_vals[0], "has not been marshalled in",
-                    string);
-            assertContains(string, param_vals[1], "parameter value", param_vals[1], "has not been marshalled in",
-                    string);
-            logMsg("Marshalled Link contains expected", string);
-        } catch (JAXBException e) {
-            throw new Fault(e);
-        }
-        //return array;
-    }
-
-    /*
-     * @testName: unmarshallTest
-     * 
-     * @assertion_ids: JAXRS:JAVADOC:815; JAXRS:JAVADOC:816; JAXRS:JAVADOC:818;
-     * 
-     * @test_Strategy: Test whether a class with Link can be unmarshalled fine
-     */
-    @Test
-    @Tag("xml_binding")
-    public void unmarshallTest() throws Fault {
-
-        Link link = RuntimeDelegate.getInstance().createLinkBuilder().uri(url).title(title).rel(rel).type(media)
-                .param(param_names[0], param_vals[0]).param(param_names[1], param_vals[1]).build();
-        Model model = new Model(link);
-
-        ByteArrayOutputStream ostream = new ByteArrayOutputStream(1000);
-        JAXBContext jc = null;
-        Marshaller marshaller = null;
-        byte[] array = null;
-
-        
-        Unmarshaller unmarshaller = null;
-        ByteArrayInputStream istream = null;
-        Model unmarshalledModel = null;
-        try {
-
-            jc = JAXBContext.newInstance(Model.class);
-            marshaller = jc.createMarshaller();
-            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
-            marshaller.marshal(model, ostream);
-            array = ostream.toByteArray();
-
-            istream = new ByteArrayInputStream(array);
-
-            jc = JAXBContext.newInstance(Model.class);
-            unmarshaller = jc.createUnmarshaller();
-            unmarshalledModel = (Model) unmarshaller.unmarshal(istream);
-            link = unmarshalledModel.getLink();
-
-            assertContains(link.toString(), url, "unmarshalled link", link, "does not contain expected url", url);
-            assertContains(link.getRel(), rel, "unmarshalled link", link, "does not contain expected relation", rel);
-            assertContains(link.getTitle(), title, "unmarshalled link", link, "does not contain expected title", title);
-            assertContains(link.getType(), media, "unmarshalled link", link, "does not contain expected media type",
-                    media);
-            assertTrue(link.getParams().size() > 2,
-                    "unmarshalled link " + link + " does not contain expected parameters");
-            assertContains(link.getParams().get(param_names[0]), param_vals[0], "unmarshalled link", link,
-                    "does not contain expected parameter", param_names[0], "=", param_vals[0]);
-            assertContains(link.getParams().get(param_names[1]), param_vals[1], "unmarshalled link", link,
-                    "does not contain expected parameter", param_names[1], "=", param_vals[1]);
-            logMsg("unmarshalled Link contains expected url, title, media type, and parameters", link);
-        } catch (JAXBException e) {
-            throw new Fault(e);
-        }
-    }
-}
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/api/rs/core/linkjaxbadapter/JaxbAdapterEx.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/api/rs/core/linkjaxbadapter/JaxbAdapterEx.java
deleted file mode 100644
index a8b9192..0000000
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/api/rs/core/linkjaxbadapter/JaxbAdapterEx.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 2014, 2020 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package ee.jakarta.tck.ws.rs.api.rs.core.linkjaxbadapter;
-
-import jakarta.ws.rs.core.Link;
-import jakarta.ws.rs.core.Link.JaxbAdapter;
-import jakarta.ws.rs.core.Link.JaxbLink;
-import jakarta.xml.bind.annotation.adapters.XmlAdapter;
-
-public class JaxbAdapterEx extends XmlAdapter<JaxbLinkEx, Link> {
-
-    /**
-     * Convert a {@link JaxbLink} into a {@link Link}.
-     * 
-     * @param v instance of type {@link JaxbLink}.
-     * @return mapped instance of type {@link JaxbLink}
-     */
-    @Override
-    public Link unmarshal(JaxbLinkEx ex) {
-        JaxbLink link = new JaxbLink(ex.getUri(), ex.getParams());
-        return new JaxbAdapter().unmarshal(link);
-    }
-
-    /**
-     * Convert a {@link Link} into a {@link JaxbLink}.
-     * 
-     * @param v instance of type {@link Link}.
-     * @return mapped instance of type {@link JaxbLink}.
-     */
-    @Override
-    public JaxbLinkEx marshal(Link v) {
-        JaxbLink link = new JaxbAdapter().marshal(v);
-        JaxbLinkEx jle = new JaxbLinkEx(link.getUri(), link.getParams());
-        return jle;
-    }
-}
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/api/rs/core/linkjaxbadapter/JaxbLinkEx.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/api/rs/core/linkjaxbadapter/JaxbLinkEx.java
deleted file mode 100644
index c22a258..0000000
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/api/rs/core/linkjaxbadapter/JaxbLinkEx.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (c) 2014, 2020 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package ee.jakarta.tck.ws.rs.api.rs.core.linkjaxbadapter;
-
-import java.net.URI;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.xml.namespace.QName;
-
-import jakarta.xml.bind.annotation.XmlAnyAttribute;
-import jakarta.xml.bind.annotation.XmlAttribute;
-import jakarta.xml.bind.annotation.XmlRootElement;
-
-/**
- * JaxbLink with setters and xml annotations
- */
-@XmlRootElement
-public class JaxbLinkEx {
-
-    protected URI uri;
-
-    protected Map<QName, Object> params;
-
-    /**
-     * Default constructor needed during unmarshalling.
-     */
-    public JaxbLinkEx() {
-    }
-
-    /**
-     * Construct an instance from a URI and no parameters.
-     * 
-     * @param uri underlying URI.
-     */
-    public JaxbLinkEx(URI uri) {
-        this.uri = uri;
-    }
-
-    /**
-     * Construct an instance from a URI and some parameters.
-     * 
-     * @param uri    underlying URI.
-     * @param params parameters of this link.
-     */
-    public JaxbLinkEx(URI uri, Map<QName, Object> params) {
-        this.uri = uri;
-        this.params = params;
-    }
-
-    /**
-     * Get the underlying URI for this link.
-     * 
-     * @return underlying URI.
-     */
-    @XmlAttribute(name = "href")
-    public URI getUri() {
-        return uri;
-    }
-
-    /**
-     * Get the parameter map for this link.
-     * 
-     * @return parameter map.
-     */
-    @XmlAnyAttribute
-    public Map<QName, Object> getParams() {
-        if (params == null) {
-            params = new HashMap<QName, Object>();
-        }
-        return params;
-    }
-
-    public void setUri(final URI uri) {
-        this.uri = uri;
-    }
-
-    public void setParams(final Map<QName, Object> params) {
-        this.params = params;
-    }
-}
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/api/rs/core/linkjaxbadapter/Model.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/api/rs/core/linkjaxbadapter/Model.java
deleted file mode 100644
index f1f11bb..0000000
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/api/rs/core/linkjaxbadapter/Model.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2014, 2020 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package ee.jakarta.tck.ws.rs.api.rs.core.linkjaxbadapter;
-
-import jakarta.ws.rs.core.Link;
-import jakarta.ws.rs.ext.RuntimeDelegate;
-import jakarta.xml.bind.annotation.XmlAccessType;
-import jakarta.xml.bind.annotation.XmlAccessorType;
-import jakarta.xml.bind.annotation.XmlElement;
-import jakarta.xml.bind.annotation.XmlRootElement;
-import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-
-@XmlRootElement
-@XmlAccessorType(XmlAccessType.FIELD)
-public class Model {
-
-    public Model(Link link) {
-        super();
-        this.link = link;
-    }
-
-    public Model() {
-        link = RuntimeDelegate.getInstance().createLinkBuilder().uri("default://constructor.model/was/used").build();
-    }
-
-    @XmlElement
-    @XmlJavaTypeAdapter(JaxbAdapterEx.class)
-    Link link;
-
-    public Link getLink() {
-        return link;
-    }
-
-    public void setLink(Link lnk) {
-        link = lnk;
-    }
-}
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/api/rs/core/linkjaxblink/JAXRSClientIT.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/api/rs/core/linkjaxblink/JAXRSClientIT.java
deleted file mode 100644
index d4735bb..0000000
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/api/rs/core/linkjaxblink/JAXRSClientIT.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (c) 2014, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package ee.jakarta.tck.ws.rs.api.rs.core.linkjaxblink;
-
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.HashMap;
-
-import javax.xml.namespace.QName;
-
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.TestInfo;
-
-import jakarta.ws.rs.core.Link;
-import ee.jakarta.tck.ws.rs.common.JAXRSCommonClient;
-import ee.jakarta.tck.ws.rs.lib.util.TestUtil;
-
-/*
- * @class.setup_props: webServerHost;
- *                     webServerPort;
- *                     ts_home;
- */
-public class JAXRSClientIT extends JAXRSCommonClient {
-
-  private static final long serialVersionUID = -6053007016837644641L;
-
-  @BeforeEach
-  void logStartTest(TestInfo testInfo) {
-    TestUtil.logMsg("STARTING TEST : " + testInfo.getDisplayName());
-  }
-
-  @AfterEach
-  void logFinishTest(TestInfo testInfo) {
-    TestUtil.logMsg("FINISHED TEST : " + testInfo.getDisplayName());
-  }
-
-  /*
-   * @testName: defaultConstructorTest
-   * 
-   * @assertion_ids: JAXRS:JAVADOC:822; JAXRS:JAVADOC:820; JAXRS:JAVADOC:821;
-   * 
-   * @test_Strategy: Default constructor needed during unmarshalling.
-   * JaxbLink.getParams; JaxbLink.getUri
-   */
-  @Test
-  public void defaultConstructorTest() throws Fault {
-    Link.JaxbLink jaxbLink = new Link.JaxbLink();
-    boolean getUri = jaxbLink.getUri() == null || jaxbLink.getUri().toASCIIString() == null
-        || jaxbLink.getUri().toASCIIString().isEmpty();
-    assertTrue(getUri, "JaxbLink.getUri() is unexpectedly preset to " + jaxbLink.getUri());
-    logMsg("Link.JaxbLink.getUri() is empty as expected");
-    boolean params = jaxbLink.getParams() == null || jaxbLink.getParams().isEmpty();
-    assertTrue(params, "JaxbLink.getParams() is unexpectedly preset to " + jaxbLink.getParams());
-    logMsg("Link.JaxbLink.getParams() is empty as expected");
-  }
-
-  /*
-   * @testName: uriConstructorTest
-   * 
-   * @assertion_ids: JAXRS:JAVADOC:823; JAXRS:JAVADOC:820; JAXRS:JAVADOC:821;
-   * 
-   * @test_Strategy: Construct an instance from a URI and no parameters.
-   * JaxbLink.getParams; JaxbLink.getUri
-   */
-  @Test
-  public void uriConstructorTest() throws Fault {
-    String uri = "protocol://domain2.domain1:port";
-    URI fromString = uriFromString(uri);
-    Link.JaxbLink jaxbLink = new Link.JaxbLink(fromString);
-
-    boolean getUri = jaxbLink.getUri().equals(fromString);
-    assertTrue(getUri, "JaxbLink.getUri() is unexpectedly preset to " + jaxbLink.getUri());
-    logMsg("Link.JaxbLink.getUri() is", uri, "as expected");
-
-    boolean params = jaxbLink.getParams() == null || jaxbLink.getParams().isEmpty();
-    assertTrue(params, "JaxbLink.getParams() is unexpectedly preset to " + jaxbLink.getParams());
-    logMsg("Link.JaxbLink.getParams() is empty as expected");
-  }
-
-  /*
-   * @testName: uriParamsConstructorTest
-   * 
-   * @assertion_ids: JAXRS:JAVADOC:824; JAXRS:JAVADOC:820; JAXRS:JAVADOC:821;
-   * 
-   * @test_Strategy: Construct an instance from a URI and some parameters.
-   * JaxbLink.getParams; JaxbLink.getUri
-   */
-  @Test
-  public void uriParamsConstructorTest() throws Fault {
-    String uri = "protocol://domain2.domain1:port";
-    String q = "qName";
-    QName qName = new QName(q);
-    URI fromString = uriFromString(uri);
-    java.util.Map<QName, Object> map;
-    map = new HashMap<QName, Object>();
-    map.put(qName, q);
-    Link.JaxbLink jaxbLink = new Link.JaxbLink(fromString, map);
-
-    boolean getUri = jaxbLink.getUri().equals(fromString);
-    assertTrue(getUri, "JaxbLink.getUri() is unexpectedly preset to " + jaxbLink.getUri());
-    logMsg("Link.JaxbLink.getUri() is", uri, "as expected");
-
-    boolean params = jaxbLink.getParams().containsKey(qName) && jaxbLink.getParams().get(qName).equals(q);
-    assertTrue(params, "JaxbLink.getParams() is unexpectedly set to " + jaxbLink.getParams());
-    logMsg("Link.JaxbLink.getParams() contains", q, "as expected");
-  }
-
-  // //////////////////////////////////////////////////////////////////////
-  private static URI uriFromString(String uri) throws Fault {
-    URI fromString = null;
-    try {
-      fromString = new URI(uri);
-    } catch (URISyntaxException e) {
-      throw new Fault(e);
-    }
-    return fromString;
-  }
-}
diff --git a/pom.xml b/pom.xml
index a6d5248..89297d4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -110,7 +110,6 @@
         <inject.api.version>2.0.0</inject.api.version>
         <validation.api.version>3.0.0</validation.api.version>
         <concurrent.api.version>2.0.0</concurrent.api.version>
-        <xml.binding.api.version>4.0.0</xml.binding.api.version>
         <cdi.api.version>3.0.0</cdi.api.version>
         <junit.version>5.10.2</junit.version>
         <org.glassfish.jaxb.version>4.0.3</org.glassfish.jaxb.version>
@@ -171,133 +170,6 @@
                 <version>${concurrent.api.version}</version>
             </dependency>
             <dependency>
-                <groupId>jakarta.xml.bind</groupId>
-                <artifactId>jakarta.xml.bind-api</artifactId>
-                <version>${xml.binding.api.version}</version>
-            </dependency>
-            <!-- JAXB Implementation -->
-            <dependency>
-                <groupId>org.glassfish.jaxb</groupId>
-                <artifactId>codemodel</artifactId>
-                <version>${org.glassfish.jaxb.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>*</groupId>
-                        <artifactId>*</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>org.glassfish.jaxb</groupId>
-                <artifactId>jaxb-core</artifactId>
-                <version>${org.glassfish.jaxb.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>*</groupId>
-                        <artifactId>*</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>org.glassfish.jaxb</groupId>
-                <artifactId>jaxb-jxc</artifactId>
-                <version>${org.glassfish.jaxb.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>*</groupId>
-                        <artifactId>*</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>org.glassfish.jaxb</groupId>
-                <artifactId>jaxb-runtime</artifactId>
-                <version>${org.glassfish.jaxb.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>*</groupId>
-                        <artifactId>*</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>org.glassfish.jaxb</groupId>
-                <artifactId>txw2</artifactId>
-                <version>${org.glassfish.jaxb.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>*</groupId>
-                        <artifactId>*</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>org.glassfish.jaxb</groupId>
-                <artifactId>jaxb-xjc</artifactId>
-                <version>${org.glassfish.jaxb.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>*</groupId>
-                        <artifactId>*</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>org.glassfish.jaxb</groupId>
-                <artifactId>xsom</artifactId>
-                <version>${org.glassfish.jaxb.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>*</groupId>
-                        <artifactId>*</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <dependency>
-                <groupId>com.sun.istack</groupId>
-                <artifactId>istack-commons-runtime</artifactId>
-                <version>${com.sun.istack.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>*</groupId>
-                        <artifactId>*</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>com.sun.istack</groupId>
-                <artifactId>istack-commons-tools</artifactId>
-                <version>${com.sun.istack.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>*</groupId>
-                        <artifactId>*</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>com.sun.xml.bind.external</groupId>
-                <artifactId>relaxng-datatype</artifactId>
-                <version>${org.glassfish.jaxb.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.sun.xml.bind.external</groupId>
-                <artifactId>rngom</artifactId>
-                <version>${org.glassfish.jaxb.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>relaxngDatatype</groupId>
-                        <artifactId>relaxngDatatype</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>com.sun.xml.bind.external</groupId>
-                        <artifactId>relaxng-datatype</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <!-- End JAXB Implementation -->
-            <dependency>
                 <groupId>org.hamcrest</groupId>
                 <artifactId>hamcrest</artifactId>
                 <version>${hamcrest.version}</version>
