diff --git a/jaxrs-tck/pom.xml b/jaxrs-tck/pom.xml
index a66e44e..cf26b4c 100644
--- a/jaxrs-tck/pom.xml
+++ b/jaxrs-tck/pom.xml
@@ -39,7 +39,7 @@
         <json.bind.api.version>3.0.1</json.bind.api.version>
         <xml.bind.api.version>4.0.4</xml.bind.api.version>
         <servlet.api.version>6.1.0</servlet.api.version>
-        <common.httpclient.version>3.1</common.httpclient.version>
+        <httpcomponents.client5.version>5.4.2</httpcomponents.client5.version>
         <arquillian.version>1.10.0.Final</arquillian.version>
     </properties>
 
@@ -68,9 +68,9 @@
         </dependency>
 
         <dependency>
-            <groupId>commons-httpclient</groupId>
-            <artifactId>commons-httpclient</artifactId>
-            <version>${common.httpclient.version}</version>
+            <groupId>org.apache.httpcomponents.client5</groupId>
+            <artifactId>httpclient5</artifactId>
+            <version>${httpcomponents.client5.version}</version>
         </dependency>
 
         <dependency>
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/JAXRSCommonClient.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/JAXRSCommonClient.java
index d5c06b1..40b3e4a 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/JAXRSCommonClient.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/JAXRSCommonClient.java
@@ -33,8 +33,8 @@
 import ee.jakarta.tck.ws.rs.common.webclient.http.HttpResponse;
 import ee.jakarta.tck.ws.rs.common.webclient.validation.CheckOneOfStatusesTokenizedValidator;
 import ee.jakarta.tck.ws.rs.lib.util.TestUtil;
-import org.apache.commons.httpclient.Header;
-import org.apache.commons.httpclient.HttpState;
+import org.apache.hc.client5.http.protocol.HttpClientContext;
+import org.apache.hc.core5.http.Header;
 
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -169,7 +169,7 @@
   /**
    * HttpState that may be used for multiple invocations requiring state.
    */
-  protected HttpState _state = null;
+  protected HttpClientContext _state = null;
 
   /**
    * Test case.
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/client/ApacheResponseAdapter.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/client/ApacheResponseAdapter.java
index d7e3b1b..af79e90 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/client/ApacheResponseAdapter.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/client/ApacheResponseAdapter.java
@@ -17,18 +17,24 @@
 package ee.jakarta.tck.ws.rs.common.client;
 
 import java.io.IOException;
+import java.nio.charset.StandardCharsets;
 import java.util.LinkedList;
 import java.util.List;
 
 import ee.jakarta.tck.ws.rs.common.webclient.http.HttpResponse;
-import org.apache.commons.httpclient.Header;
+import org.apache.hc.client5.http.protocol.HttpClientContext;
+import org.apache.hc.core5.http.Header;
+import org.apache.hc.core5.http.HttpVersion;
+import org.apache.hc.core5.http.message.BasicHeader;
 import jakarta.ws.rs.core.MultivaluedMap;
 
 public class ApacheResponseAdapter extends HttpResponse {
 
   public ApacheResponseAdapter(jakarta.ws.rs.core.Response response, String host,
       int port) {
-    super(host, port, port == 443, null, null);
+    super(host, port, port == 443, null, HttpVersion.HTTP_1_1, response.getStatus(),
+        response.getStatusInfo().getReasonPhrase(), new Header[0], new byte[0],
+        HttpClientContext.create());
     this.response = response;
     this.caser = TextCaser.NONE;
   }
@@ -78,7 +84,7 @@
     String[] sHeaders = JaxrsCommonClient.getMetadata(mHeaders);
     for (String header : sHeaders) {
       String[] split = header.split(":", 2);
-      headers.add(new Header(split[0], split[1]));
+      headers.add(new BasicHeader(split[0], split[1]));
     }
     return headers.toArray(new Header[headers.size()]);
   }
@@ -105,4 +111,9 @@
     }
     return encoding;
   }
+
+  @Override
+  public byte[] getResponseBodyAsRawBytes() throws IOException {
+    return getResponseBodyAsString().getBytes(StandardCharsets.ISO_8859_1);
+  }
 }
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/WebTestCase.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/WebTestCase.java
index 22b3505..9570633 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/WebTestCase.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/WebTestCase.java
@@ -30,8 +30,9 @@
 import ee.jakarta.tck.ws.rs.common.webclient.http.HttpResponse;
 import ee.jakarta.tck.ws.rs.common.webclient.validation.ValidationFactory;
 import ee.jakarta.tck.ws.rs.common.webclient.validation.ValidationStrategy;
-import org.apache.commons.httpclient.Header;
-import org.apache.commons.httpclient.HttpState;
+import org.apache.hc.client5.http.protocol.HttpClientContext;
+import org.apache.hc.core5.http.Header;
+import org.apache.hc.core5.http.message.BasicHeader;
 
 import ee.jakarta.tck.ws.rs.lib.util.TestUtil;
 
@@ -476,7 +477,7 @@
    *          test state
    */
   public void setState(Object state) {
-    _request.setState((HttpState) state);
+    _request.setState((HttpClientContext) state);
   }
 
   /**
@@ -553,7 +554,7 @@
       if (header != null) {
         map.put(name, createNewHeader(value, header));
       } else {
-        map.put(name, new Header(name, value));
+        map.put(name, new BasicHeader(name, value));
       }
     }
   }
@@ -569,7 +570,7 @@
    */
   private Header createNewHeader(String newValue, Header header) {
     String oldValue = header.getValue();
-    return new Header(header.getName(), oldValue + ", " + newValue);
+    return new BasicHeader(header.getName(), oldValue + ", " + newValue);
   }
 
   /**
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/handler/ALLOWHandler.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/handler/ALLOWHandler.java
index d2d79b2..4f72846 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/handler/ALLOWHandler.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/handler/ALLOWHandler.java
@@ -21,7 +21,7 @@
 
 import java.util.StringTokenizer;
 
-import org.apache.commons.httpclient.Header;
+import org.apache.hc.core5.http.Header;
 
 import ee.jakarta.tck.ws.rs.lib.util.TestUtil;
 
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/handler/ContentTypeHandler.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/handler/ContentTypeHandler.java
index 797d58e..b18e7d2 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/handler/ContentTypeHandler.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/handler/ContentTypeHandler.java
@@ -60,7 +60,7 @@
 
 package ee.jakarta.tck.ws.rs.common.webclient.handler;
 
-import org.apache.commons.httpclient.Header;
+import org.apache.hc.core5.http.Header;
 
 import ee.jakarta.tck.ws.rs.lib.util.TestUtil;
 
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/handler/DefaultHandler.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/handler/DefaultHandler.java
index 34e7d9e..f9d487f 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/handler/DefaultHandler.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/handler/DefaultHandler.java
@@ -60,8 +60,10 @@
 
 package ee.jakarta.tck.ws.rs.common.webclient.handler;
 
-import org.apache.commons.httpclient.Header;
-import org.apache.commons.httpclient.HeaderElement;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.hc.core5.http.Header;
 
 import ee.jakarta.tck.ws.rs.lib.util.TestUtil;
 
@@ -120,26 +122,23 @@
    */
   protected boolean areHeadersEqual(Header h1, Header h2) {
 
-    HeaderElement[] h1Values = h1.getElements();
-    HeaderElement[] h2Values = h2.getElements();
+    String[] h1Values = h1.getValue().split(",");
+    String[] h2Values = h2.getValue().split(",");
 
     if (h1Values.length == h2Values.length) {
-      for (HeaderElement h1Value : h1Values) {
-        String h1Val = h1Value.getName();
-        boolean found = false;
-        for (HeaderElement h2Value : h2Values) {
-          if (h1Val.equals(h2Value.getName())) {
-            found = true;
-            break;
-          }
-        }
-        if (!found) {
-          return false;
-        }
-      }
-      return true;
+      Set<String> h1Names = normalizeHeaderElements(h1Values);
+      Set<String> h2Names = normalizeHeaderElements(h2Values);
+      return h1Names.equals(h2Names);
     } else {
       return false;
     }
   }
+
+  private Set<String> normalizeHeaderElements(String[] values) {
+    Set<String> normalized = new HashSet<String>();
+    for (String value : values) {
+      normalized.add(value.trim().split(";")[0].trim());
+    }
+    return normalized;
+  }
 }
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/handler/Handler.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/handler/Handler.java
index d70e5c7..fa17aab 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/handler/Handler.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/handler/Handler.java
@@ -58,7 +58,7 @@
  */
 package ee.jakarta.tck.ws.rs.common.webclient.handler;
 
-import org.apache.commons.httpclient.Header;
+import org.apache.hc.core5.http.Header;
 
 /**
  * Handler interface.
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/handler/LocationHandler.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/handler/LocationHandler.java
index 530e2b4..2af2fc5 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/handler/LocationHandler.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/handler/LocationHandler.java
@@ -63,7 +63,7 @@
 import java.net.MalformedURLException;
 import java.net.URL;
 
-import org.apache.commons.httpclient.Header;
+import org.apache.hc.core5.http.Header;
 
 import ee.jakarta.tck.ws.rs.lib.util.TestUtil;
 
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/handler/SetCookieHandler.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/handler/SetCookieHandler.java
index ae1e6c9..69937cc 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/handler/SetCookieHandler.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/handler/SetCookieHandler.java
@@ -22,7 +22,7 @@
 
 import java.util.StringTokenizer;
 
-import org.apache.commons.httpclient.Header;
+import org.apache.hc.core5.http.Header;
 
 import ee.jakarta.tck.ws.rs.lib.util.TestUtil;
 
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/handler/WWWAuthenticateHandler.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/handler/WWWAuthenticateHandler.java
index ffdc4ad..2027cfb 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/handler/WWWAuthenticateHandler.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/handler/WWWAuthenticateHandler.java
@@ -60,7 +60,7 @@
 
 package ee.jakarta.tck.ws.rs.common.webclient.handler;
 
-import org.apache.commons.httpclient.Header;
+import org.apache.hc.core5.http.Header;
 
 import ee.jakarta.tck.ws.rs.lib.util.TestUtil;
 
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/http/HttpRequest.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/http/HttpRequest.java
index 3e7c60f..cecc156 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/http/HttpRequest.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/http/HttpRequest.java
@@ -21,27 +21,30 @@
 package ee.jakarta.tck.ws.rs.common.webclient.http;
 
 import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
 import java.util.StringTokenizer;
 
-import org.apache.commons.httpclient.Cookie;
-import org.apache.commons.httpclient.Header;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpConnection;
-import org.apache.commons.httpclient.HttpException;
-import org.apache.commons.httpclient.HttpMethod;
-import org.apache.commons.httpclient.HttpState;
-import org.apache.commons.httpclient.UsernamePasswordCredentials;
-import org.apache.commons.httpclient.auth.AuthScope;
-import org.apache.commons.httpclient.cookie.CookiePolicy;
-import org.apache.commons.httpclient.methods.EntityEnclosingMethod;
-import org.apache.commons.httpclient.methods.StringRequestEntity;
-import org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory;
-import org.apache.commons.httpclient.protocol.Protocol;
-import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
-import org.apache.commons.httpclient.protocol.SSLProtocolSocketFactory;
+import org.apache.hc.client5.http.auth.AuthScope;
+import org.apache.hc.client5.http.auth.Credentials;
+import org.apache.hc.client5.http.auth.UsernamePasswordCredentials;
+import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase;
+import org.apache.hc.client5.http.config.RequestConfig;
+import org.apache.hc.client5.http.cookie.BasicCookieStore;
+import org.apache.hc.client5.http.cookie.Cookie;
+import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider;
+import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
+import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
+import org.apache.hc.client5.http.impl.classic.HttpClients;
+import org.apache.hc.client5.http.impl.cookie.BasicClientCookie;
+import org.apache.hc.client5.http.protocol.HttpClientContext;
+import org.apache.hc.core5.http.Header;
+import org.apache.hc.core5.http.HttpHost;
+import org.apache.hc.core5.http.io.entity.EntityUtils;
+import org.apache.hc.core5.http.io.entity.StringEntity;
 
-import ee.jakarta.tck.ws.rs.lib.util.TestUtil;
 import ee.jakarta.tck.ws.rs.common.webclient.Util;
+import ee.jakarta.tck.ws.rs.lib.util.TestUtil;
 
 /**
  * Represents an HTTP client Request
@@ -49,15 +52,6 @@
 
 public class HttpRequest {
 
-  static {
-    // if (TestUtil.traceflag) {
-    //   System.setProperty("org.apache.commons.logging.Log",
-    //       "ee.jakarta.tck.ws.rs.common.webclient.log.WebLog");
-    //   System.setProperty(
-    //       "org.apache.commons.logging.simplelog.log.httpclient.wire", "debug");
-    // }
-  }
-
   /**
    * Default HTTP port.
    */
@@ -86,7 +80,7 @@
   /**
    * Method representation of request.
    */
-  private HttpMethod _method = null;
+  private HttpUriRequestBase _method = null;
 
   /**
    * Target web container host
@@ -106,7 +100,7 @@
   /**
    * HTTP state
    */
-  private HttpState _state = null;
+  private HttpClientContext _state = null;
 
   /**
    * Original request line for this request.
@@ -135,21 +129,17 @@
 
   Header[] _headers = null;
 
-  protected HttpClient client = null;
-
   /**
    * Creates new HttpRequest based of the passed request line. The request line
    * provied must be in the form of:<br>
-   * 
+   *
    * <pre>
    *     METHOD PATH HTTP-VERSION
    *     Ex.  GET /index.html HTTP/1.0
    * </pre>
    */
   public HttpRequest(String requestLine, String host, int port) {
-    client = new HttpClient();
-    _method = MethodFactory.getInstance(requestLine);
-    _method.setFollowRedirects(false);
+    _method = createMethod(requestLine);
     _host = host;
     _port = port;
 
@@ -157,11 +147,13 @@
       _isSecure = true;
     }
 
-    // If we got this far, the request line is in the proper
-    // format
     _requestLine = requestLine;
   }
 
+  protected HttpUriRequestBase createMethod(String requestLine) {
+    return MethodFactory.getInstance(requestLine);
+  }
+
   /*
    * public methods
    * ========================================================================
@@ -184,7 +176,7 @@
    * @return String request type
    */
   public String getRequestMethod() {
-    return _method.getName();
+    return _method.getMethod();
   }
 
   /**
@@ -216,9 +208,8 @@
    *          request content
    */
   public void setContent(String content) {
-    if (_method instanceof EntityEnclosingMethod) {
-      ((EntityEnclosingMethod) _method)
-          .setRequestEntity(new StringRequestEntity(content));
+    if (isEntityEnclosingMethod()) {
+      _method.setEntity(new StringEntity(content, StandardCharsets.ISO_8859_1));
     }
     _contentLength = content.length();
   }
@@ -254,9 +245,10 @@
     }
 
     UsernamePasswordCredentials cred = new UsernamePasswordCredentials(username,
-        password);
-    AuthScope scope = new AuthScope(_host, _port, realm);
-    getState().setCredentials(scope, cred);
+        password.toCharArray());
+    AuthScope scope = new AuthScope(_host, null, _port, realm, null);
+    ((BasicCredentialsProvider) getState().getCredentialsProvider())
+        .setCredentials(scope, cred);
     TestUtil.logTrace("[HttpRequest] Added credentials for '" + username
         + "' with password '" + password + "' in realm '" + realm + "'");
 
@@ -276,9 +268,9 @@
    *          request header value
    */
   public void addRequestHeader(String headerName, String headerValue) {
-    _method.addRequestHeader(headerName, headerValue);
+    _method.addHeader(headerName, headerValue);
     TestUtil.logTrace("[HttpRequest] Added request header: "
-        + _method.getRequestHeader(headerName).toExternalForm());
+        + formatHeader(_method.getFirstHeader(headerName)));
   }
 
   public void addRequestHeader(String header) {
@@ -306,9 +298,9 @@
    *          request header value
    */
   public void setRequestHeader(String headerName, String headerValue) {
-    _method.setRequestHeader(headerName, headerValue);
+    _method.setHeader(headerName, headerValue);
     TestUtil.logTrace("[HttpRequest] Set request header: "
-        + _method.getRequestHeader(headerName).toExternalForm());
+        + formatHeader(_method.getFirstHeader(headerName)));
 
   }
 
@@ -317,7 +309,7 @@
    * followed. By default, redirects are not followed.
    */
   public void setFollowRedirects(boolean followRedirects) {
-    _method.setFollowRedirects(followRedirects);
+    _redirect = followRedirects;
   }
 
   /**
@@ -325,14 +317,14 @@
    * followed.
    */
   public boolean getFollowRedirects() {
-    return _method.getFollowRedirects();
+    return _redirect;
   }
 
   /**
    * <code>setState</code> will set the HTTP state for the current request (i.e.
    * session tracking). This has the side affect
    */
-  public void setState(HttpState state) {
+  public void setState(HttpClientContext state) {
     _state = state;
     _useCookies = true;
   }
@@ -345,79 +337,33 @@
    * @throws IOException
    *           if an I/O error occurs during dispatch.
    */
-  public HttpResponse execute() throws IOException, HttpException {
-    String method;
-    int defaultPort;
-    ProtocolSocketFactory factory;
+  public HttpResponse execute() throws IOException {
+    String method = _isSecure ? "https" : "http";
+    HttpHost target = new HttpHost(method, _host, _port);
 
-    if (_method.getFollowRedirects()) {
-      client = new HttpClient();
+    TestUtil.logMsg("[HttpRequest] Dispatching request: '" + _requestLine
+        + "' to target server at '" + _host + ":" + _port + "'");
 
-      if (_isSecure) {
-        method = "https";
-        defaultPort = DEFAULT_SSL_PORT;
-        factory = new SSLProtocolSocketFactory();
-      } else {
-        method = "http";
-        defaultPort = DEFAULT_HTTP_PORT;
-        factory = new DefaultProtocolSocketFactory();
-      }
+    addSupportHeaders();
+    _headers = _method.getHeaders();
 
-      Protocol protocol = new Protocol(method, factory, defaultPort);
-      HttpConnection conn = new HttpConnection(_host, _port, protocol);
+    TestUtil.logTrace(
+        "########## The real value set: " + getFollowRedirects());
 
-      if (conn.isOpen()) {
-        throw new IllegalStateException("Connection incorrectly opened");
-      }
+    RequestConfig config = RequestConfig.custom()
+        .setRedirectsEnabled(getFollowRedirects()).build();
 
-      conn.open();
+    try (CloseableHttpClient client = HttpClients.custom()
+        .setDefaultRequestConfig(config).build();
+        CloseableHttpResponse response = client.execute(target, _method,
+            getState())) {
 
-      TestUtil.logMsg("[HttpRequest] Dispatching request: '" + _requestLine
-          + "' to target server at '" + _host + ":" + _port + "'");
+      byte[] responseBody = response.getEntity() == null ? new byte[0]
+          : EntityUtils.toByteArray(response.getEntity());
 
-      addSupportHeaders();
-      _headers = _method.getRequestHeaders();
-
-      TestUtil.logTrace(
-          "########## The real value set: " + _method.getFollowRedirects());
-
-      client.getHostConfiguration().setHost(_host, _port, protocol);
-
-      client.executeMethod(_method);
-
-      return new HttpResponse(_host, _port, _isSecure, _method, getState());
-    } else {
-      if (_isSecure) {
-        method = "https";
-        defaultPort = DEFAULT_SSL_PORT;
-        factory = new SSLProtocolSocketFactory();
-      } else {
-        method = "http";
-        defaultPort = DEFAULT_HTTP_PORT;
-        factory = new DefaultProtocolSocketFactory();
-      }
-
-      Protocol protocol = new Protocol(method, factory, defaultPort);
-      HttpConnection conn = new HttpConnection(_host, _port, protocol);
-
-      if (conn.isOpen()) {
-        throw new IllegalStateException("Connection incorrectly opened");
-      }
-
-      conn.open();
-
-      TestUtil.logMsg("[HttpRequest] Dispatching request: '" + _requestLine
-          + "' to target server at '" + _host + ":" + _port + "'");
-
-      addSupportHeaders();
-      _headers = _method.getRequestHeaders();
-
-      TestUtil.logTrace(
-          "########## The real value set: " + _method.getFollowRedirects());
-
-      _method.execute(getState(), conn);
-
-      return new HttpResponse(_host, _port, _isSecure, _method, getState());
+      return new HttpResponse(_host, _port, _isSecure, _method.getPath(),
+          response.getVersion(), response.getCode(), response.getReasonPhrase(),
+          response.getHeaders(), responseBody, getState());
     }
   }
 
@@ -426,9 +372,11 @@
    *
    * @return HttpState current state
    */
-  public HttpState getState() {
+  public HttpClientContext getState() {
     if (_state == null) {
-      _state = new HttpState();
+      _state = HttpClientContext.create();
+      _state.setCredentialsProvider(new BasicCredentialsProvider());
+      _state.setCookieStore(new BasicCookieStore());
     }
     return _state;
   }
@@ -441,7 +389,7 @@
 
       for (Header _header : _headers) {
         sb.append("       [REQUEST HEADER] -> ");
-        sb.append(_header.toExternalForm()).append('\n');
+        sb.append(formatHeader(_header)).append('\n');
       }
     }
 
@@ -463,33 +411,26 @@
     String cookieLine = cookieHeader.substring(cookieHeader.indexOf(':') + 1)
         .trim();
     StringTokenizer st = new StringTokenizer(cookieLine, " ;");
-    Cookie cookie = new Cookie();
-    cookie.setVersion(1);
-
-    getState();
-
-    if (cookieLine.indexOf("$Version") == -1) {
-      cookie.setVersion(0);
-      _method.getParams().setCookiePolicy(CookiePolicy.NETSCAPE);
-    }
-
+    BasicClientCookie cookie = null;
     while (st.hasMoreTokens()) {
       String token = st.nextToken();
 
       if (token.charAt(0) != '$' && !token.startsWith("Domain")
           && !token.startsWith("Path")) {
-        cookie.setName(token.substring(0, token.indexOf('=')));
-        cookie.setValue(token.substring(token.indexOf('=') + 1));
-      } else if (token.indexOf("Domain") > -1) {
-        cookie.setDomainAttributeSpecified(true);
+        String name = token.substring(0, token.indexOf('='));
+        String value = token.substring(token.indexOf('=') + 1);
+        cookie = new BasicClientCookie(name, value);
+      } else if (cookie != null && token.indexOf("Domain") > -1) {
         cookie.setDomain(token.substring(token.indexOf('=') + 1));
-      } else if (token.indexOf("Path") > -1) {
-        cookie.setPathAttributeSpecified(true);
+      } else if (cookie != null && token.indexOf("Path") > -1) {
         cookie.setPath(token.substring(token.indexOf('=') + 1));
       }
     }
-    _state.addCookie(cookie);
 
+    if (cookie != null) {
+      getState().getCookieStore().addCookie(cookie);
+      _useCookies = true;
+    }
   }
 
   /**
@@ -528,16 +469,16 @@
    * to use basic authentication
    */
   private void setBasicAuthorizationHeader() {
-    UsernamePasswordCredentials cred = (UsernamePasswordCredentials) getState()
-        .getCredentials(new AuthScope(_host, _port, null));
-    String authString = null;
-    if (cred != null) {
-      authString = "Basic " + Util.getBase64EncodedString(
-          cred.getUserName() + ":" + cred.getPassword());
+    Credentials cred = getState().getCredentialsProvider()
+        .getCredentials(new AuthScope(_host, _port), null);
+    if (cred instanceof UsernamePasswordCredentials) {
+      UsernamePasswordCredentials upCred = (UsernamePasswordCredentials) cred;
+      String authString = "Basic " + Util.getBase64EncodedString(
+          upCred.getUserName() + ":" + String.valueOf(upCred.getUserPassword()));
+      _method.setHeader("Authorization", authString);
     } else {
       TestUtil.logTrace("[HttpRequest] NULL CREDENTIALS");
     }
-    _method.setRequestHeader("Authorization", authString);
   }
 
   /**
@@ -545,8 +486,7 @@
    */
   private void setContentLengthHeader() {
     if (_contentLength > 0) {
-      _method.setRequestHeader("Content-Length",
-          Integer.toString(_contentLength));
+      _method.setHeader("Content-Length", Integer.toString(_contentLength));
     }
   }
 
@@ -562,9 +502,9 @@
    */
   private void setHostHeader() {
     if (_port == DEFAULT_HTTP_PORT || _port == DEFAULT_SSL_PORT) {
-      _method.setRequestHeader("Host", _host);
+      _method.setHeader("Host", _host);
     } else {
-      _method.setRequestHeader("Host", _host + ":" + _port);
+      _method.setHeader("Host", _host + ":" + _port);
     }
   }
 
@@ -573,14 +513,30 @@
    */
   private void setCookieHeader() {
     if (_useCookies) {
-      Cookie[] cookies = _state.getCookies();
-      if (cookies != null && cookies.length > 0) {
-        Header cHeader = CookiePolicy.getCookieSpec(CookiePolicy.RFC_2109)
-            .formatCookieHeader(_state.getCookies());
-        if (cHeader != null) {
-          _method.setRequestHeader(cHeader);
+      List<Cookie> cookies = getState().getCookieStore().getCookies();
+      if (cookies != null && !cookies.isEmpty()) {
+        StringBuilder cookieHeader = new StringBuilder();
+        for (Cookie cookie : cookies) {
+          if (cookieHeader.length() > 0) {
+            cookieHeader.append("; ");
+          }
+          cookieHeader.append(cookie.getName()).append('=')
+              .append(cookie.getValue());
+        }
+        if (cookieHeader.length() > 0) {
+          _method.setHeader("Cookie", cookieHeader.toString());
         }
       }
     }
   }
+
+  private boolean isEntityEnclosingMethod() {
+    String requestMethod = _method.getMethod();
+    return "POST".equals(requestMethod) || "PUT".equals(requestMethod)
+        || "PATCH".equals(requestMethod);
+  }
+
+  private String formatHeader(Header header) {
+    return header == null ? "null" : header.getName() + ": " + header.getValue();
+  }
 }
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/http/HttpResponse.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/http/HttpResponse.java
index 006a092..14d8d79 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/http/HttpResponse.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/http/HttpResponse.java
@@ -23,12 +23,11 @@
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
 
-import org.apache.commons.httpclient.Header;
-import org.apache.commons.httpclient.HttpMethod;
-import org.apache.commons.httpclient.HttpMethodBase;
-import org.apache.commons.httpclient.HttpState;
-import org.apache.commons.httpclient.HttpVersion;
+import org.apache.hc.client5.http.protocol.HttpClientContext;
+import org.apache.hc.core5.http.Header;
+import org.apache.hc.core5.http.ProtocolVersion;
 
 import ee.jakarta.tck.ws.rs.common.webclient.Util;
 
@@ -49,14 +48,9 @@
   private static final String CONTENT_TYPE = "Content-Type";
 
   /**
-   * Wrapped HttpMethod used to pull response info from.
-   */
-  private HttpMethod _method = null;
-
-  /**
    * HttpState obtained after execution of request
    */
-  private HttpState _state = null;
+  private HttpClientContext _state = null;
 
   /**
    * Charset encoding returned in the response
@@ -84,14 +78,32 @@
    */
   private boolean _isSecure;
 
+  private String _path;
+
+  private ProtocolVersion _version;
+
+  private int _statusCode;
+
+  private String _reasonPhrase;
+
+  private Header[] _headers;
+
+  private byte[] _rawResponseBody;
+
   /** Creates new HttpResponse */
-  public HttpResponse(String host, int port, boolean isSecure,
-      HttpMethod method, HttpState state) {
+  public HttpResponse(String host, int port, boolean isSecure, String path,
+      ProtocolVersion version, int statusCode, String reasonPhrase,
+      Header[] headers, byte[] rawResponseBody, HttpClientContext state) {
 
     _host = host;
     _port = port;
     _isSecure = isSecure;
-    _method = method;
+    _path = path;
+    _version = version;
+    _statusCode = statusCode;
+    _reasonPhrase = reasonPhrase;
+    _headers = headers;
+    _rawResponseBody = rawResponseBody == null ? new byte[0] : rawResponseBody;
     _state = state;
   }
 
@@ -106,7 +118,7 @@
    * @return HTTP status code
    */
   public String getStatusCode() {
-    return Integer.toString(_method.getStatusCode());
+    return Integer.toString(_statusCode);
   }
 
   /**
@@ -115,7 +127,7 @@
    * @return HTTP reason-phrase
    */
   public String getReasonPhrase() {
-    return _method.getStatusText();
+    return _reasonPhrase;
   }
 
   /**
@@ -124,7 +136,7 @@
    * @return response headers
    */
   public Header[] getResponseHeaders() {
-    return _method.getResponseHeaders();
+    return _headers;
   }
 
   /**
@@ -133,7 +145,21 @@
    * @return response headers
    */
   public Header[] getResponseHeaders(String headerName) {
-    return _method.getResponseHeaders(headerName);
+    int count = 0;
+    for (Header header : _headers) {
+      if (header.getName().equalsIgnoreCase(headerName)) {
+        count++;
+      }
+    }
+
+    Header[] filtered = new Header[count];
+    int idx = 0;
+    for (Header header : _headers) {
+      if (header.getName().equalsIgnoreCase(headerName)) {
+        filtered[idx++] = header;
+      }
+    }
+    return filtered;
   }
 
   /**
@@ -143,7 +169,12 @@
    *         exist.
    */
   public Header getResponseHeader(String headerName) {
-    return _method.getResponseHeader(headerName);
+    for (Header header : _headers) {
+      if (header.getName().equalsIgnoreCase(headerName)) {
+        return header;
+      }
+    }
+    return null;
   }
 
   /**
@@ -158,13 +189,13 @@
 
   /**
    * Returns the response as bytes (no encoding is performed by client.
-   * 
+   *
    * @return the raw response bytes
    * @throws IOException
    *           if an error occurs reading from server
    */
   public byte[] getResponseBodyAsRawBytes() throws IOException {
-    return _method.getResponseBody();
+    return _rawResponseBody;
   }
 
   /**
@@ -180,13 +211,13 @@
   /**
    * Returns the response body of the server without being encoding by the
    * client.
-   * 
+   *
    * @return an unecoded String representation of the response
    * @throws IOException
    *           if an error occurs reading from the server
    */
   public String getResponseBodyAsRawString() throws IOException {
-    return _method.getResponseBodyAsString();
+    return new String(_rawResponseBody, StandardCharsets.ISO_8859_1);
   }
 
   /**
@@ -202,13 +233,13 @@
   /**
    * Returns the response body as an InputStream without any encoding applied by
    * the client.
-   * 
+   *
    * @return an InputStream to read the response
    * @throws IOException
    *           if an error occurs reading from the server
    */
   public InputStream getResponseBodyAsRawStream() throws IOException {
-    return _method.getResponseBodyAsStream();
+    return new ByteArrayInputStream(_rawResponseBody);
   }
 
   /**
@@ -217,10 +248,10 @@
    * @return charset encoding
    */
   public String getResponseEncoding() {
-    Header content = _method.getResponseHeader(CONTENT_TYPE);
+    Header content = getResponseHeader(CONTENT_TYPE);
     if (content != null) {
       String headerVal = content.getValue();
-      int idx = headerVal.indexOf(";charset=");
+      int idx = headerVal.toLowerCase().indexOf(";charset=");
       if (idx > -1) {
         // content encoding included in response
         _encoding = headerVal.substring(idx + 9);
@@ -234,7 +265,7 @@
    *
    * @return an HttpState object
    */
-  public HttpState getState() {
+  public HttpClientContext getState() {
     return _state;
   }
 
@@ -247,21 +278,20 @@
     StringBuffer sb = new StringBuffer(255);
 
     sb.append("[RESPONSE STATUS LINE] -> ");
-    sb.append(((HttpMethodBase) _method).getParams().getVersion()
-        .equals(HttpVersion.HTTP_1_1) ? "HTTP/1.1 " : "HTTP/1.0 ");
-    sb.append(_method.getStatusCode()).append(' ');
-    sb.append(_method.getStatusText()).append('\n');
-    Header[] headers = _method.getResponseHeaders();
-    if (headers != null && headers.length != 0) {
-      for (int i = 0; i < headers.length; i++) {
+    sb.append(_version == null ? "HTTP/1.1" : _version).append(' ');
+    sb.append(_statusCode).append(' ');
+    sb.append(_reasonPhrase).append('\n');
+    if (_headers != null && _headers.length != 0) {
+      for (Header header : _headers) {
         sb.append("       [RESPONSE HEADER] -> ");
-        sb.append(headers[i].toExternalForm()).append('\n');
+        sb.append(header.getName()).append(": ").append(header.getValue())
+            .append('\n');
       }
     }
 
     String resBody;
     try {
-      resBody = _method.getResponseBodyAsString();
+      resBody = getResponseBodyAsRawString();
     } catch (IOException ioe) {
       resBody = "UNEXECTED EXCEPTION: " + ioe.toString();
     }
@@ -290,7 +320,7 @@
   }
 
   public String getPath() {
-    return _method.getPath();
+    return _path;
   }
 
   /*
@@ -306,7 +336,7 @@
   private String getEncodedResponse() throws IOException {
     if (_responseBody == null) {
       _responseBody = Util.getEncodedStringFromStream(
-          _method.getResponseBodyAsStream(), getResponseEncoding());
+          new ByteArrayInputStream(_rawResponseBody), getResponseEncoding());
     }
     return _responseBody;
   }
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/http/MethodFactory.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/http/MethodFactory.java
index 1bf1a39..8160b70 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/http/MethodFactory.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/http/MethodFactory.java
@@ -20,18 +20,20 @@
 
 package ee.jakarta.tck.ws.rs.common.webclient.http;
 
+import java.lang.reflect.Constructor;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.StringTokenizer;
 
-import org.apache.commons.httpclient.HttpMethod;
-import org.apache.commons.httpclient.HttpMethodBase;
-import org.apache.commons.httpclient.HttpVersion;
-import org.apache.commons.httpclient.methods.DeleteMethod;
-import org.apache.commons.httpclient.methods.GetMethod;
-import org.apache.commons.httpclient.methods.HeadMethod;
-import org.apache.commons.httpclient.methods.OptionsMethod;
-import org.apache.commons.httpclient.methods.PostMethod;
-import org.apache.commons.httpclient.methods.PutMethod;
+import org.apache.hc.client5.http.classic.methods.HttpDelete;
+import org.apache.hc.client5.http.classic.methods.HttpGet;
+import org.apache.hc.client5.http.classic.methods.HttpHead;
+import org.apache.hc.client5.http.classic.methods.HttpOptions;
+import org.apache.hc.client5.http.classic.methods.HttpPost;
+import org.apache.hc.client5.http.classic.methods.HttpPut;
+import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase;
+import org.apache.hc.core5.http.HttpVersion;
 
 import ee.jakarta.tck.ws.rs.lib.porting.TSURL;
 
@@ -76,6 +78,17 @@
    */
   private static final String OPTIONS_METHOD = "OPTIONS";
 
+  private static final Map<String, Class<? extends HttpUriRequestBase>> METHOD_MAP = new HashMap<String, Class<? extends HttpUriRequestBase>>();
+
+  static {
+    METHOD_MAP.put(GET_METHOD, HttpGet.class);
+    METHOD_MAP.put(POST_METHOD, HttpPost.class);
+    METHOD_MAP.put(PUT_METHOD, HttpPut.class);
+    METHOD_MAP.put(DELETE_METHOD, HttpDelete.class);
+    METHOD_MAP.put(HEAD_METHOD, HttpHead.class);
+    METHOD_MAP.put(OPTIONS_METHOD, HttpOptions.class);
+  }
+
   /**
    * TSURL implementation
    */
@@ -88,6 +101,10 @@
   private MethodFactory() {
   }
 
+  public static Map<String, Class<? extends HttpUriRequestBase>> getMethodMap() {
+    return METHOD_MAP;
+  }
+
   /*
    * public methods
    * ========================================================================
@@ -100,10 +117,9 @@
    *
    * @return HttpMethod based in request.
    */
-  public static HttpMethod getInstance(String request) {
+  public static HttpUriRequestBase getInstance(String request) {
     StringTokenizer st = new StringTokenizer(request);
     String method;
-    String query = null;
     String uri;
     String version;
     try {
@@ -115,38 +131,21 @@
           "Request provided: " + request + " is malformed.");
     }
 
-    // check to see if there is a query string appended
-    // to the URI
-    int queryStart = uri.indexOf('?');
-    if (queryStart != -1) {
-      query = uri.substring(queryStart + 1);
-      uri = uri.substring(0, queryStart);
-    }
-
-    HttpMethodBase req;
-
-    if (method.equals(GET_METHOD)) {
-      req = new GetMethod(uri);
-    } else if (method.equals(POST_METHOD)) {
-      req = new PostMethod(uri);
-    } else if (method.equals(PUT_METHOD)) {
-      req = new PutMethod(uri);
-    } else if (method.equals(DELETE_METHOD)) {
-      req = new DeleteMethod(uri);
-    } else if (method.equals(HEAD_METHOD)) {
-      req = new HeadMethod(uri);
-    } else if (method.equals(OPTIONS_METHOD)) {
-      req = new OptionsMethod(uri);
-    } else {
+    HttpUriRequestBase req;
+    Class<? extends HttpUriRequestBase> methodClass = METHOD_MAP.get(method);
+    if (methodClass == null) {
       throw new IllegalArgumentException("Invalid method: " + method);
     }
 
-    setHttpVersion(version, req);
-
-    if (query != null) {
-      req.setQueryString(query);
+    try {
+      Constructor<? extends HttpUriRequestBase> constructor = methodClass
+          .getDeclaredConstructor(String.class);
+      req = constructor.newInstance(uri);
+    } catch (Exception e) {
+      throw new IllegalStateException(e);
     }
 
+    setHttpVersion(version, req);
     return req;
   }
 
@@ -163,9 +162,9 @@
    * @param method
    *          method to adjust HTTP version
    */
-  private static void setHttpVersion(String version, HttpMethodBase method) {
+  private static void setHttpVersion(String version, HttpUriRequestBase method) {
     final String oneOne = "HTTP/1.1";
-    method.getParams().setVersion(
+    method.setVersion(
         (version.equals(oneOne) ? HttpVersion.HTTP_1_1 : HttpVersion.HTTP_1_0));
   }
 }
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/validation/WebValidatorBase.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/validation/WebValidatorBase.java
index a3582c2..c2620ae 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/validation/WebValidatorBase.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/common/webclient/validation/WebValidatorBase.java
@@ -24,7 +24,7 @@
 import java.util.Iterator;
 import java.util.List;
 
-import org.apache.commons.httpclient.Header;
+import org.apache.hc.core5.http.Header;
 
 import ee.jakarta.tck.ws.rs.lib.util.TestUtil;
 import ee.jakarta.tck.ws.rs.common.webclient.WebTestCase;
@@ -575,14 +575,14 @@
         StringBuffer sb = new StringBuffer(255);
         sb.append("[WebValidatorBase] Unable to find the following header");
         sb.append(" in the server's response: ");
-        sb.append(currentHeader.toExternalForm()).append("\n");
+        sb.append(formatHeader(currentHeader)).append("\n");
         sb.append("[WebValidatorBase] Response headers recieved from");
         sb.append(" server:");
 
         Header[] resHeaders = _res.getResponseHeaders();
         for (int i = 0; i < resHeaders.length; i++) {
           sb.append("\n\tResponseHeader -> ");
-          sb.append(resHeaders[i].toExternalForm());
+          sb.append(formatHeader(resHeaders[i]));
         }
         sb.append("\n");
         TestUtil.logErr(sb.toString());
@@ -590,7 +590,7 @@
         return false;
       } else {
         TestUtil.logTrace("[WebValidatorBase] Found expected header: "
-            + currentHeader.toExternalForm());
+            + formatHeader(currentHeader));
         return true;
       }
     }
@@ -635,14 +635,14 @@
             StringBuffer sb = new StringBuffer(255);
             sb.append("[WebValidatorBase] Unexpected header found in the ");
             sb.append("server's response: ");
-            sb.append(currentHeader.toExternalForm()).append("\n");
+            sb.append(formatHeader(currentHeader)).append("\n");
             sb.append("[WebValidatorBase] Response headers recieved from");
             sb.append("server:");
 
             Header[] resHeaders = _res.getResponseHeaders();
             for (int j = 0; j < resHeaders.length; j++) {
               sb.append("\n\tResponseHeader -> ");
-              sb.append(resHeaders[j].toExternalForm());
+              sb.append(formatHeader(resHeaders[j]));
             }
             sb.append("\n");
             TestUtil.logErr(sb.toString());
@@ -666,4 +666,8 @@
       return false;
     }
   }
+
+  private String formatHeader(Header header) {
+    return header.getName() + ": " + header.getValue();
+  }
 }
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/core/request/JAXRSClientIT.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/core/request/JAXRSClientIT.java
index bdda2fe..463bec6 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/core/request/JAXRSClientIT.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/core/request/JAXRSClientIT.java
@@ -16,7 +16,7 @@
 
 package ee.jakarta.tck.ws.rs.ee.rs.core.request;
 
-import org.apache.commons.httpclient.Header;
+import org.apache.hc.core5.http.Header;
 
 import java.io.InputStream;
 import java.io.IOException;
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/core/securitycontext/JAXRSClient.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/core/securitycontext/JAXRSClient.java
index 38a85e4..a7ed5f3 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/core/securitycontext/JAXRSClient.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/core/securitycontext/JAXRSClient.java
@@ -16,7 +16,7 @@
 
 package ee.jakarta.tck.ws.rs.ee.rs.core.securitycontext;
 
-import org.apache.commons.httpclient.Header;
+import org.apache.hc.core5.http.Header;
 
 import ee.jakarta.tck.ws.rs.common.webclient.http.HttpResponse;
 import ee.jakarta.tck.ws.rs.common.JAXRSCommonClient;
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/jaxrs21/ee/patch/server/AdaptiveHttpRequest.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/jaxrs21/ee/patch/server/AdaptiveHttpRequest.java
index fab1801..70999f1 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/jaxrs21/ee/patch/server/AdaptiveHttpRequest.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/jaxrs21/ee/patch/server/AdaptiveHttpRequest.java
@@ -20,528 +20,18 @@
 
 package ee.jakarta.tck.ws.rs.jaxrs21.ee.patch.server;
 
-import java.io.IOException;
-import java.util.StringTokenizer;
+import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase;
 
-import org.apache.commons.httpclient.Cookie;
-import org.apache.commons.httpclient.Header;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpConnection;
-import org.apache.commons.httpclient.HttpException;
-import org.apache.commons.httpclient.HttpMethod;
-import org.apache.commons.httpclient.HttpState;
-import org.apache.commons.httpclient.UsernamePasswordCredentials;
-import org.apache.commons.httpclient.auth.AuthScope;
-import org.apache.commons.httpclient.cookie.CookiePolicy;
-import org.apache.commons.httpclient.methods.EntityEnclosingMethod;
-import org.apache.commons.httpclient.methods.StringRequestEntity;
-import org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory;
-import org.apache.commons.httpclient.protocol.Protocol;
-import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
-import org.apache.commons.httpclient.protocol.SSLProtocolSocketFactory;
-
-import ee.jakarta.tck.ws.rs.lib.util.TestUtil;
-import ee.jakarta.tck.ws.rs.common.webclient.Util;
 import ee.jakarta.tck.ws.rs.common.webclient.http.HttpRequest;
-import ee.jakarta.tck.ws.rs.common.webclient.http.HttpResponse;
-
-/**
- * Represents an HTTP client Request
- */
 
 public class AdaptiveHttpRequest extends HttpRequest {
-  /**
-   * Method representation of request.
-   */
-  private HttpMethod _method = null;
 
-  /**
-   * Target web container host
-   */
-  private String _host = null;
-
-  /**
-   * Target web container port
-   */
-  private int _port = DEFAULT_HTTP_PORT;
-
-  /**
-   * Is the request going over SSL
-   */
-  private boolean _isSecure = false;
-
-  /**
-   * HTTP state
-   */
-  private HttpState _state = null;
-
-  /**
-   * Original request line for this request.
-   */
-  private String _requestLine = null;
-
-  /**
-   * Authentication type for current request
-   */
-  private int _authType = NO_AUTHENTICATION;
-
-  /**
-   * Flag to determine if session tracking will be used or not.
-   */
-  private boolean _useCookies = false;
-
-  /**
-   * Content length of request body.
-   */
-  private int _contentLength = 0;
-
-  Header[] _headers = null;
-
-  /**
-   * Creates new HttpRequest based of the passed request line. The request line
-   * provied must be in the form of:<br>
-   * 
-   * <pre>
-   *     METHOD PATH HTTP-VERSION
-   *     Ex.  GET /index.html HTTP/1.0
-   * </pre>
-   */
   public AdaptiveHttpRequest(String requestLine, String host, int port) {
-    super("GET /fake.jsp HTTP/1.1", host, port);
-    _method = AdaptiveMethodFactory.getInstance(requestLine);
-    _method.setFollowRedirects(false);
-    _host = host;
-    _port = port;
-
-    if (port == DEFAULT_SSL_PORT) {
-      _isSecure = true;
-    }
-
-    // If we got this far, the request line is in the proper
-    // format
-    _requestLine = requestLine;
+    super(requestLine, host, port);
   }
 
-  /*
-   * public methods
-   * ========================================================================
-   */
-
-  /**
-   * <code>getRequestPath</code> returns the request path for this particular
-   * request.
-   *
-   * @return String request path
-   */
-  public String getRequestPath() {
-    return _method.getPath();
-  }
-
-  /**
-   * <code>getRequestMethod</code> returns the request type, i.e., GET, POST,
-   * etc.
-   *
-   * @return String request type
-   */
-  public String getRequestMethod() {
-    return _method.getName();
-  }
-
-  /**
-   * <code>isSecureConnection()</code> indicates if the Request is secure or
-   * not.
-   *
-   * @return boolean whether Request is using SSL or not.
-   */
-  public boolean isSecureRequest() {
-    return _isSecure;
-  }
-
-  /**
-   * <code>setSecureRequest</code> configures this request to use SSL.
-   *
-   * @param secure
-   *          - whether the Request uses SSL or not.
-   */
-  public void setSecureRequest(boolean secure) {
-    _isSecure = secure;
-  }
-
-  /**
-   * <code>setContent</code> will set the body for this request. Note, this is
-   * only valid for POST and PUT operations, however, if called and the request
-   * represents some other HTTP method, it will be no-op'd.
-   *
-   * @param content
-   *          request content
-   */
-  @SuppressWarnings("deprecation")
-  public void setContent(String content) {
-    if (_method instanceof EntityEnclosingMethod) {
-      ((EntityEnclosingMethod) _method)
-          .setRequestEntity(new StringRequestEntity(content));
-    }
-    _contentLength = content.length();
-  }
-
-  /**
-   * <code>setAuthenticationCredentials configures the request to
-   * perform authentication.
-   *
-   * <p><code>username</code> and <code>password</code> cannot be null.
-   * </p>
-   *
-   * <p>
-   * It is legal for <code>realm</code> to be null.
-   * </p>
-   *
-   * @param username
-   *          the user
-   * @param password
-   *          the user's password
-   * @param authType
-   *          authentication type
-   * @param realm
-   *          authentication realm
-   */
-  public void setAuthenticationCredentials(String username, String password,
-      int authType, String realm) {
-    if (username == null) {
-      throw new IllegalArgumentException("Username cannot be null");
-    }
-
-    if (password == null) {
-      throw new IllegalArgumentException("Password cannot be null");
-    }
-
-    UsernamePasswordCredentials cred = new UsernamePasswordCredentials(username,
-        password);
-    AuthScope scope = new AuthScope(_host, _port, realm);
-    getState().setCredentials(scope, cred);
-    TestUtil.logTrace("[HttpRequest] Added credentials for '" + username
-        + "' with password '" + password + "' in realm '" + realm + "'");
-
-    _authType = authType;
-  }
-
-  /**
-   * <code>addRequestHeader</code> adds a request header to this request. If a
-   * request header of the same name already exists, the new value, will be
-   * added to the set of already existing values.
-   *
-   * <strong>NOTE:</strong> that header names are not case-sensitive.
-   *
-   * @param headerName
-   *          request header name
-   * @param headerValue
-   *          request header value
-   */
-  public void addRequestHeader(String headerName, String headerValue) {
-    _method.addRequestHeader(headerName, headerValue);
-    TestUtil.logTrace("[HttpRequest] Added request header: "
-        + _method.getRequestHeader(headerName).toExternalForm());
-  }
-
-  public void addRequestHeader(String header) {
-    StringTokenizer st = new StringTokenizer(header, "|");
-    while (st.hasMoreTokens()) {
-      String h = st.nextToken();
-      if (h.toLowerCase().startsWith("cookie")) {
-        createCookie(h);
-        continue;
-      }
-      int col = h.indexOf(':');
-      addRequestHeader(h.substring(0, col).trim(), h.substring(col + 1).trim());
-    }
-  }
-
-  /**
-   * <code>setRequestHeader</code> sets a request header for this request
-   * overwritting any previously existing header/values with the same name.
-   *
-   * <strong>NOTE:</strong> Header names are not case-sensitive.
-   *
-   * @param headerName
-   *          request header name
-   * @param headerValue
-   *          request header value
-   */
-  public void setRequestHeader(String headerName, String headerValue) {
-    _method.setRequestHeader(headerName, headerValue);
-    TestUtil.logTrace("[HttpRequest] Set request header: "
-        + _method.getRequestHeader(headerName).toExternalForm());
-
-  }
-
-  /**
-   * <code>setFollowRedirects</code> indicates whether HTTP redirects are
-   * followed. By default, redirects are not followed.
-   */
-  public void setFollowRedirects(boolean followRedirects) {
-    _method.setFollowRedirects(followRedirects);
-  }
-
-  /**
-   * <code>getFollowRedirects</code> indicates whether HTTP redirects are
-   * followed.
-   */
-  public boolean getFollowRedirects() {
-    return _method.getFollowRedirects();
-  }
-
-  /**
-   * <code>setState</code> will set the HTTP state for the current request (i.e.
-   * session tracking). This has the side affect
-   */
-  public void setState(HttpState state) {
-    _state = state;
-    _useCookies = true;
-  }
-
-  /**
-   * <code>execute</code> will dispatch the current request to the target
-   * server.
-   *
-   * @return HttpResponse the server's response.
-   * @throws IOException
-   *           if an I/O error occurs during dispatch.
-   */
-  public HttpResponse execute() throws IOException, HttpException {
-    String method;
-    int defaultPort;
-    ProtocolSocketFactory factory;
-
-    if (_method.getFollowRedirects()) {
-      client = new HttpClient();
-
-      if (_isSecure) {
-        method = "https";
-        defaultPort = DEFAULT_SSL_PORT;
-        factory = new SSLProtocolSocketFactory();
-      } else {
-        method = "http";
-        defaultPort = DEFAULT_HTTP_PORT;
-        factory = new DefaultProtocolSocketFactory();
-      }
-
-      Protocol protocol = new Protocol(method, factory, defaultPort);
-      HttpConnection conn = new HttpConnection(_host, _port, protocol);
-
-      if (conn.isOpen()) {
-        throw new IllegalStateException("Connection incorrectly opened");
-      }
-
-      conn.open();
-
-      TestUtil.logMsg("[HttpRequest] Dispatching request: '" + _requestLine
-          + "' to target server at '" + _host + ":" + _port + "'");
-
-      addSupportHeaders();
-      _headers = _method.getRequestHeaders();
-
-      TestUtil.logTrace(
-          "########## The real value set: " + _method.getFollowRedirects());
-
-      client.getHostConfiguration().setHost(_host, _port, protocol);
-
-      client.executeMethod(_method);
-
-      return new HttpResponse(_host, _port, _isSecure, _method, getState());
-    } else {
-      if (_isSecure) {
-        method = "https";
-        defaultPort = DEFAULT_SSL_PORT;
-        factory = new SSLProtocolSocketFactory();
-      } else {
-        method = "http";
-        defaultPort = DEFAULT_HTTP_PORT;
-        factory = new DefaultProtocolSocketFactory();
-      }
-
-      Protocol protocol = new Protocol(method, factory, defaultPort);
-      HttpConnection conn = new HttpConnection(_host, _port, protocol);
-
-      if (conn.isOpen()) {
-        throw new IllegalStateException("Connection incorrectly opened");
-      }
-
-      conn.open();
-
-      TestUtil.logMsg("[HttpRequest] Dispatching request: '" + _requestLine
-          + "' to target server at '" + _host + ":" + _port + "'");
-
-      addSupportHeaders();
-      _headers = _method.getRequestHeaders();
-
-      TestUtil.logTrace(
-          "########## The real value set: " + _method.getFollowRedirects());
-
-      _method.execute(getState(), conn);
-
-      return new HttpResponse(_host, _port, _isSecure, _method, getState());
-    }
-  }
-
-  /**
-   * Returns the current state for this request.
-   *
-   * @return HttpState current state
-   */
-  public HttpState getState() {
-    if (_state == null) {
-      _state = new HttpState();
-    }
-    return _state;
-  }
-
-  public String toString() {
-    StringBuffer sb = new StringBuffer(255);
-    sb.append("[REQUEST LINE] -> ").append(_requestLine).append('\n');
-
-    if (_headers != null && _headers.length != 0) {
-
-      for (Header _header : _headers) {
-        sb.append("       [REQUEST HEADER] -> ");
-        sb.append(_header.toExternalForm()).append('\n');
-      }
-    }
-
-    if (_contentLength != 0) {
-      sb.append("       [REQUEST BODY LENGTH] -> ").append(_contentLength);
-      sb.append('\n');
-    }
-
-    return sb.toString();
-
-  }
-
-  /*
-   * private methods
-   * ========================================================================
-   */
-
-  private void createCookie(String cookieHeader) {
-    String cookieLine = cookieHeader.substring(cookieHeader.indexOf(':') + 1)
-        .trim();
-    StringTokenizer st = new StringTokenizer(cookieLine, " ;");
-    Cookie cookie = new Cookie();
-    cookie.setVersion(1);
-
-    getState();
-
-    if (cookieLine.indexOf("$Version") == -1) {
-      cookie.setVersion(0);
-      _method.getParams().setCookiePolicy(CookiePolicy.NETSCAPE);
-    }
-
-    while (st.hasMoreTokens()) {
-      String token = st.nextToken();
-
-      if (token.charAt(0) != '$' && !token.startsWith("Domain")
-          && !token.startsWith("Path")) {
-        cookie.setName(token.substring(0, token.indexOf('=')));
-        cookie.setValue(token.substring(token.indexOf('=') + 1));
-      } else if (token.indexOf("Domain") > -1) {
-        cookie.setDomainAttributeSpecified(true);
-        cookie.setDomain(token.substring(token.indexOf('=') + 1));
-      } else if (token.indexOf("Path") > -1) {
-        cookie.setPathAttributeSpecified(true);
-        cookie.setPath(token.substring(token.indexOf('=') + 1));
-      }
-    }
-    _state.addCookie(cookie);
-
-  }
-
-  /**
-   * Adds any support request headers necessary for this request. These headers
-   * will be added based on the state of the request.
-   */
-  private void addSupportHeaders() {
-
-    // Authentication headers
-    // NOTE: Possibly move logic to generic method
-    switch (_authType) {
-    case NO_AUTHENTICATION:
-      break;
-    case BASIC_AUTHENTICATION:
-      setBasicAuthorizationHeader();
-      break;
-    case DIGEST_AUTHENTICATION:
-      throw new UnsupportedOperationException(
-          "Digest Authentication is not currently " + "supported");
-    }
-
-    // A Host header will be added to each request to handle
-    // cases where virtual hosts are used, or there is no DNS
-    // available on the system where the container is running.
-    setHostHeader();
-
-    // Content length header
-    setContentLengthHeader();
-
-    // Cookies
-    setCookieHeader();
-  }
-
-  /**
-   * Sets a basic authentication header in the request is Request is configured
-   * to use basic authentication
-   */
-  private void setBasicAuthorizationHeader() {
-    UsernamePasswordCredentials cred = (UsernamePasswordCredentials) getState()
-        .getCredentials(new AuthScope(_host, _port, null));
-    String authString = null;
-    if (cred != null) {
-      authString = "Basic " + Util.getBase64EncodedString(
-          cred.getUserName() + ":" + cred.getPassword());
-    } else {
-      TestUtil.logTrace("[HttpRequest] NULL CREDENTIALS");
-    }
-    _method.setRequestHeader("Authorization", authString);
-  }
-
-  /**
-   * Sets a Content-Length header in the request if content is present
-   */
-  private void setContentLengthHeader() {
-    if (_contentLength > 0) {
-      _method.setRequestHeader("Content-Length",
-          Integer.toString(_contentLength));
-    }
-  }
-
-  /**
-   * Sets a host header in the request. If the configured host value is an IP
-   * address, the Host header will be sent, but without any value.
-   *
-   * If we adhered to the HTTP/1.1 spec, the Host header must be empty of the
-   * target server is identified via IP address. However, no user agents I've
-   * tested follow this. And if a custom client library does this, it may not
-   * work properly with the target server. For now, the Host request-header will
-   * always have a value.
-   */
-  private void setHostHeader() {
-    if (_port == DEFAULT_HTTP_PORT || _port == DEFAULT_SSL_PORT) {
-      _method.setRequestHeader("Host", _host);
-    } else {
-      _method.setRequestHeader("Host", _host + ":" + _port);
-    }
-  }
-
-  /**
-   * Sets a Cookie header if this request is using cookies.
-   */
-  private void setCookieHeader() {
-    if (_useCookies) {
-      Cookie[] cookies = _state.getCookies();
-      if (cookies != null && cookies.length > 0) {
-        Header cHeader = CookiePolicy.getCookieSpec(CookiePolicy.RFC_2109)
-            .formatCookieHeader(_state.getCookies());
-        if (cHeader != null) {
-          _method.setRequestHeader(cHeader);
-        }
-      }
-    }
+  @Override
+  protected HttpUriRequestBase createMethod(String requestLine) {
+    return AdaptiveMethodFactory.getInstance(requestLine);
   }
 }
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/jaxrs21/ee/patch/server/AdaptiveMethodFactory.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/jaxrs21/ee/patch/server/AdaptiveMethodFactory.java
index dd77372..43490a0 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/jaxrs21/ee/patch/server/AdaptiveMethodFactory.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/jaxrs21/ee/patch/server/AdaptiveMethodFactory.java
@@ -20,165 +20,22 @@
 
 package ee.jakarta.tck.ws.rs.jaxrs21.ee.patch.server;
 
-import java.lang.reflect.Constructor;
-import java.util.HashMap;
 import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.StringTokenizer;
 
-import org.apache.commons.httpclient.HttpMethod;
-import org.apache.commons.httpclient.HttpMethodBase;
-import org.apache.commons.httpclient.HttpVersion;
-import org.apache.commons.httpclient.methods.DeleteMethod;
-import org.apache.commons.httpclient.methods.GetMethod;
-import org.apache.commons.httpclient.methods.HeadMethod;
-import org.apache.commons.httpclient.methods.OptionsMethod;
-import org.apache.commons.httpclient.methods.PostMethod;
-import org.apache.commons.httpclient.methods.PutMethod;
+import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase;
 
-import ee.jakarta.tck.ws.rs.lib.porting.TSURL;
-
-/**
- * Simple factory class which returns HttpMethod implementations based on a
- * request line.
- * <p>
- * For example, a request line of <tt>GET /index.jsp HTTP/1.0</tt> would return
- * an HttpMethod implementation that handles GET requests using HTTP/1.0.
- * </p>
- */
+import ee.jakarta.tck.ws.rs.common.webclient.http.MethodFactory;
 
 public class AdaptiveMethodFactory {
 
-  /**
-   * HTTP GET
-   */
-  private static final String GET_METHOD = "GET";
-
-  /**
-   * HTTP POST
-   */
-  private static final String POST_METHOD = "POST";
-
-  /**
-   * HTTP HEAD
-   */
-  private static final String HEAD_METHOD = "HEAD";
-
-  /**
-   * HTTP PUT
-   */
-  private static final String PUT_METHOD = "PUT";
-
-  /**
-   * HTTP DELETE
-   */
-  private static final String DELETE_METHOD = "DELETE";
-
-  /**
-   * HTTP OPTIONS
-   */
-  private static final String OPTIONS_METHOD = "OPTIONS";
-
-  private static final Map<String, Class<? extends HttpMethodBase>> METHOD_MAP = new HashMap<>();
-  static {
-    METHOD_MAP.put(GET_METHOD, GetMethod.class);
-    METHOD_MAP.put(POST_METHOD, PostMethod.class);
-    METHOD_MAP.put(PUT_METHOD, PutMethod.class);
-    METHOD_MAP.put(DELETE_METHOD, DeleteMethod.class);
-    METHOD_MAP.put(HEAD_METHOD, HeadMethod.class);
-    METHOD_MAP.put(OPTIONS_METHOD, OptionsMethod.class);
-  }
-
-  /**
-   * TSURL implementation
-   */
-  private static final TSURL TS_URL = new TSURL();
-
-  /**
-   * Private constructor as all interaction with this class is through the
-   * getInstance() method.
-   */
   private AdaptiveMethodFactory() {
   }
 
-  /*
-   * public methods
-   * ========================================================================
-   */
-
-  public static final Map<String, Class<? extends HttpMethodBase>> getMethodMap() {
-    return METHOD_MAP;
+  public static Map<String, Class<? extends HttpUriRequestBase>> getMethodMap() {
+    return MethodFactory.getMethodMap();
   }
 
-  /**
-   * Returns the approriate request method based on the provided request string.
-   * The request must be in the format of METHOD URI_PATH HTTP_VERSION, i.e. GET
-   * /index.jsp HTTP/1.1.
-   *
-   * @return HttpMethod based in request.
-   */
-  public static HttpMethod getInstance(String request) {
-    StringTokenizer st = new StringTokenizer(request);
-    String method;
-    String query = null;
-    String uri;
-    String version;
-    try {
-      method = st.nextToken();
-      uri = TS_URL.getRequest(st.nextToken());
-      version = st.nextToken();
-    } catch (NoSuchElementException nsee) {
-      throw new IllegalArgumentException(
-          "Request provided: " + request + " is malformed.");
-    }
-
-    // check to see if there is a query string appended
-    // to the URI
-    int queryStart = uri.indexOf('?');
-    if (queryStart != -1) {
-      query = uri.substring(queryStart + 1);
-      uri = uri.substring(0, queryStart);
-    }
-
-    HttpMethodBase req;
-    Class<? extends HttpMethodBase> methodClass = METHOD_MAP.get(method);
-    if (methodClass == null) {
-      throw new IllegalArgumentException("Invalid method: " + method);
-    }
-
-    Constructor<? extends HttpMethodBase> constructor;
-    try {
-      constructor = methodClass.getDeclaredConstructor(String.class);
-      req = constructor.newInstance(uri);
-    } catch (Exception e) {
-      throw new IllegalStateException(e);
-    }
-
-    setHttpVersion(version, req);
-
-    if (query != null) {
-      req.setQueryString(query);
-    }
-
-    return req;
-  }
-
-  /*
-   * private methods
-   * ========================================================================
-   */
-
-  /**
-   * Sets the HTTP version for the method in question.
-   *
-   * @param version
-   *          HTTP version to use for this request
-   * @param method
-   *          method to adjust HTTP version
-   */
-  private static void setHttpVersion(String version, HttpMethodBase method) {
-    final String oneOne = "HTTP/1.1";
-    method.getParams().setVersion(
-        (version.equals(oneOne) ? HttpVersion.HTTP_1_1 : HttpVersion.HTTP_1_0));
+  public static HttpUriRequestBase getInstance(String request) {
+    return MethodFactory.getInstance(request);
   }
 }
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/jaxrs21/ee/patch/server/PatchMethod.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/jaxrs21/ee/patch/server/PatchMethod.java
index be50bc3..7ac9f77 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/jaxrs21/ee/patch/server/PatchMethod.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/jaxrs21/ee/patch/server/PatchMethod.java
@@ -16,19 +16,17 @@
 
 package ee.jakarta.tck.ws.rs.jaxrs21.ee.patch.server;
 
-import org.apache.commons.httpclient.methods.EntityEnclosingMethod;
+import java.net.URI;
 
-public class PatchMethod extends EntityEnclosingMethod {
+import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase;
+
+public class PatchMethod extends HttpUriRequestBase {
+
   public PatchMethod() {
-    super();
+    this("/");
   }
 
   public PatchMethod(String uri) {
-    super(uri);
-  }
-
-  @Override
-  public String getName() {
-    return "PATCH";
+    super("PATCH", URI.create(uri));
   }
 }
diff --git a/jersey-tck/pom.xml b/jersey-tck/pom.xml
index 68898c8..dbf942c 100644
--- a/jersey-tck/pom.xml
+++ b/jersey-tck/pom.xml
@@ -131,12 +131,6 @@
         </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>
