Merge remote-tracking branch 'origin/master' into 'origin/3.x'

Signed-off-by: Maxim Nesen <maxim.nesen@oracle.com>
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 e960ea3..5ccc9bc 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
@@ -101,12 +101,19 @@
                     <war>\${project.build.directory}/\${project.build.finalName}.war</war>
                 </configuration>
             </plugin>
+            <plugin>
+                <!-- Surefire support for JUnit-5 -->
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>${surefire.mvn.plugin.version}</version>
+            </plugin>
         </plugins>
     </build>
 
     <properties>
         <jersey.version>${project.version}</jersey.version>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <jetty.version>11.0.0.beta3</jetty.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <surefire.mvn.plugin.version>3.0.0-M7</surefire.mvn.plugin.version>
     </properties>
 </project>
\ No newline at end of file
diff --git a/archetypes/jersey-quickstart-grizzly2/src/main/resources/archetype-resources/pom.xml b/archetypes/jersey-quickstart-grizzly2/src/main/resources/archetype-resources/pom.xml
index 9dcb68b..0519417 100644
--- a/archetypes/jersey-quickstart-grizzly2/src/main/resources/archetype-resources/pom.xml
+++ b/archetypes/jersey-quickstart-grizzly2/src/main/resources/archetype-resources/pom.xml
@@ -72,6 +72,12 @@
                     <mainClass>\${package}.Main</mainClass>
                 </configuration>
             </plugin>
+            <plugin>
+                <!-- Surefire support for JUnit-5 -->
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>${surefire.mvn.plugin.version}</version>
+            </plugin>
         </plugins>
     </build>
 
@@ -79,5 +85,6 @@
         <jersey.version>${project.version}</jersey.version>
         <junit-jupiter.version>5.9.1</junit-jupiter.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <surefire.mvn.plugin.version>3.0.0-M7</surefire.mvn.plugin.version>
     </properties>
 </project>
diff --git a/connectors/jetty-connector/src/main/java11/org/glassfish/jersey/jetty/connector/JettyConnector.java b/connectors/jetty-connector/src/main/java11/org/glassfish/jersey/jetty/connector/JettyConnector.java
index 33749a2..3ede8a9 100644
--- a/connectors/jetty-connector/src/main/java11/org/glassfish/jersey/jetty/connector/JettyConnector.java
+++ b/connectors/jetty-connector/src/main/java11/org/glassfish/jersey/jetty/connector/JettyConnector.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2022 Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -159,7 +159,7 @@
         }
         if (httpClient == null) {
             final SSLContext sslContext = jaxrsClient.getSslContext();
-            final SslContextFactory.Client sslContextFactory = new SslContextFactory.Client();
+            final SslContextFactory.Client sslContextFactory = new SslContextFactory.Client(false);
             sslContextFactory.setSslContext(sslContext);
             final ClientConnector connector = new ClientConnector();
             connector.setSslContextFactory(sslContextFactory);
@@ -170,8 +170,12 @@
 
         Boolean enableHostnameVerification = (Boolean) config.getProperties()
                 .get(JettyClientProperties.ENABLE_SSL_HOSTNAME_VERIFICATION);
-        if (enableHostnameVerification != null && enableHostnameVerification) {
-            client.getSslContextFactory().setEndpointIdentificationAlgorithm("https");
+        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);
diff --git a/containers/netty-http/src/main/java/org/glassfish/jersey/netty/httpserver/NettyResponseWriter.java b/containers/netty-http/src/main/java/org/glassfish/jersey/netty/httpserver/NettyResponseWriter.java
index aa0a85f..3d4311a 100644
--- a/containers/netty-http/src/main/java/org/glassfish/jersey/netty/httpserver/NettyResponseWriter.java
+++ b/containers/netty-http/src/main/java/org/glassfish/jersey/netty/httpserver/NettyResponseWriter.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 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
@@ -105,7 +105,7 @@
 
         if (contentLength == -1) {
             HttpUtil.setTransferEncodingChunked(response, true);
-        } else {
+        } else if (req.method() != HttpMethod.HEAD || !response.headers().contains(HttpHeaderNames.CONTENT_LENGTH)) {
             response.headers().set(HttpHeaderNames.CONTENT_LENGTH, contentLength);
         }
 
diff --git a/core-client/src/main/java/org/glassfish/jersey/client/ChunkedInputReader.java b/core-client/src/main/java/org/glassfish/jersey/client/ChunkedInputReader.java
index 8ecbfaa..74c8cfb 100644
--- a/core-client/src/main/java/org/glassfish/jersey/client/ChunkedInputReader.java
+++ b/core-client/src/main/java/org/glassfish/jersey/client/ChunkedInputReader.java
@@ -24,6 +24,7 @@
 import jakarta.ws.rs.ConstrainedTo;
 import jakarta.ws.rs.RuntimeType;
 import jakarta.ws.rs.WebApplicationException;
+import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.MultivaluedMap;
 import jakarta.ws.rs.ext.MessageBodyReader;
@@ -47,8 +48,8 @@
     private final Provider<PropertiesDelegate> propertiesDelegateProvider;
 
     @Inject
-    public ChunkedInputReader(Provider<MessageBodyWorkers> messageBodyWorkers,
-                              Provider<PropertiesDelegate> propertiesDelegateProvider) {
+    public ChunkedInputReader(@Context Provider<MessageBodyWorkers> messageBodyWorkers,
+                              @Context Provider<PropertiesDelegate> propertiesDelegateProvider) {
         this.messageBodyWorkers = messageBodyWorkers;
         this.propertiesDelegateProvider = propertiesDelegateProvider;
     }
diff --git a/core-client/src/main/java/org/glassfish/jersey/client/filter/EncodingFilter.java b/core-client/src/main/java/org/glassfish/jersey/client/filter/EncodingFilter.java
index 8d773a6..9970203 100644
--- a/core-client/src/main/java/org/glassfish/jersey/client/filter/EncodingFilter.java
+++ b/core-client/src/main/java/org/glassfish/jersey/client/filter/EncodingFilter.java
@@ -25,6 +25,7 @@
 
 import jakarta.ws.rs.client.ClientRequestContext;
 import jakarta.ws.rs.client.ClientRequestFilter;
+import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.HttpHeaders;
 
 import jakarta.inject.Inject;
@@ -54,7 +55,7 @@
     private volatile List<Object> supportedEncodings = null;
 
     @Inject
-    public EncodingFilter(InjectionManager injectionManager) {
+    public EncodingFilter(@Context InjectionManager injectionManager) {
         this.injectionManager = injectionManager;
     }
 
diff --git a/core-client/src/test/java/org/glassfish/jersey/client/spi/PreInvocationInterceptorTest.java b/core-client/src/test/java/org/glassfish/jersey/client/spi/PreInvocationInterceptorTest.java
index deafb62..8c36b04 100644
--- a/core-client/src/test/java/org/glassfish/jersey/client/spi/PreInvocationInterceptorTest.java
+++ b/core-client/src/test/java/org/glassfish/jersey/client/spi/PreInvocationInterceptorTest.java
@@ -29,6 +29,7 @@
 import jakarta.ws.rs.client.ClientRequestFilter;
 import jakarta.ws.rs.client.Invocation;
 import jakarta.ws.rs.core.Configuration;
+import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.Response;
 import java.io.IOException;
 import java.util.concurrent.ExecutionException;
@@ -266,7 +267,7 @@
         private final Configuration configuration;
 
         @Inject
-        public InjectedPreInvocationInterceptor(Configuration configuration) {
+        public InjectedPreInvocationInterceptor(@Context Configuration configuration) {
             this.configuration = configuration;
         }
 
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 57c7d24..fa075fb 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
@@ -19,6 +19,7 @@
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 
+import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.ext.ContextResolver;
 import jakarta.ws.rs.ext.ExceptionMapper;
@@ -67,9 +68,9 @@
     private final Provider<ExceptionMappers> mappers;
 
     @Inject
-    public JaxrsProviders(Provider<MessageBodyWorkers> workers,
-                          Provider<ContextResolvers> resolvers,
-                          Provider<ExceptionMappers> mappers) {
+    public JaxrsProviders(@Context Provider<MessageBodyWorkers> workers,
+                          @Context Provider<ContextResolvers> resolvers,
+                          @Context Provider<ExceptionMappers> mappers) {
         this.workers = workers;
         this.resolvers = resolvers;
         this.mappers = mappers;
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/inject/ParamConverters.java b/core-common/src/main/java/org/glassfish/jersey/internal/inject/ParamConverters.java
index 1548ef8..b0984f5 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/inject/ParamConverters.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/inject/ParamConverters.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2023 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
@@ -21,7 +21,6 @@
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
-import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.security.AccessController;
 import java.text.ParseException;
@@ -36,7 +35,7 @@
 import jakarta.ws.rs.WebApplicationException;
 import jakarta.ws.rs.ext.ParamConverter;
 import jakarta.ws.rs.ext.ParamConverterProvider;
-
+import jakarta.ws.rs.core.Context;
 import jakarta.inject.Inject;
 import jakarta.inject.Singleton;
 
@@ -410,7 +409,7 @@
          * Create new aggregated {@link ParamConverterProvider param converter provider}.
          */
         @Inject
-        public AggregatedProvider(InjectionManager manager) {
+        public AggregatedProvider(@Context InjectionManager manager) {
             this.providers = new ParamConverterProvider[] {
                     // ordering is important (e.g. Date provider must be executed before String Constructor
                     // as Date has a deprecated String constructor
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/util/collection/GuardianStringKeyMultivaluedMap.java b/core-common/src/main/java/org/glassfish/jersey/internal/util/collection/GuardianStringKeyMultivaluedMap.java
index d92ac56..7e9e9f5 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/util/collection/GuardianStringKeyMultivaluedMap.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/util/collection/GuardianStringKeyMultivaluedMap.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 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
@@ -170,7 +170,9 @@
      */
     public boolean isObservedAndReset(String key) {
         Boolean observed = guards.get(key);
-        guards.put(key, false);
+        if (observed != null) {
+            guards.put(key, false);
+        }
         return observed != null && observed;
     }
 
@@ -178,6 +180,7 @@
         for (Map.Entry<String, Boolean> guard : guards.entrySet()) {
             if (guard.getKey().equals(key)) {
                 guard.setValue(true);
+                break;
             }
         }
     }
diff --git a/core-common/src/main/java/org/glassfish/jersey/message/internal/OutboundMessageContext.java b/core-common/src/main/java/org/glassfish/jersey/message/internal/OutboundMessageContext.java
index b9ab253..d33acc3 100644
--- a/core-common/src/main/java/org/glassfish/jersey/message/internal/OutboundMessageContext.java
+++ b/core-common/src/main/java/org/glassfish/jersey/message/internal/OutboundMessageContext.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2022 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 Public License v. 2.0, which is available at
@@ -114,7 +114,7 @@
         this.runtimeDelegateDecorator = RuntimeDelegateDecorator.configured(configuration);
         this.mediaTypeCache = mediaTypeCache();
 
-        headers.setGuard(HttpHeaders.CONTENT_LENGTH);
+        headers.setGuard(HttpHeaders.CONTENT_TYPE);
     }
 
     /**
@@ -125,7 +125,7 @@
      */
     public OutboundMessageContext(OutboundMessageContext original) {
         this.headers = new GuardianStringKeyMultivaluedMap<>(HeaderUtils.createOutbound());
-        this.headers.setGuard(HttpHeaders.CONTENT_LENGTH);
+        this.headers.setGuard(HttpHeaders.CONTENT_TYPE);
         this.headers.putAll(original.headers);
         this.committingOutputStream = new CommittingOutputStream();
         this.entityStream = committingOutputStream;
@@ -135,7 +135,7 @@
         this.entityAnnotations = original.entityAnnotations;
         this.configuration = original.configuration;
         this.runtimeDelegateDecorator = original.runtimeDelegateDecorator;
-        this.mediaTypeCache = original.mediaTypeCache();
+        this.mediaTypeCache = mediaTypeCache();
     }
 
     /**
diff --git a/core-common/src/main/java/org/glassfish/jersey/message/internal/ReaderWriter.java b/core-common/src/main/java/org/glassfish/jersey/message/internal/ReaderWriter.java
index f9ee35a..f6f271a 100644
--- a/core-common/src/main/java/org/glassfish/jersey/message/internal/ReaderWriter.java
+++ b/core-common/src/main/java/org/glassfish/jersey/message/internal/ReaderWriter.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2022 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
@@ -19,6 +19,7 @@
 import java.io.Closeable;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.io.Reader;
@@ -183,12 +184,19 @@
                     Math.min(buf.length - nread, remaining))) > 0) {
                 nread += n;
                 remaining -= n;
+
+                if (nread == BUFFER_SIZE) { // This differs from JDK version
+                    break;                  // prevents a bug (See ReaderWriterTest)
+                }
             }
 
             if (nread > 0) {
                 if (MAX_BUFFER_SIZE - total < nread) {
                     throw new OutOfMemoryError("Required array size too large");
                 }
+                if (nread < buf.length) {
+                    buf = Arrays.copyOfRange(buf, 0, nread);
+                }
                 total += nread;
                 if (result == null) {
                     result = buf;
diff --git a/core-common/src/main/java/org/glassfish/jersey/message/internal/SourceProvider.java b/core-common/src/main/java/org/glassfish/jersey/message/internal/SourceProvider.java
index 8d6a8ef..dd7bbf7 100644
--- a/core-common/src/main/java/org/glassfish/jersey/message/internal/SourceProvider.java
+++ b/core-common/src/main/java/org/glassfish/jersey/message/internal/SourceProvider.java
@@ -27,6 +27,7 @@
 import jakarta.ws.rs.Consumes;
 import jakarta.ws.rs.InternalServerErrorException;
 import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.MultivaluedMap;
 import jakarta.ws.rs.ext.MessageBodyReader;
@@ -96,7 +97,7 @@
         private final Provider<SAXParserFactory> spf;
 
         @Inject
-        public SaxSourceReader(Provider<SAXParserFactory> spf) {
+        public SaxSourceReader(@Context Provider<SAXParserFactory> spf) {
             this.spf = spf;
         }
 
@@ -137,7 +138,7 @@
         private final Provider<DocumentBuilderFactory> dbf;
 
         @Inject
-        public DomSourceReader(Provider<DocumentBuilderFactory> dbf) {
+        public DomSourceReader(@Context Provider<DocumentBuilderFactory> dbf) {
             this.dbf = dbf;
         }
 
@@ -179,8 +180,8 @@
         private final Provider<TransformerFactory> transformerFactory;
 
         @Inject
-        public SourceWriter(Provider<SAXParserFactory> spf,
-                            Provider<TransformerFactory> tf) {
+        public SourceWriter(@Context Provider<SAXParserFactory> spf,
+                            @Context Provider<TransformerFactory> tf) {
             this.saxParserFactory = spf;
             this.transformerFactory = tf;
         }
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/internal/routing/AbstractMethodSelectingRouter.java b/core-server/src/main/java/org/glassfish/jersey/server/internal/routing/AbstractMethodSelectingRouter.java
index 160bb17..76e96aa 100644
--- a/core-server/src/main/java/org/glassfish/jersey/server/internal/routing/AbstractMethodSelectingRouter.java
+++ b/core-server/src/main/java/org/glassfish/jersey/server/internal/routing/AbstractMethodSelectingRouter.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2021 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 Public License v. 2.0, which is available at
@@ -399,6 +399,7 @@
 
         final List<ConsumesProducesAcceptor> satisfyingAcceptors = new LinkedList<>();
         final Set<ResourceMethod> differentInvokableMethods = Collections.newSetFromMap(new IdentityHashMap<>());
+        final MediaType requestContentType = request.getMediaType();
         for (ConsumesProducesAcceptor cpi : acceptors) {
             if (cpi.isConsumable(request)) {
                 satisfyingAcceptors.add(cpi);
@@ -411,7 +412,6 @@
 
         final List<AcceptableMediaType> acceptableMediaTypes = request.getQualifiedAcceptableMediaTypes();
 
-        final MediaType requestContentType = request.getMediaType();
         final MediaType effectiveContentType = requestContentType == null ? MediaType.WILDCARD_TYPE : requestContentType;
 
         final MethodSelector methodSelector = selectMethod(acceptableMediaTypes, satisfyingAcceptors, effectiveContentType,
diff --git a/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/EntityInspectorImpl.java b/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/EntityInspectorImpl.java
index b5c0943..9854772 100644
--- a/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/EntityInspectorImpl.java
+++ b/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/EntityInspectorImpl.java
@@ -30,6 +30,7 @@
 
 import jakarta.inject.Inject;
 import jakarta.inject.Singleton;
+import jakarta.ws.rs.core.Context;
 
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.Providers;
@@ -59,7 +60,7 @@
      * @param injectionManager injection manager to be injected.
      */
     @Inject
-    public EntityInspectorImpl(final InjectionManager injectionManager, EntityGraphProvider graphProvider) {
+    public EntityInspectorImpl(@Context InjectionManager injectionManager, @Context EntityGraphProvider graphProvider) {
         Spliterator<EntityProcessor> entities =
                 Providers.getAllProviders(injectionManager, EntityProcessor.class, new RankedComparator<>()).spliterator();
         this.entityProcessors = StreamSupport.stream(entities, false).collect(Collectors.toList());
diff --git a/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/ObjectGraphProvider.java b/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/ObjectGraphProvider.java
index 9eb5933..b989c1b 100644
--- a/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/ObjectGraphProvider.java
+++ b/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/ObjectGraphProvider.java
@@ -23,6 +23,7 @@
 import org.glassfish.jersey.message.filtering.spi.ScopeProvider;
 
 import jakarta.inject.Inject;
+import jakarta.ws.rs.core.Context;
 
 /**
  * {@link org.glassfish.jersey.message.filtering.spi.ObjectProvider Object provider} and
@@ -34,9 +35,9 @@
 final class ObjectGraphProvider extends AbstractObjectProvider<ObjectGraph> {
 
     @Inject
-    public ObjectGraphProvider(ScopeProvider scopeProvider,
-                                  EntityInspector entityInspector,
-                                  EntityGraphProvider graphProvider) {
+    public ObjectGraphProvider(@Context ScopeProvider scopeProvider,
+                               @Context EntityInspector entityInspector,
+                               @Context EntityGraphProvider graphProvider) {
         super(scopeProvider, entityInspector, graphProvider);
     }
 
diff --git a/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/spi/AbstractObjectProvider.java b/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/spi/AbstractObjectProvider.java
index ce354db..de4884a 100644
--- a/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/spi/AbstractObjectProvider.java
+++ b/ext/entity-filtering/src/main/java/org/glassfish/jersey/message/filtering/spi/AbstractObjectProvider.java
@@ -25,6 +25,7 @@
 import java.util.Set;
 
 import jakarta.inject.Inject;
+import jakarta.ws.rs.core.Context;
 
 import org.glassfish.jersey.internal.guava.Cache;
 import org.glassfish.jersey.internal.guava.CacheBuilder;
@@ -50,9 +51,9 @@
     private EntityInspector entityInspector;
     private EntityGraphProvider graphProvider;
 
-    public AbstractObjectProvider(ScopeProvider scopeProvider,
-                                  EntityInspector entityInspector,
-                                  EntityGraphProvider graphProvider) {
+    public AbstractObjectProvider(@Context ScopeProvider scopeProvider,
+                                  @Context EntityInspector entityInspector,
+                                  @Context EntityGraphProvider graphProvider) {
         this.scopeProvider = scopeProvider;
         this.entityInspector = entityInspector;
         this.graphProvider = graphProvider;
diff --git a/ext/metainf-services/src/test/java/org/glassfish/jersey/message/MetaInfServicesTest.java b/ext/metainf-services/src/test/java/org/glassfish/jersey/message/MetaInfServicesTest.java
index 8458471..7dbad12 100644
--- a/ext/metainf-services/src/test/java/org/glassfish/jersey/message/MetaInfServicesTest.java
+++ b/ext/metainf-services/src/test/java/org/glassfish/jersey/message/MetaInfServicesTest.java
@@ -29,6 +29,7 @@
 import jakarta.ws.rs.client.Entity;
 import jakarta.ws.rs.core.Application;
 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;
@@ -73,7 +74,7 @@
     public static class MessageProvider implements MessageBodyReader<MetaInf>, MessageBodyWriter<MetaInf> {
 
         @Inject
-        MessageProvider(Configuration configuration) {
+        MessageProvider(@Context Configuration configuration) {
             this.config = configuration;
         }
         private Configuration config;
diff --git a/incubator/kryo/src/main/java/org/glassfish/jersey/kryo/internal/KryoMessageBodyProvider.java b/incubator/kryo/src/main/java/org/glassfish/jersey/kryo/internal/KryoMessageBodyProvider.java
index 124e7b2..0d4b7d1 100644
--- a/incubator/kryo/src/main/java/org/glassfish/jersey/kryo/internal/KryoMessageBodyProvider.java
+++ b/incubator/kryo/src/main/java/org/glassfish/jersey/kryo/internal/KryoMessageBodyProvider.java
@@ -27,6 +27,7 @@
 import jakarta.ws.rs.Consumes;
 import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.WebApplicationException;
+import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.MultivaluedMap;
 import jakarta.ws.rs.ext.ContextResolver;
@@ -55,7 +56,7 @@
     private final Optional<KryoPool> kryoPool;
 
     @Inject
-    public KryoMessageBodyProvider(Providers providers) {
+    public KryoMessageBodyProvider(@Context Providers providers) {
         final MediaType mediaType = new MediaType("application", "x-kryo");
         contextResolver = providers.getContextResolver(Kryo.class, mediaType);
         kryoPool = getKryoPool();
diff --git a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/DocumentBuilderFactoryInjectionProvider.java b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/DocumentBuilderFactoryInjectionProvider.java
index 00bac95..c6fa279 100644
--- a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/DocumentBuilderFactoryInjectionProvider.java
+++ b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/DocumentBuilderFactoryInjectionProvider.java
@@ -21,6 +21,7 @@
 import jakarta.ws.rs.core.Configuration;
 
 import jakarta.inject.Inject;
+import jakarta.ws.rs.core.Context;
 import javax.xml.parsers.DocumentBuilderFactory;
 
 /**
@@ -39,7 +40,8 @@
      */
     // TODO This provider should be registered and configured via a feature.
     @Inject
-    public DocumentBuilderFactoryInjectionProvider(final InjectionManager injectionManager, final Configuration config) {
+    public DocumentBuilderFactoryInjectionProvider(@Context final InjectionManager injectionManager,
+                                                   @Context final Configuration config) {
         super(config);
         this.injectionManager = injectionManager;
     }
diff --git a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/SaxParserFactoryInjectionProvider.java b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/SaxParserFactoryInjectionProvider.java
index c629439..f22ff63 100644
--- a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/SaxParserFactoryInjectionProvider.java
+++ b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/SaxParserFactoryInjectionProvider.java
@@ -20,7 +20,7 @@
 import org.glassfish.jersey.jaxb.FeatureSupplier;
 
 import jakarta.ws.rs.core.Configuration;
-
+import jakarta.ws.rs.core.Context;
 import jakarta.inject.Inject;
 import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;
@@ -50,7 +50,8 @@
      */
     // TODO This provider should be registered and configured via a feature.
     @Inject
-    public SaxParserFactoryInjectionProvider(final InjectionManager injectionManager, final Configuration config) {
+    public SaxParserFactoryInjectionProvider(@Context final InjectionManager injectionManager,
+                                             @Context final Configuration config) {
         super(config);
         this.injectionManager = injectionManager;
     }
diff --git a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/TransformerFactoryInjectionProvider.java b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/TransformerFactoryInjectionProvider.java
index 213c4ac..43acbb3 100644
--- a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/TransformerFactoryInjectionProvider.java
+++ b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/TransformerFactoryInjectionProvider.java
@@ -24,6 +24,7 @@
 import jakarta.ws.rs.core.Configuration;
 
 import jakarta.inject.Inject;
+import jakarta.ws.rs.core.Context;
 import javax.xml.XMLConstants;
 import javax.xml.transform.TransformerConfigurationException;
 import javax.xml.transform.TransformerFactory;
@@ -45,7 +46,8 @@
      */
     // TODO This provider should be registered and configured via a feature.
     @Inject
-    public TransformerFactoryInjectionProvider(final InjectionManager injectionManager, final Configuration config) {
+    public TransformerFactoryInjectionProvider(@Context final InjectionManager injectionManager,
+                                               @Context final Configuration config) {
         super(config);
         this.injectionManager = injectionManager;
     }
diff --git a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlCollectionJaxbProvider.java b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlCollectionJaxbProvider.java
index 4f0af6f..55ba54d 100644
--- a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlCollectionJaxbProvider.java
+++ b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlCollectionJaxbProvider.java
@@ -28,6 +28,7 @@
 import jakarta.ws.rs.Consumes;
 import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.core.Configuration;
+import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.ext.Providers;
 
@@ -73,7 +74,7 @@
     public static final class App extends XmlCollectionJaxbProvider {
 
         @Inject
-        public App(Provider<XMLInputFactory> xif, Providers ps, Configuration config) {
+        public App(@Context Provider<XMLInputFactory> xif, @Context Providers ps, @Context Configuration config) {
             super(xif, ps, MediaType.APPLICATION_XML_TYPE, config);
         }
     }
@@ -88,7 +89,7 @@
     public static final class Text extends XmlCollectionJaxbProvider {
 
         @Inject
-        public Text(Provider<XMLInputFactory> xif, Providers ps, Configuration config) {
+        public Text(@Context Provider<XMLInputFactory> xif, @Context Providers ps, @Context Configuration config) {
             super(xif, ps, MediaType.TEXT_XML_TYPE, config);
         }
     }
@@ -103,7 +104,7 @@
     public static final class General extends XmlCollectionJaxbProvider {
 
         @Inject
-        public General(Provider<XMLInputFactory> xif, Providers ps, Configuration config) {
+        public General(@Context Provider<XMLInputFactory> xif, @Context Providers ps, @Context Configuration config) {
             super(xif, ps, config);
         }
 
diff --git a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlInputFactoryInjectionProvider.java b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlInputFactoryInjectionProvider.java
index 24bb77e..648327d 100644
--- a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlInputFactoryInjectionProvider.java
+++ b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlInputFactoryInjectionProvider.java
@@ -21,6 +21,7 @@
 import jakarta.ws.rs.core.Configuration;
 
 import jakarta.inject.Inject;
+import jakarta.ws.rs.core.Context;
 import javax.xml.stream.XMLInputFactory;
 
 /**
@@ -38,7 +39,8 @@
      */
     // TODO This provider should be registered and configured via a feature.
     @Inject
-    public XmlInputFactoryInjectionProvider(final InjectionManager injectionManager, final Configuration config) {
+    public XmlInputFactoryInjectionProvider(@Context final InjectionManager injectionManager,
+                                            @Context final Configuration config) {
         super(config);
         this.injectionManager = injectionManager;
     }
diff --git a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlJaxbElementProvider.java b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlJaxbElementProvider.java
index 10b3646..5a6de8a 100644
--- a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlJaxbElementProvider.java
+++ b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlJaxbElementProvider.java
@@ -24,6 +24,7 @@
 import jakarta.ws.rs.Consumes;
 import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.core.Configuration;
+import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.ext.Providers;
 
@@ -67,7 +68,7 @@
     public static final class App extends XmlJaxbElementProvider {
 
         @Inject
-        public App(Provider<SAXParserFactory> spf, Providers ps, Configuration config) {
+        public App(@Context Provider<SAXParserFactory> spf, @Context Providers ps, @Context Configuration config) {
             super(spf, ps, MediaType.APPLICATION_XML_TYPE, config);
         }
     }
@@ -82,7 +83,7 @@
     public static final class Text extends XmlJaxbElementProvider {
 
         @Inject
-        public Text(Provider<SAXParserFactory> spf, Providers ps, Configuration config) {
+        public Text(@Context Provider<SAXParserFactory> spf, @Context Providers ps, @Context Configuration config) {
             super(spf, ps, MediaType.TEXT_XML_TYPE, config);
         }
     }
@@ -97,7 +98,7 @@
     public static final class General extends XmlJaxbElementProvider {
 
         @Inject
-        public General(Provider<SAXParserFactory> spf, Providers ps, Configuration config) {
+        public General(@Context Provider<SAXParserFactory> spf, @Context Providers ps, @Context Configuration config) {
             super(spf, ps, config);
         }
 
diff --git a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlRootElementJaxbProvider.java b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlRootElementJaxbProvider.java
index 397b9ae..69d59ee 100644
--- a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlRootElementJaxbProvider.java
+++ b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlRootElementJaxbProvider.java
@@ -22,6 +22,7 @@
 import jakarta.ws.rs.Consumes;
 import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.core.Configuration;
+import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.ext.Providers;
 
@@ -69,7 +70,7 @@
     public static final class App extends XmlRootElementJaxbProvider {
 
         @Inject
-        public App(Provider<SAXParserFactory> spf, Providers ps, Configuration config) {
+        public App(@Context Provider<SAXParserFactory> spf, @Context Providers ps, @Context Configuration config) {
             super(spf, ps, MediaType.APPLICATION_XML_TYPE, config);
         }
     }
@@ -85,7 +86,7 @@
     public static final class Text extends XmlRootElementJaxbProvider {
 
         @Inject
-        public Text(Provider<SAXParserFactory> spf, Providers ps, Configuration config) {
+        public Text(@Context Provider<SAXParserFactory> spf, @Context Providers ps, @Context Configuration config) {
             super(spf, ps, MediaType.TEXT_XML_TYPE, config);
         }
     }
@@ -101,7 +102,7 @@
     public static final class General extends XmlRootElementJaxbProvider {
 
         @Inject
-        public General(Provider<SAXParserFactory> spf, Providers ps, Configuration config) {
+        public General(@Context Provider<SAXParserFactory> spf, @Context Providers ps, @Context Configuration config) {
             super(spf, ps, config);
         }
 
diff --git a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlRootObjectJaxbProvider.java b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlRootObjectJaxbProvider.java
index 76e61a1..d0f1bd3 100644
--- a/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlRootObjectJaxbProvider.java
+++ b/media/jaxb/src/main/java/org/glassfish/jersey/jaxb/internal/XmlRootObjectJaxbProvider.java
@@ -29,6 +29,7 @@
 import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.WebApplicationException;
 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.NoContentException;
@@ -81,7 +82,7 @@
     public static final class App extends XmlRootObjectJaxbProvider {
 
         @Inject
-        public App(Provider<SAXParserFactory> spf, Providers ps, Configuration config) {
+        public App(@Context Provider<SAXParserFactory> spf, @Context Providers ps, @Context Configuration config) {
             super(spf, ps, MediaType.APPLICATION_XML_TYPE, config);
         }
     }
@@ -96,7 +97,7 @@
     public static final class Text extends XmlRootObjectJaxbProvider {
 
         @Inject
-        public Text(Provider<SAXParserFactory> spf, Providers ps, Configuration config) {
+        public Text(@Context Provider<SAXParserFactory> spf, @Context Providers ps, @Context Configuration config) {
             super(spf, ps, MediaType.TEXT_XML_TYPE, config);
         }
     }
@@ -111,7 +112,7 @@
     public static final class General extends XmlRootObjectJaxbProvider {
 
         @Inject
-        public General(Provider<SAXParserFactory> spf, Providers ps, Configuration config) {
+        public General(@Context Provider<SAXParserFactory> spf, @Context Providers ps, @Context Configuration config) {
             super(spf, ps, config);
         }
 
diff --git a/media/json-binding/src/main/java/org/glassfish/jersey/jsonb/internal/JsonBindingProvider.java b/media/json-binding/src/main/java/org/glassfish/jersey/jsonb/internal/JsonBindingProvider.java
index c2ffe9e..693a9d3 100644
--- a/media/json-binding/src/main/java/org/glassfish/jersey/jsonb/internal/JsonBindingProvider.java
+++ b/media/json-binding/src/main/java/org/glassfish/jersey/jsonb/internal/JsonBindingProvider.java
@@ -39,6 +39,7 @@
 import jakarta.ws.rs.ProcessingException;
 import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.WebApplicationException;
+import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.MultivaluedMap;
 import jakarta.ws.rs.core.NoContentException;
@@ -62,7 +63,7 @@
     private final Providers providers;
 
     @Inject
-    public JsonBindingProvider(Providers providers) {
+    public JsonBindingProvider(@Context Providers providers) {
         this.providers = providers;
     }
 
diff --git a/media/json-gson/src/main/java/org/glassfish/jersey/gson/internal/JsonGsonProvider.java b/media/json-gson/src/main/java/org/glassfish/jersey/gson/internal/JsonGsonProvider.java
index ec86d03..96d0b1a 100644
--- a/media/json-gson/src/main/java/org/glassfish/jersey/gson/internal/JsonGsonProvider.java
+++ b/media/json-gson/src/main/java/org/glassfish/jersey/gson/internal/JsonGsonProvider.java
@@ -28,6 +28,7 @@
 import jakarta.ws.rs.ProcessingException;
 import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.WebApplicationException;
+import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.MultivaluedMap;
 import jakarta.ws.rs.core.NoContentException;
@@ -57,7 +58,7 @@
     private Providers providers;
 
     @Inject
-    public JsonGsonProvider(Providers providers) {
+    public JsonGsonProvider(@Context Providers providers) {
         this.providers = providers;
     }
 
diff --git a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/DefaultJacksonJaxbJsonProvider.java b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/DefaultJacksonJaxbJsonProvider.java
index 9abfbf1..393522d 100644
--- a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/DefaultJacksonJaxbJsonProvider.java
+++ b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/DefaultJacksonJaxbJsonProvider.java
@@ -28,6 +28,7 @@
 import jakarta.inject.Inject;
 import jakarta.inject.Singleton;
 import jakarta.ws.rs.core.Configuration;
+import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.ext.Providers;
 
 /**
@@ -38,7 +39,7 @@
     private Configuration commonConfig;
 
     @Inject
-    public DefaultJacksonJaxbJsonProvider(Providers providers, Configuration config) {
+    public DefaultJacksonJaxbJsonProvider(@Context Providers providers, @Context Configuration config) {
         super(new JacksonMapperConfigurator(null, DEFAULT_ANNOTATIONS));
         this.commonConfig = config;
         _providers = providers;
@@ -51,8 +52,10 @@
         super(new JacksonMapperConfigurator(null, DEFAULT_ANNOTATIONS));
     }
 
-    public DefaultJacksonJaxbJsonProvider(final Annotations... annotationsToUse) {
+    public DefaultJacksonJaxbJsonProvider(Providers providers, Configuration config, Annotations... annotationsToUse) {
         super(new JacksonMapperConfigurator(null, annotationsToUse));
+        this.commonConfig = config;
+        _providers = providers;
     }
 
     @PostConstruct
diff --git a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/FilteringJacksonJaxbJsonProvider.java b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/FilteringJacksonJaxbJsonProvider.java
index 486ec09..5767040 100644
--- a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/FilteringJacksonJaxbJsonProvider.java
+++ b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/FilteringJacksonJaxbJsonProvider.java
@@ -23,6 +23,7 @@
 import java.lang.reflect.Type;
 
 import jakarta.ws.rs.core.Configuration;
+import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.MultivaluedMap;
 
@@ -62,8 +63,9 @@
     private final Provider<ObjectProvider<FilterProvider>> provider;
 
     @Inject
-    public FilteringJacksonJaxbJsonProvider(Provider<ObjectProvider<FilterProvider>> provider,
-                                            Providers providers, Configuration config) {
+    public FilteringJacksonJaxbJsonProvider(@Context Provider<ObjectProvider<FilterProvider>> provider,
+                                            @Context Providers providers,
+                                            @Context Configuration config) {
         super(providers, config);
         this.provider = provider;
     }
diff --git a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/JacksonObjectProvider.java b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/JacksonObjectProvider.java
index b4b37f4..a12d4d0 100644
--- a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/JacksonObjectProvider.java
+++ b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/JacksonObjectProvider.java
@@ -40,6 +40,7 @@
 import org.glassfish.jersey.message.filtering.spi.ScopeProvider;
 
 import jakarta.inject.Inject;
+import jakarta.ws.rs.core.Context;
 
 /**
  * @author Michal Gajdos
@@ -47,9 +48,9 @@
 final class JacksonObjectProvider extends AbstractObjectProvider<FilterProvider> {
 
     @Inject
-    public JacksonObjectProvider(ScopeProvider scopeProvider,
-                                  EntityInspector entityInspector,
-                                  EntityGraphProvider graphProvider) {
+    public JacksonObjectProvider(@Context ScopeProvider scopeProvider,
+                                 @Context EntityInspector entityInspector,
+                                 @Context EntityGraphProvider graphProvider) {
         super(scopeProvider, entityInspector, graphProvider);
     }
 
diff --git a/media/json-jackson/src/test/java/org/glassfish/jersey/jackson/internal/DefaultJsonJacksonProviderForDisabledModulesTest.java b/media/json-jackson/src/test/java/org/glassfish/jersey/jackson/internal/DefaultJsonJacksonProviderForDisabledModulesTest.java
index 9b7beb9..e75400a 100644
--- a/media/json-jackson/src/test/java/org/glassfish/jersey/jackson/internal/DefaultJsonJacksonProviderForDisabledModulesTest.java
+++ b/media/json-jackson/src/test/java/org/glassfish/jersey/jackson/internal/DefaultJsonJacksonProviderForDisabledModulesTest.java
@@ -29,6 +29,7 @@
 import jakarta.inject.Inject;
 import jakarta.ws.rs.core.Application;
 import jakarta.ws.rs.core.Configuration;
+import jakarta.ws.rs.core.Context;
 
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -55,7 +56,7 @@
     private static class TestJacksonJaxbJsonProvider extends JacksonJaxbJsonProvider {
 
         @Inject
-        public TestJacksonJaxbJsonProvider(Configuration configuration) {
+        public TestJacksonJaxbJsonProvider(@Context Configuration configuration) {
             this.configuration = configuration;
         }
         private Configuration configuration;
diff --git a/media/json-jettison/src/main/java/org/glassfish/jersey/jettison/internal/entity/JettisonJaxbElementProvider.java b/media/json-jettison/src/main/java/org/glassfish/jersey/jettison/internal/entity/JettisonJaxbElementProvider.java
index e8c3ac6..554feff 100644
--- a/media/json-jettison/src/main/java/org/glassfish/jersey/jettison/internal/entity/JettisonJaxbElementProvider.java
+++ b/media/json-jettison/src/main/java/org/glassfish/jersey/jettison/internal/entity/JettisonJaxbElementProvider.java
@@ -28,6 +28,7 @@
 import jakarta.ws.rs.Consumes;
 import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.core.Configuration;
+import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.ext.Providers;
 
@@ -71,7 +72,7 @@
     public static final class App extends JettisonJaxbElementProvider {
 
         @Inject
-        public App(Providers ps, Configuration config) {
+        public App(@Context Providers ps, @Context Configuration config) {
             super(ps, MediaType.APPLICATION_JSON_TYPE, config);
         }
     }
@@ -81,7 +82,7 @@
     public static final class General extends JettisonJaxbElementProvider {
 
         @Inject
-        public General(Providers ps, Configuration config) {
+        public General(@Context Providers ps, @Context Configuration config) {
             super(ps, config);
         }
 
diff --git a/media/json-jettison/src/main/java/org/glassfish/jersey/jettison/internal/entity/JettisonListElementProvider.java b/media/json-jettison/src/main/java/org/glassfish/jersey/jettison/internal/entity/JettisonListElementProvider.java
index 61380c1..15799fd 100644
--- a/media/json-jettison/src/main/java/org/glassfish/jersey/jettison/internal/entity/JettisonListElementProvider.java
+++ b/media/json-jettison/src/main/java/org/glassfish/jersey/jettison/internal/entity/JettisonListElementProvider.java
@@ -32,6 +32,7 @@
 import jakarta.ws.rs.Consumes;
 import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.core.Configuration;
+import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.ext.Providers;
 
@@ -77,7 +78,7 @@
     @Consumes("application/json")
     public static final class App extends JettisonListElementProvider {
         @Inject
-        public App(Providers ps, Configuration config) {
+        public App(@Context Providers ps, @Context Configuration config) {
             super(ps, MediaType.APPLICATION_JSON_TYPE, config);
         }
     }
@@ -87,7 +88,7 @@
     public static final class General extends JettisonListElementProvider {
 
         @Inject
-        public General(Providers ps, Configuration config) {
+        public General(@Context Providers ps, @Context Configuration config) {
             super(ps, config);
         }
 
diff --git a/media/json-jettison/src/main/java/org/glassfish/jersey/jettison/internal/entity/JettisonRootElementProvider.java b/media/json-jettison/src/main/java/org/glassfish/jersey/jettison/internal/entity/JettisonRootElementProvider.java
index b43ea1d..a581ca8 100644
--- a/media/json-jettison/src/main/java/org/glassfish/jersey/jettison/internal/entity/JettisonRootElementProvider.java
+++ b/media/json-jettison/src/main/java/org/glassfish/jersey/jettison/internal/entity/JettisonRootElementProvider.java
@@ -28,6 +28,7 @@
 import jakarta.ws.rs.Consumes;
 import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.core.Configuration;
+import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.ext.Providers;
 
@@ -71,7 +72,7 @@
     @Consumes("application/json")
     public static final class App extends JettisonRootElementProvider {
         @Inject
-        public App(Providers ps, Configuration config) {
+        public App(@Context Providers ps, @Context Configuration config) {
             super(ps, MediaType.APPLICATION_JSON_TYPE, config);
         }
     }
@@ -80,7 +81,7 @@
     @Consumes("*/*")
     public static final class General extends JettisonRootElementProvider {
         @Inject
-        public General(Providers ps, Configuration config) {
+        public General(@Context Providers ps, @Context Configuration config) {
             super(ps, config);
         }
 
diff --git a/media/moxy/src/main/java/org/glassfish/jersey/moxy/internal/MoxyObjectProvider.java b/media/moxy/src/main/java/org/glassfish/jersey/moxy/internal/MoxyObjectProvider.java
index 0e33d25..ff367e7 100644
--- a/media/moxy/src/main/java/org/glassfish/jersey/moxy/internal/MoxyObjectProvider.java
+++ b/media/moxy/src/main/java/org/glassfish/jersey/moxy/internal/MoxyObjectProvider.java
@@ -21,6 +21,7 @@
 import java.util.Set;
 
 import jakarta.inject.Inject;
+import jakarta.ws.rs.core.Context;
 import jakarta.xml.bind.JAXBException;
 
 import org.glassfish.jersey.message.filtering.spi.AbstractObjectProvider;
@@ -52,9 +53,9 @@
     }
 
     @Inject
-    public MoxyObjectProvider(ScopeProvider scopeProvider,
-                              EntityInspector entityInspector,
-                              EntityGraphProvider graphProvider) {
+    public MoxyObjectProvider(@Context ScopeProvider scopeProvider,
+                              @Context EntityInspector entityInspector,
+                              @Context EntityGraphProvider graphProvider) {
         super(scopeProvider, entityInspector, graphProvider);
     }
 
diff --git a/media/moxy/src/main/java/org/glassfish/jersey/moxy/json/internal/ConfigurableMoxyJsonProvider.java b/media/moxy/src/main/java/org/glassfish/jersey/moxy/json/internal/ConfigurableMoxyJsonProvider.java
index 6d07e04..541d545 100644
--- a/media/moxy/src/main/java/org/glassfish/jersey/moxy/json/internal/ConfigurableMoxyJsonProvider.java
+++ b/media/moxy/src/main/java/org/glassfish/jersey/moxy/json/internal/ConfigurableMoxyJsonProvider.java
@@ -29,6 +29,7 @@
 import jakarta.inject.Inject;
 import jakarta.inject.Singleton;
 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.ext.ContextResolver;
@@ -80,7 +81,7 @@
     private final Configuration config;
 
     @Inject
-    public ConfigurableMoxyJsonProvider(Providers providers, Configuration config) {
+    public ConfigurableMoxyJsonProvider(@Context Providers providers, @Context Configuration config) {
         this.providers = providers;
         this.config = config;
     }
diff --git a/media/moxy/src/main/java/org/glassfish/jersey/moxy/json/internal/FilteringMoxyJsonProvider.java b/media/moxy/src/main/java/org/glassfish/jersey/moxy/json/internal/FilteringMoxyJsonProvider.java
index 2a0ef42..e45f1cb 100644
--- a/media/moxy/src/main/java/org/glassfish/jersey/moxy/json/internal/FilteringMoxyJsonProvider.java
+++ b/media/moxy/src/main/java/org/glassfish/jersey/moxy/json/internal/FilteringMoxyJsonProvider.java
@@ -20,6 +20,7 @@
 import java.lang.reflect.Type;
 
 import jakarta.ws.rs.core.Configuration;
+import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.MultivaluedMap;
 
@@ -46,9 +47,9 @@
     private final Provider<ObjectProvider<ObjectGraph>> provider;
 
     @Inject
-    public FilteringMoxyJsonProvider(Provider<ObjectProvider<ObjectGraph>> provider,
-                                     Providers providers,
-                                     Configuration config) {
+    public FilteringMoxyJsonProvider(@Context Provider<ObjectProvider<ObjectGraph>> provider,
+                                     @Context Providers providers,
+                                     @Context Configuration config) {
         super(providers, config);
         this.provider = provider;
     }
diff --git a/media/multipart/src/main/java/org/glassfish/jersey/media/multipart/internal/MultiPartReaderClientSide.java b/media/multipart/src/main/java/org/glassfish/jersey/media/multipart/internal/MultiPartReaderClientSide.java
index d8d4762..c867078 100644
--- a/media/multipart/src/main/java/org/glassfish/jersey/media/multipart/internal/MultiPartReaderClientSide.java
+++ b/media/multipart/src/main/java/org/glassfish/jersey/media/multipart/internal/MultiPartReaderClientSide.java
@@ -32,6 +32,7 @@
 import jakarta.ws.rs.Consumes;
 import jakarta.ws.rs.RuntimeType;
 import jakarta.ws.rs.WebApplicationException;
+import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.HttpHeaders;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.MultivaluedMap;
@@ -84,7 +85,8 @@
      * application.
      */
     @Inject
-    public MultiPartReaderClientSide(final Providers providers, Provider<MessageBodyWorkers> messageBodyWorkers) {
+    public MultiPartReaderClientSide(@Context final Providers providers,
+                                     @Context final Provider<MessageBodyWorkers> messageBodyWorkers) {
         final ContextResolver<MultiPartProperties> contextResolver =
                 providers.getContextResolver(MultiPartProperties.class, MediaType.WILDCARD_TYPE);
 
diff --git a/media/multipart/src/main/java/org/glassfish/jersey/media/multipart/internal/MultiPartReaderServerSide.java b/media/multipart/src/main/java/org/glassfish/jersey/media/multipart/internal/MultiPartReaderServerSide.java
index 59c4c58..24c0214 100644
--- a/media/multipart/src/main/java/org/glassfish/jersey/media/multipart/internal/MultiPartReaderServerSide.java
+++ b/media/multipart/src/main/java/org/glassfish/jersey/media/multipart/internal/MultiPartReaderServerSide.java
@@ -23,6 +23,7 @@
 
 import jakarta.ws.rs.ConstrainedTo;
 import jakarta.ws.rs.RuntimeType;
+import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.MultivaluedMap;
 import jakarta.ws.rs.ext.MessageBodyReader;
@@ -52,9 +53,9 @@
     private final Provider<CloseableService> closeableServiceProvider;
 
     @Inject
-    public MultiPartReaderServerSide(final Providers providers,
-                                     final Provider<CloseableService> closeableServiceProvider,
-                                     final Provider<MessageBodyWorkers> messageBodyWorkers) {
+    public MultiPartReaderServerSide(@Context final Providers providers,
+                                     @Context final Provider<CloseableService> closeableServiceProvider,
+                                     @Context final Provider<MessageBodyWorkers> messageBodyWorkers) {
         super(providers, messageBodyWorkers);
         this.closeableServiceProvider = closeableServiceProvider;
     }
diff --git a/media/multipart/src/main/java/org/glassfish/jersey/media/multipart/internal/MultiPartWriter.java b/media/multipart/src/main/java/org/glassfish/jersey/media/multipart/internal/MultiPartWriter.java
index 5237d7e..7873872 100644
--- a/media/multipart/src/main/java/org/glassfish/jersey/media/multipart/internal/MultiPartWriter.java
+++ b/media/multipart/src/main/java/org/glassfish/jersey/media/multipart/internal/MultiPartWriter.java
@@ -30,6 +30,7 @@
 import jakarta.inject.Inject;
 import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.WebApplicationException;
+import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.HttpHeaders;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.MultivaluedMap;
@@ -65,7 +66,7 @@
     private final Providers providers;
 
     @Inject
-    public MultiPartWriter(final Providers providers) {
+    public MultiPartWriter(@Context final Providers providers) {
         this.providers = providers;
     }
 
diff --git a/media/sse/src/main/java/org/glassfish/jersey/media/sse/EventInputReader.java b/media/sse/src/main/java/org/glassfish/jersey/media/sse/EventInputReader.java
index 91ea8ba..c83400c 100644
--- a/media/sse/src/main/java/org/glassfish/jersey/media/sse/EventInputReader.java
+++ b/media/sse/src/main/java/org/glassfish/jersey/media/sse/EventInputReader.java
@@ -22,6 +22,7 @@
 import java.lang.reflect.Type;
 
 import jakarta.ws.rs.WebApplicationException;
+import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.MultivaluedMap;
 import jakarta.ws.rs.ext.MessageBodyReader;
@@ -44,7 +45,8 @@
     private final Provider<PropertiesDelegate> propertiesDelegateProvider;
 
     @Inject
-    EventInputReader(Provider<MessageBodyWorkers> messageBodyWorkers, Provider<PropertiesDelegate> propertiesDelegateProvider) {
+    EventInputReader(@Context Provider<MessageBodyWorkers> messageBodyWorkers,
+                     @Context Provider<PropertiesDelegate> propertiesDelegateProvider) {
         this.messageBodyWorkers = messageBodyWorkers;
         this.propertiesDelegateProvider = propertiesDelegateProvider;
     }
diff --git a/media/sse/src/main/java/org/glassfish/jersey/media/sse/OutboundEventWriter.java b/media/sse/src/main/java/org/glassfish/jersey/media/sse/OutboundEventWriter.java
index 18d9546..d2e7b85 100644
--- a/media/sse/src/main/java/org/glassfish/jersey/media/sse/OutboundEventWriter.java
+++ b/media/sse/src/main/java/org/glassfish/jersey/media/sse/OutboundEventWriter.java
@@ -23,6 +23,7 @@
 import java.nio.charset.Charset;
 
 import jakarta.ws.rs.WebApplicationException;
+import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.MultivaluedMap;
 import jakarta.ws.rs.ext.MessageBodyWriter;
@@ -55,7 +56,7 @@
     private final Provider<MessageBodyWorkers> workersProvider;
 
     @Inject
-    public OutboundEventWriter(Provider<MessageBodyWorkers> workersProvider) {
+    public OutboundEventWriter(@Context Provider<MessageBodyWorkers> workersProvider) {
         this.workersProvider = workersProvider;
     }
 
diff --git a/security/oauth1-client/src/main/java/org/glassfish/jersey/client/oauth1/OAuth1ClientFilter.java b/security/oauth1-client/src/main/java/org/glassfish/jersey/client/oauth1/OAuth1ClientFilter.java
index b3d466a..143c2ab 100644
--- a/security/oauth1-client/src/main/java/org/glassfish/jersey/client/oauth1/OAuth1ClientFilter.java
+++ b/security/oauth1-client/src/main/java/org/glassfish/jersey/client/oauth1/OAuth1ClientFilter.java
@@ -26,6 +26,7 @@
 import jakarta.annotation.Priority;
 import jakarta.inject.Inject;
 import jakarta.inject.Provider;
+import jakarta.ws.rs.core.Context;
 
 import org.glassfish.jersey.client.oauth1.internal.LocalizationMessages;
 import org.glassfish.jersey.message.MessageBodyWorkers;
@@ -52,7 +53,8 @@
     private Provider<MessageBodyWorkers> messageBodyWorkers;
 
     @Inject
-    public OAuth1ClientFilter(Provider<OAuth1Signature> oAuthSignature, Provider<MessageBodyWorkers> messageBodyWorkers) {
+    public OAuth1ClientFilter(@Context Provider<OAuth1Signature> oAuthSignature,
+                              @Context Provider<MessageBodyWorkers> messageBodyWorkers) {
         this.oAuthSignature = oAuthSignature;
         this.messageBodyWorkers = messageBodyWorkers;
     }
diff --git a/security/oauth2-client/src/main/java/org/glassfish/jersey/client/oauth2/AuthCodeGrantImpl.java b/security/oauth2-client/src/main/java/org/glassfish/jersey/client/oauth2/AuthCodeGrantImpl.java
index 6a54ce1..3f2fe27 100644
--- a/security/oauth2-client/src/main/java/org/glassfish/jersey/client/oauth2/AuthCodeGrantImpl.java
+++ b/security/oauth2-client/src/main/java/org/glassfish/jersey/client/oauth2/AuthCodeGrantImpl.java
@@ -32,6 +32,7 @@
 import jakarta.ws.rs.client.ClientBuilder;
 import jakarta.ws.rs.client.Entity;
 import jakarta.ws.rs.core.Configuration;
+import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.Feature;
 import jakarta.ws.rs.core.Form;
 import jakarta.ws.rs.core.GenericType;
@@ -358,8 +359,8 @@
         private final Provider<PropertiesDelegate> propertiesDelegateProvider;
 
         @Inject
-        public DefaultTokenMessageBodyReader(Provider<MessageBodyWorkers> workers,
-                                             Provider<PropertiesDelegate> propertiesDelegateProvider) {
+        public DefaultTokenMessageBodyReader(@Context Provider<MessageBodyWorkers> workers,
+                                             @Context Provider<PropertiesDelegate> propertiesDelegateProvider) {
             this.propertiesDelegateProvider = propertiesDelegateProvider;
             this.workers = workers;
         }
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 ed122f3..d71e996 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, 2022 Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -32,14 +32,22 @@
 import org.glassfish.jersey.apache5.connector.Apache5ConnectorProvider;
 import org.glassfish.jersey.client.ClientConfig;
 import org.glassfish.jersey.client.ClientProperties;
+import org.glassfish.jersey.client.HttpUrlConnectorProvider;
 import org.glassfish.jersey.client.RequestEntityProcessing;
+import org.glassfish.jersey.client.spi.ConnectorProvider;
 import org.glassfish.jersey.grizzly.connector.GrizzlyConnectorProvider;
+import org.glassfish.jersey.jdk.connector.JdkConnectorProvider;
 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 org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+
+import java.util.function.Supplier;
+import java.util.stream.Stream;
 
 /**
  * Tests chunk encoding and possibility of buffering the entity.
@@ -65,56 +73,42 @@
         }
     }
 
-    @Test
-    public void testApacheConnector() {
-        testWithBuffering(getApacheConnectorConfig());
-        testWithChunkEncodingWithoutPropertyDefinition(getApacheConnectorConfig());
-        testWithChunkEncodingWithPropertyDefinition(getApacheConnectorConfig());
-        testWithChunkEncodingPerRequest(getApacheConnectorConfig());
-        testDefaultOption(getApacheConnectorConfig(), RequestEntityProcessing.CHUNKED);
+    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 HttpUrlConnectorProvider(), RequestEntityProcessing.BUFFERED)),
+                Arguments.of(new TestArguments(() -> new JdkConnectorProvider(), RequestEntityProcessing.BUFFERED))
+        );
     }
 
-    @Test
-    public void testApache5Connector() {
-        testWithBuffering(getApache5ConnectorConfig());
-        testWithChunkEncodingWithoutPropertyDefinition(getApache5ConnectorConfig());
-        testWithChunkEncodingWithPropertyDefinition(getApache5ConnectorConfig());
-        testWithChunkEncodingPerRequest(getApache5ConnectorConfig());
-        testDefaultOption(getApache5ConnectorConfig(), RequestEntityProcessing.CHUNKED);
+    private static final class TestArguments {
+        private final Supplier<ConnectorProvider> connectorProviderSupplier;
+        private final RequestEntityProcessing defaultProcessing;
+
+        private TestArguments(Supplier<ConnectorProvider> connectorProviderSupplier, RequestEntityProcessing defaultProcessing) {
+            this.connectorProviderSupplier = connectorProviderSupplier;
+            this.defaultProcessing = defaultProcessing;
+        }
+
+        private ClientConfig clientConfig() {
+            return new ClientConfig().connectorProvider(connectorProviderSupplier.get());
+        }
+
+        private RequestEntityProcessing defaultProcessing() {
+            return defaultProcessing;
+        }
     }
 
-    @Test
-    public void testGrizzlyConnector() {
-        testWithBuffering(getGrizzlyConnectorConfig());
-        testWithChunkEncodingWithoutPropertyDefinition(getGrizzlyConnectorConfig());
-        testWithChunkEncodingWithPropertyDefinition(getGrizzlyConnectorConfig());
-        testWithChunkEncodingPerRequest(getGrizzlyConnectorConfig());
-        testDefaultOption(getGrizzlyConnectorConfig(), RequestEntityProcessing.CHUNKED);
-    }
-
-    @Test
-    public void testHttpUrlConnector() {
-        testWithBuffering(getHttpUrlConnectorConfig());
-        testWithChunkEncodingWithoutPropertyDefinition(getHttpUrlConnectorConfig());
-        testWithChunkEncodingWithPropertyDefinition(getHttpUrlConnectorConfig());
-        testWithChunkEncodingPerRequest(getHttpUrlConnectorConfig());
-        testDefaultOption(getHttpUrlConnectorConfig(), RequestEntityProcessing.BUFFERED);
-    }
-
-    private ClientConfig getApacheConnectorConfig() {
-        return new ClientConfig().connectorProvider(new ApacheConnectorProvider());
-    }
-
-    private ClientConfig getApache5ConnectorConfig() {
-        return new ClientConfig().connectorProvider(new Apache5ConnectorProvider());
-    }
-
-    private ClientConfig getGrizzlyConnectorConfig() {
-        return new ClientConfig().connectorProvider(new GrizzlyConnectorProvider());
-    }
-
-    private ClientConfig getHttpUrlConnectorConfig() {
-        return new ClientConfig();
+    @ParameterizedTest
+    @MethodSource("clientConfigs")
+    public void testConnector(TestArguments arguments) {
+        testWithBuffering(arguments.clientConfig());
+        testWithChunkEncodingWithoutPropertyDefinition(arguments.clientConfig());
+        testWithChunkEncodingWithPropertyDefinition(arguments.clientConfig());
+        testWithChunkEncodingPerRequest(arguments.clientConfig());
+        testDefaultOption(arguments.clientConfig(), arguments.defaultProcessing());
     }
 
     private void testDefaultOption(ClientConfig cc, RequestEntityProcessing mode) {
diff --git a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/InjectedClientBodyWorker.java b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/InjectedClientBodyWorker.java
index e42453b..7655eb8 100644
--- a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/InjectedClientBodyWorker.java
+++ b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/InjectedClientBodyWorker.java
@@ -31,6 +31,7 @@
 import jakarta.ws.rs.client.Entity;
 import jakarta.ws.rs.core.Application;
 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.ext.ContextResolver;
@@ -76,7 +77,7 @@
         Providers providers;
 
         @Inject
-        public ProvidersInjectedWriter(Providers providers) {
+        public ProvidersInjectedWriter(@Context Providers providers) {
             this.providers = providers;
         }
 
@@ -111,7 +112,7 @@
         Providers providers;
 
         @Inject
-        ProvidersInjectedReader(Providers providers) {
+        ProvidersInjectedReader(@Context Providers providers) {
             this.providers = providers;
         }
 
@@ -142,7 +143,7 @@
         Configuration configuration;
 
         @Inject
-        public ConfigurationInjectedWriter(Configuration configuration) {
+        public ConfigurationInjectedWriter(@Context Configuration configuration) {
             this.configuration = configuration;
         }
 
@@ -172,7 +173,7 @@
         Configuration configuration;
 
         @Inject
-        public ConfigurationInjectedReader(Configuration configuration) {
+        public ConfigurationInjectedReader(@Context Configuration configuration) {
             this.configuration = configuration;
         }
 
diff --git a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/ssl/SslConnectorHostnameVerifierTest.java b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/ssl/SslConnectorHostnameVerifierTest.java
index 364c214..2034975 100644
--- a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/ssl/SslConnectorHostnameVerifierTest.java
+++ b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/connector/ssl/SslConnectorHostnameVerifierTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 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
@@ -31,8 +31,9 @@
 import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
 import org.glassfish.jersey.client.spi.ConnectorProvider;
 import org.glassfish.jersey.grizzly.connector.GrizzlyConnectorProvider;
-import org.glassfish.jersey.jetty.connector.JettyConnectorProvider;
+import org.glassfish.jersey.jetty.connector.JettyClientProperties;
 
+import org.glassfish.jersey.jetty.connector.JettyConnectorProvider;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.MethodSource;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -66,13 +67,14 @@
     @ParameterizedTest
     @MethodSource("testData")
     public void testHostnameVerifierApplied(ConnectorProvider connectorProvider) throws Exception {
-        // Grizzly and Jetty connectors don't support Hostname Verification
-        if (isExcluded(Arrays.asList(GrizzlyConnectorProvider.class, JettyConnectorProvider.class), connectorProvider)) {
+        // Grizzly connector does not support Hostname Verification
+        if (isExcluded(Arrays.asList(GrizzlyConnectorProvider.class), connectorProvider)) {
             return;
         }
 
         final Client client = ClientBuilder.newBuilder()
-                .withConfig(new ClientConfig().connectorProvider(connectorProvider))
+                .withConfig(getClientConfig(JettyConnectorProvider.class.isAssignableFrom(connectorProvider.getClass()))
+                        .connectorProvider(connectorProvider))
                 .register(HttpAuthenticationFeature.basic("user", "password"))
                 .hostnameVerifier(new CustomHostnameVerifier())
                 .sslContext(getSslContext())
@@ -80,18 +82,25 @@
 
         try {
             client.target(Server.BASE_URI).request().get(Response.class);
-            fail("HostnameVerifier was not applied.");
+            fail("HostnameVerifier was not applied by " + connectorProvider.getClass());
         } catch (ProcessingException pex) {
             CustomHostnameVerifier.HostnameVerifierException hve = getHVE(pex);
 
             if (hve != null) {
                 assertEquals(CustomHostnameVerifier.EX_VERIFIER_MESSAGE, hve.getMessage());
             } else {
-                fail("Invalid wrapped exception.");
+                fail("Invalid wrapped exception.", pex);
             }
         }
     }
 
+    private static final ClientConfig getClientConfig(boolean enableSslHostnameVerification) {
+        final ClientConfig config = new ClientConfig();
+        return enableSslHostnameVerification ? config
+                .property(JettyClientProperties.ENABLE_SSL_HOSTNAME_VERIFICATION, Boolean.FALSE)
+                : config;
+    }
+
     private boolean isExcluded(List<Class<? extends ConnectorProvider>> excluded, ConnectorProvider connectorProvider) {
         for (Class<?> clazz : excluded) {
             if (clazz.isAssignableFrom(connectorProvider.getClass())) {
diff --git a/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/message/internal/OutboundMessageContextTest.java b/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/message/internal/OutboundMessageContextTest.java
index 8456fd7..29a3cb3 100644
--- a/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/message/internal/OutboundMessageContextTest.java
+++ b/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/message/internal/OutboundMessageContextTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2022 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 Public License v. 2.0, which is available at
@@ -36,6 +36,7 @@
 import org.glassfish.jersey.message.internal.OutboundMessageContext;
 import org.glassfish.jersey.tests.e2e.common.TestRuntimeDelegate;
 
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 import static org.hamcrest.Matchers.contains;
 import static org.hamcrest.Matchers.equalTo;
@@ -225,4 +226,21 @@
 
         fail();
     }
+
+    @Test
+    public void testChangedContentType() {
+        OutboundMessageContext ctx = new OutboundMessageContext((Configuration) null);
+        ctx.setMediaType(MediaType.APPLICATION_XML_TYPE);
+        Assertions.assertEquals(MediaType.APPLICATION_XML_TYPE, ctx.getMediaType());
+        ctx.setMediaType(MediaType.APPLICATION_JSON_TYPE);
+        Assertions.assertEquals(MediaType.APPLICATION_JSON_TYPE, ctx.getMediaType());
+    }
+
+    @Test
+    public void testCopyConstructor() {
+        OutboundMessageContext ctx = new OutboundMessageContext((Configuration) null);
+        OutboundMessageContext newCtx = new OutboundMessageContext(ctx);
+        newCtx.setMediaType(MediaType.APPLICATION_XML_TYPE); // new value
+        Assertions.assertEquals(MediaType.APPLICATION_XML_TYPE, newCtx.getMediaType());
+    }
 }
diff --git a/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/message/internal/ReaderWriterTest.java b/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/message/internal/ReaderWriterTest.java
new file mode 100644
index 0000000..59edddd
--- /dev/null
+++ b/tests/e2e-core-common/src/test/java/org/glassfish/jersey/tests/e2e/common/message/internal/ReaderWriterTest.java
@@ -0,0 +1,52 @@
+/*
+ * 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 Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.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.common.message.internal;
+
+import org.glassfish.jersey.message.internal.ReaderWriter;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import jakarta.ws.rs.core.MediaType;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+
+public class ReaderWriterTest {
+    @Test
+    public void testToNeverAskToReadZeroBytes() throws IOException {
+        // Unnamed app server bug test
+        int size = ((ReaderWriter.BUFFER_SIZE + 1000) / 10) * 10;
+        StringBuilder sb = new StringBuilder(size);
+        String shortMsg = "0123456789";
+        while (sb.length() < size) {
+            sb.append(shortMsg);
+        }
+
+        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(sb.toString().getBytes(StandardCharsets.UTF_8)) {
+            @Override
+            public synchronized int read(byte[] b, int off, int len) {
+                if (len == 0) {
+                    return -1; // simulate the bug
+                }
+                return super.read(b, off, len);
+            }
+        };
+
+        String read = ReaderWriter.readFromAsString(byteArrayInputStream, MediaType.TEXT_HTML_TYPE);
+        Assertions.assertEquals(size, read.length());
+    }
+}
diff --git a/tests/release-test/pom.xml b/tests/release-test/pom.xml
index e5dc66c..00fa896 100644
--- a/tests/release-test/pom.xml
+++ b/tests/release-test/pom.xml
@@ -52,7 +52,8 @@
                     <reuseForks>false</reuseForks>
                     <enableAssertions>false</enableAssertions>
                     <includes>
-                        <include>**/NoticeFilesTest.class</include>
+                        <include>**/ArchetypesTest</include>
+                        <include>**/NoticeFilesTest</include>
                     </includes>
                 </configuration>
             </plugin>
@@ -147,8 +148,8 @@
                             <reuseForks>false</reuseForks>
                             <enableAssertions>false</enableAssertions>
                             <includes>
-                                <include>**/DownloadBomPomDependencies.java</include>
-                                <include>**/*Test.class</include>
+                                <include>**/DownloadBomPomDependencies</include>
+                                <include>**/*Test</include>
                             </includes>
                         </configuration>
                     </plugin>
diff --git a/tests/release-test/src/test/java/org/glassfish/jersey/test/artifacts/ArchetypesTest.java b/tests/release-test/src/test/java/org/glassfish/jersey/test/artifacts/ArchetypesTest.java
new file mode 100644
index 0000000..b42830b
--- /dev/null
+++ b/tests/release-test/src/test/java/org/glassfish/jersey/test/artifacts/ArchetypesTest.java
@@ -0,0 +1,105 @@
+/*
+ * 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.artifacts;
+
+import org.apache.maven.model.Model;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Map;
+import java.util.Properties;
+
+public class ArchetypesTest {
+    public static final String[] archetypePoms = {
+            "../../archetypes/jersey-example-java8-webapp/src/main/resources/archetype-resources/pom.xml",
+            "../../archetypes/jersey-heroku-webapp/src/main/resources/archetype-resources/pom.xml",
+            "../../archetypes/jersey-quickstart-grizzly2/src/main/resources/archetype-resources/pom.xml",
+            "../../archetypes/jersey-quickstart-webapp/src/main/resources/archetype-resources/pom.xml",
+    };
+
+    @Test
+    public void testPropertiesVersion() throws XmlPullParserException, IOException {
+        Properties properties = MavenUtil.getModelFromFile("../../pom.xml").getProperties();
+//        System.out.println(properties);
+        TestResult testResult = new TestResult();
+        for (String pom : archetypePoms) {
+            File pomFile = new File(pom);
+            Assert.assertTrue("The pom file " + pom + " does not exist", pomFile.exists());
+            Assert.assertTrue("The pom file " + pom + " cannot be read", pomFile.canRead());
+
+            boolean failed = false;
+            Model pomModel = MavenUtil.getModelFromFile(pom);
+            Properties pomProperties = pomModel.getProperties();
+            for (Map.Entry<Object, Object> pomEntry : pomProperties.entrySet()) {
+                if (pomEntry.getKey().equals("jersey.config.test.container.port")) {
+                    // Skip the following
+                    continue;
+                }
+                // Update the names with the ones in Jersey
+                Map.Entry<Object, Object> updatedEntry = updateEntry(pomEntry);
+                // Check the properties are there
+                if (properties.getProperty(updatedEntry.getKey().toString()) == null) {
+                    testResult.ok().append("Property ")
+                            .append(pomEntry.getKey().toString())
+                            .append(" from ").append(pom).println(" not in Jersey");
+                    failed = true;
+                }
+                // check the values
+                else if (!properties.getProperty(updatedEntry.getKey().toString()).equals(updatedEntry.getValue())) {
+                    testResult.exception().append("The property ")
+                            .append(pomEntry.getKey().toString())
+                            .append(" in archetype pom ")
+                            .append(pom)
+                            .append(" not equals Jersey ")
+                            .println(properties.getProperty(pomEntry.getKey().toString()));
+                    failed = true;
+                }
+            }
+            if (!failed) {
+                testResult.ok().append("The properties in archetype pom ").append(pom).println(" equals Jersey");
+            }
+        }
+
+        if (!testResult.result()) {
+            Assert.fail();
+        }
+    }
+
+    private Map.Entry<Object, Object> updateEntry(Map.Entry<Object, Object> pomEntry) {
+        if (pomEntry.getKey().equals("junit-jupiter.version")) {
+            return new Map.Entry<Object, Object>() {
+                @Override
+                public Object getKey() {
+                    return "junit5.version";
+                }
+
+                @Override
+                public Object getValue() {
+                    return pomEntry.getValue();
+                }
+
+                @Override
+                public Object setValue(Object value) {
+                    return value;
+                }
+            };
+        }
+        return pomEntry;
+    }
+}