diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/StandardMethods.java b/httpclient5/src/main/java/org/apache/hc/client5/http/StandardMethods.java
deleted file mode 100644
index 39ba814..0000000
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/StandardMethods.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.hc.client5.http;
-
-import java.util.Locale;
-
-/**
- * Common HTTP methods defined by the HTTP spec.
- *
- * @since 5.0
- *
- * @deprecated Use {@link org.apache.hc.core5.http.Methods}
- */
-@Deprecated
-public enum StandardMethods {
-
-    GET(true, true),
-    HEAD(true, true),
-    POST(false, false),
-    PUT(false, true),
-    DELETE(false, true),
-    CONNECT(false, false),
-    TRACE(true, true),
-    OPTIONS(true, true),
-    PATCH(false, false);
-
-    private final boolean safe;
-    private final boolean idempotent;
-
-    StandardMethods(final boolean safe, final boolean idempotent) {
-        this.safe = safe;
-        this.idempotent = idempotent;
-    }
-
-    public boolean isSafe() {
-        return safe;
-    }
-
-    public boolean isIdempotent() {
-        return idempotent;
-    }
-
-    public static boolean isSafe(final String value) {
-        if (value == null) {
-            return false;
-        }
-        try {
-            return valueOf(value.toUpperCase(Locale.ROOT)).safe;
-        } catch (final IllegalArgumentException ex) {
-            return false;
-        }
-    }
-
-    public static boolean isIdempotent(final String value) {
-        if (value == null) {
-            return false;
-        }
-        try {
-            return valueOf(value.toUpperCase(Locale.ROOT)).idempotent;
-        } catch (final IllegalArgumentException ex) {
-            return false;
-        }
-    }
-
-}
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/async/methods/AsyncRequestBuilder.java b/httpclient5/src/main/java/org/apache/hc/client5/http/async/methods/AsyncRequestBuilder.java
deleted file mode 100644
index 91a6f4f..0000000
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/async/methods/AsyncRequestBuilder.java
+++ /dev/null
@@ -1,453 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.hc.client5.http.async.methods;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.apache.hc.client5.http.config.RequestConfig;
-import org.apache.hc.core5.http.ContentType;
-import org.apache.hc.core5.http.Header;
-import org.apache.hc.core5.http.HttpHost;
-import org.apache.hc.core5.http.Methods;
-import org.apache.hc.core5.http.NameValuePair;
-import org.apache.hc.core5.http.ProtocolVersion;
-import org.apache.hc.core5.http.message.BasicHeader;
-import org.apache.hc.core5.http.message.BasicNameValuePair;
-import org.apache.hc.core5.http.message.HeaderGroup;
-import org.apache.hc.core5.http.nio.AsyncEntityProducer;
-import org.apache.hc.core5.http.nio.AsyncRequestProducer;
-import org.apache.hc.core5.http.nio.entity.BasicAsyncEntityProducer;
-import org.apache.hc.core5.http.nio.entity.StringAsyncEntityProducer;
-import org.apache.hc.core5.http.nio.support.BasicRequestProducer;
-import org.apache.hc.core5.net.URIBuilder;
-import org.apache.hc.core5.net.URLEncodedUtils;
-import org.apache.hc.core5.util.Args;
-import org.apache.hc.core5.util.TextUtils;
-
-/**
- * Builder for {@link AsyncRequestProducer} instances.
- * <p>
- * Please note that this class treats parameters differently depending on composition
- * of the request: if the request has a content entity explicitly set with
- * {@link #setEntity(AsyncEntityProducer)} or it is not an entity enclosing method
- * (such as POST or PUT), parameters will be added to the query component of the request URI.
- * Otherwise, parameters will be added as a URL encoded entity.
- * </p>
- *
- * @since 5.0
- *
- * @deprecated Use {@link org.apache.hc.core5.http.nio.support.AsyncRequestBuilder}
- */
-@Deprecated
-public class AsyncRequestBuilder {
-
-    private HttpHost host;
-    private String path;
-    private URI uri;
-    private String method;
-    private Charset charset;
-    private ProtocolVersion version;
-    private HeaderGroup headergroup;
-    private AsyncEntityProducer entityProducer;
-    private List<NameValuePair> parameters;
-    private RequestConfig config;
-
-    AsyncRequestBuilder() {
-    }
-
-    AsyncRequestBuilder(final String method) {
-        super();
-        this.method = method;
-    }
-
-    AsyncRequestBuilder(final Methods method) {
-        this(method.name());
-    }
-
-    AsyncRequestBuilder(final String method, final URI uri) {
-        super();
-        this.method = method;
-        this.uri = uri;
-    }
-
-    AsyncRequestBuilder(final Methods method, final HttpHost host, final String path) {
-        super();
-        this.method = method.name();
-        this.host = host;
-        this.path = path;
-    }
-
-    AsyncRequestBuilder(final Methods method, final URI uri) {
-        this(method.name(), uri);
-    }
-
-    AsyncRequestBuilder(final Methods method, final String uri) {
-        this(method.name(), uri != null ? URI.create(uri) : null);
-    }
-
-    AsyncRequestBuilder(final String method, final String uri) {
-        this(method, uri != null ? URI.create(uri) : null);
-    }
-
-    public static AsyncRequestBuilder create(final String method) {
-        Args.notBlank(method, "HTTP method");
-        return new AsyncRequestBuilder(method);
-    }
-
-    public static AsyncRequestBuilder get() {
-        return new AsyncRequestBuilder(Methods.GET);
-    }
-
-    public static AsyncRequestBuilder get(final URI uri) {
-        return new AsyncRequestBuilder(Methods.GET, uri);
-    }
-
-    public static AsyncRequestBuilder get(final String uri) {
-        return new AsyncRequestBuilder(Methods.GET, uri);
-    }
-
-    public static AsyncRequestBuilder get(final HttpHost host, final String path) {
-        return new AsyncRequestBuilder(Methods.GET, host, path);
-    }
-
-    public static AsyncRequestBuilder head() {
-        return new AsyncRequestBuilder(Methods.HEAD);
-    }
-
-    public static AsyncRequestBuilder head(final URI uri) {
-        return new AsyncRequestBuilder(Methods.HEAD, uri);
-    }
-
-    public static AsyncRequestBuilder head(final String uri) {
-        return new AsyncRequestBuilder(Methods.HEAD, uri);
-    }
-
-    public static AsyncRequestBuilder head(final HttpHost host, final String path) {
-        return new AsyncRequestBuilder(Methods.HEAD, host, path);
-    }
-
-    public static AsyncRequestBuilder patch() {
-        return new AsyncRequestBuilder(Methods.PATCH);
-    }
-
-    public static AsyncRequestBuilder patch(final URI uri) {
-        return new AsyncRequestBuilder(Methods.PATCH, uri);
-    }
-
-    public static AsyncRequestBuilder patch(final String uri) {
-        return new AsyncRequestBuilder(Methods.PATCH, uri);
-    }
-
-    public static AsyncRequestBuilder patch(final HttpHost host, final String path) {
-        return new AsyncRequestBuilder(Methods.PATCH, host, path);
-    }
-
-    public static AsyncRequestBuilder post() {
-        return new AsyncRequestBuilder(Methods.POST);
-    }
-
-    public static AsyncRequestBuilder post(final URI uri) {
-        return new AsyncRequestBuilder(Methods.POST, uri);
-    }
-
-    public static AsyncRequestBuilder post(final String uri) {
-        return new AsyncRequestBuilder(Methods.POST, uri);
-    }
-
-    public static AsyncRequestBuilder post(final HttpHost host, final String path) {
-        return new AsyncRequestBuilder(Methods.POST, host, path);
-    }
-
-    public static AsyncRequestBuilder put() {
-        return new AsyncRequestBuilder(Methods.PUT);
-    }
-
-    public static AsyncRequestBuilder put(final URI uri) {
-        return new AsyncRequestBuilder(Methods.PUT, uri);
-    }
-
-    public static AsyncRequestBuilder put(final String uri) {
-        return new AsyncRequestBuilder(Methods.PUT, uri);
-    }
-
-    public static AsyncRequestBuilder put(final HttpHost host, final String path) {
-        return new AsyncRequestBuilder(Methods.PUT, host, path);
-    }
-
-    public static AsyncRequestBuilder delete() {
-        return new AsyncRequestBuilder(Methods.DELETE);
-    }
-
-    public static AsyncRequestBuilder delete(final URI uri) {
-        return new AsyncRequestBuilder(Methods.DELETE, uri);
-    }
-
-    public static AsyncRequestBuilder delete(final String uri) {
-        return new AsyncRequestBuilder(Methods.DELETE, uri);
-    }
-
-    public static AsyncRequestBuilder delete(final HttpHost host, final String path) {
-        return new AsyncRequestBuilder(Methods.DELETE, host, path);
-    }
-
-    public static AsyncRequestBuilder trace() {
-        return new AsyncRequestBuilder(Methods.TRACE);
-    }
-
-    public static AsyncRequestBuilder trace(final URI uri) {
-        return new AsyncRequestBuilder(Methods.TRACE, uri);
-    }
-
-    public static AsyncRequestBuilder trace(final String uri) {
-        return new AsyncRequestBuilder(Methods.TRACE, uri);
-    }
-
-    public static AsyncRequestBuilder trace(final HttpHost host, final String path) {
-        return new AsyncRequestBuilder(Methods.TRACE, host, path);
-    }
-
-    public static AsyncRequestBuilder options() {
-        return new AsyncRequestBuilder(Methods.OPTIONS);
-    }
-
-    public static AsyncRequestBuilder options(final URI uri) {
-        return new AsyncRequestBuilder(Methods.OPTIONS, uri);
-    }
-
-    public static AsyncRequestBuilder options(final String uri) {
-        return new AsyncRequestBuilder(Methods.OPTIONS, uri);
-    }
-
-    public static AsyncRequestBuilder options(final HttpHost host, final String path) {
-        return new AsyncRequestBuilder(Methods.OPTIONS, host, path);
-    }
-
-    public AsyncRequestBuilder setCharset(final Charset charset) {
-        this.charset = charset;
-        return this;
-    }
-
-    public Charset getCharset() {
-        return charset;
-    }
-
-    public String getMethod() {
-        return method;
-    }
-
-    public URI getUri() {
-        return uri;
-    }
-
-    public AsyncRequestBuilder setUri(final URI uri) {
-        this.uri = uri;
-        this.host = null;
-        this.path = null;
-        return this;
-    }
-
-    public AsyncRequestBuilder setUri(final String uri) {
-        this.uri = uri != null ? URI.create(uri) : null;
-        this.host = null;
-        this.path = null;
-        return this;
-    }
-
-    public ProtocolVersion getVersion() {
-        return version;
-    }
-
-    public AsyncRequestBuilder setVersion(final ProtocolVersion version) {
-        this.version = version;
-        return this;
-    }
-
-    public Header getFirstHeader(final String name) {
-        return headergroup != null ? headergroup.getFirstHeader(name) : null;
-    }
-
-    public Header getLastHeader(final String name) {
-        return headergroup != null ? headergroup.getLastHeader(name) : null;
-    }
-
-    public Header[] getHeaders(final String name) {
-        return headergroup != null ? headergroup.getHeaders(name) : null;
-    }
-
-    public AsyncRequestBuilder addHeader(final Header header) {
-        if (headergroup == null) {
-            headergroup = new HeaderGroup();
-        }
-        headergroup.addHeader(header);
-        return this;
-    }
-
-    public AsyncRequestBuilder addHeader(final String name, final String value) {
-        if (headergroup == null) {
-            headergroup = new HeaderGroup();
-        }
-        this.headergroup.addHeader(new BasicHeader(name, value));
-        return this;
-    }
-
-    public AsyncRequestBuilder removeHeader(final Header header) {
-        if (headergroup == null) {
-            headergroup = new HeaderGroup();
-        }
-        headergroup.removeHeader(header);
-        return this;
-    }
-
-    public AsyncRequestBuilder removeHeaders(final String name) {
-        if (name == null || headergroup == null) {
-            return this;
-        }
-        for (final Iterator<Header> i = headergroup.headerIterator(); i.hasNext(); ) {
-            final Header header = i.next();
-            if (name.equalsIgnoreCase(header.getName())) {
-                i.remove();
-            }
-        }
-        return this;
-    }
-
-    public AsyncRequestBuilder setHeader(final Header header) {
-        if (headergroup == null) {
-            headergroup = new HeaderGroup();
-        }
-        this.headergroup.setHeader(header);
-        return this;
-    }
-
-    public AsyncRequestBuilder setHeader(final String name, final String value) {
-        if (headergroup == null) {
-            headergroup = new HeaderGroup();
-        }
-        this.headergroup.setHeader(new BasicHeader(name, value));
-        return this;
-    }
-
-    public List<NameValuePair> getParameters() {
-        return parameters != null ? new ArrayList<>(parameters) :
-            new ArrayList<NameValuePair>();
-    }
-
-    public AsyncRequestBuilder addParameter(final NameValuePair nvp) {
-        Args.notNull(nvp, "Name value pair");
-        if (parameters == null) {
-            parameters = new LinkedList<>();
-        }
-        parameters.add(nvp);
-        return this;
-    }
-
-    public AsyncRequestBuilder addParameter(final String name, final String value) {
-        return addParameter(new BasicNameValuePair(name, value));
-    }
-
-    public AsyncRequestBuilder addParameters(final NameValuePair... nvps) {
-        for (final NameValuePair nvp: nvps) {
-            addParameter(nvp);
-        }
-        return this;
-    }
-
-    public RequestConfig getConfig() {
-        return config;
-    }
-
-    public AsyncRequestBuilder setConfig(final RequestConfig config) {
-        this.config = config;
-        return this;
-    }
-
-    public AsyncEntityProducer getEntity() {
-        return entityProducer;
-    }
-
-    public AsyncRequestBuilder setEntity(final AsyncEntityProducer entityProducer) {
-        this.entityProducer = entityProducer;
-        return this;
-    }
-
-    public AsyncRequestBuilder setEntity(final String content, final ContentType contentType) {
-        this.entityProducer = new BasicAsyncEntityProducer(content, contentType);
-        return this;
-    }
-
-    public AsyncRequestBuilder setEntity(final byte[] content, final ContentType contentType) {
-        this.entityProducer = new BasicAsyncEntityProducer(content, contentType);
-        return this;
-    }
-
-    public AsyncRequestProducer build() {
-        AsyncEntityProducer entityProducerCopy = this.entityProducer;
-        if (parameters != null && !parameters.isEmpty()) {
-            if (entityProducerCopy == null && (Methods.POST.isSame(method) || Methods.PUT.isSame(method))) {
-                final String content = URLEncodedUtils.format(
-                        parameters,
-                        charset != null ? charset : ContentType.APPLICATION_FORM_URLENCODED.getCharset());
-                entityProducerCopy = new StringAsyncEntityProducer(
-                        content,
-                        ContentType.APPLICATION_FORM_URLENCODED);
-            } else {
-                try {
-                    uri = new URIBuilder(uri)
-                      .setCharset(this.charset)
-                      .addParameters(parameters)
-                      .build();
-                } catch (final URISyntaxException ex) {
-                    // should never happen
-                }
-            }
-        }
-
-        if (entityProducerCopy != null && Methods.isSafe(method)) {
-            throw new IllegalStateException(Methods.TRACE + " requests may not include an entity.");
-        }
-
-        final ConfigurableHttpRequest request = host != null ?
-                new ConfigurableHttpRequest(method, host, !TextUtils.isBlank(path) ? path : "/") :
-                new ConfigurableHttpRequest(method, uri != null ? uri : URI.create("/"));
-        if (this.headergroup != null) {
-            request.setHeaders(this.headergroup.getHeaders());
-        }
-        if (version != null) {
-            request.setVersion(version);
-        }
-        request.setConfig(config);
-        return new BasicRequestProducer(request, entityProducerCopy);
-    }
-
-}
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/classic/methods/RequestBuilder.java b/httpclient5/src/main/java/org/apache/hc/client5/http/classic/methods/RequestBuilder.java
deleted file mode 100644
index 3f8f4ab..0000000
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/classic/methods/RequestBuilder.java
+++ /dev/null
@@ -1,526 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.hc.client5.http.classic.methods;
-
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.apache.hc.client5.http.StandardMethods;
-import org.apache.hc.client5.http.config.Configurable;
-import org.apache.hc.client5.http.config.RequestConfig;
-import org.apache.hc.client5.http.entity.UrlEncodedFormEntity;
-import org.apache.hc.core5.http.ClassicHttpRequest;
-import org.apache.hc.core5.http.ContentType;
-import org.apache.hc.core5.http.Header;
-import org.apache.hc.core5.http.HttpEntity;
-import org.apache.hc.core5.http.HttpVersion;
-import org.apache.hc.core5.http.NameValuePair;
-import org.apache.hc.core5.http.ProtocolVersion;
-import org.apache.hc.core5.http.io.entity.EntityUtils;
-import org.apache.hc.core5.http.message.BasicHeader;
-import org.apache.hc.core5.http.message.BasicNameValuePair;
-import org.apache.hc.core5.http.message.HeaderGroup;
-import org.apache.hc.core5.net.URIBuilder;
-import org.apache.hc.core5.util.Args;
-
-/**
- * Builder for {@link ClassicHttpRequest} instances.
- * <p>
- * Please note that this class treats parameters differently depending on composition
- * of the request: if the request has a content entity explicitly set with
- * {@link #setEntity(org.apache.hc.core5.http.HttpEntity)} or it is not an entity enclosing
- * method (such as POST or PUT), parameters will be added to the query component
- * of the request URI. Otherwise, parameters will be added as a URL encoded
- * {@link UrlEncodedFormEntity entity}.
- * </p>
- *
- * @since 4.3
- *
- * @deprecated Use {@link org.apache.hc.core5.http.io.support.ClassicRequestBuilder}
- */
-@Deprecated
-public class RequestBuilder {
-
-    private String method;
-    private Charset charset;
-    private ProtocolVersion version;
-    private URI uri;
-    private HeaderGroup headerGroup;
-    private HttpEntity entity;
-    private List<NameValuePair> parameters;
-    private RequestConfig config;
-
-    RequestBuilder(final String method) {
-        super();
-        this.charset = StandardCharsets.UTF_8;
-        this.method = method;
-    }
-
-    RequestBuilder() {
-    }
-
-    RequestBuilder(final StandardMethods method) {
-        this(method.name());
-    }
-
-    RequestBuilder(final String method, final URI uri) {
-        super();
-        this.method = method;
-        this.uri = uri;
-    }
-
-    RequestBuilder(final StandardMethods method, final URI uri) {
-        this(method.name(), uri);
-    }
-
-    RequestBuilder(final String method, final String uri) {
-        super();
-        this.method = method;
-        this.uri = uri != null ? URI.create(uri) : null;
-    }
-
-    RequestBuilder(final StandardMethods method, final String uri) {
-        this(method.name(), uri);
-    }
-
-    public static RequestBuilder create(final String method) {
-        Args.notBlank(method, "HTTP method");
-        return new RequestBuilder(method);
-    }
-
-    public static RequestBuilder get() {
-        return new RequestBuilder(StandardMethods.GET.name());
-    }
-
-    /**
-     * @since 4.4
-     */
-    public static RequestBuilder get(final URI uri) {
-        return new RequestBuilder(StandardMethods.GET, uri);
-    }
-
-    /**
-     * @since 4.4
-     */
-    public static RequestBuilder get(final String uri) {
-        return new RequestBuilder(StandardMethods.GET, uri);
-    }
-
-    public static RequestBuilder head() {
-        return new RequestBuilder(StandardMethods.HEAD);
-    }
-
-    /**
-     * @since 4.4
-     */
-    public static RequestBuilder head(final URI uri) {
-        return new RequestBuilder(StandardMethods.HEAD, uri);
-    }
-
-    /**
-     * @since 4.4
-     */
-    public static RequestBuilder head(final String uri) {
-        return new RequestBuilder(StandardMethods.HEAD, uri);
-    }
-
-    /**
-     * @since 4.4
-     */
-    public static RequestBuilder patch() {
-        return new RequestBuilder(StandardMethods.PATCH.name());
-    }
-
-    /**
-     * @since 4.4
-     */
-    public static RequestBuilder patch(final URI uri) {
-        return new RequestBuilder(StandardMethods.PATCH, uri);
-    }
-
-    /**
-     * @since 4.4
-     */
-    public static RequestBuilder patch(final String uri) {
-        return new RequestBuilder(StandardMethods.PATCH, uri);
-    }
-
-    public static RequestBuilder post() {
-        return new RequestBuilder(StandardMethods.POST);
-    }
-
-    /**
-     * @since 4.4
-     */
-    public static RequestBuilder post(final URI uri) {
-        return new RequestBuilder(StandardMethods.POST, uri);
-    }
-
-    /**
-     * @since 4.4
-     */
-    public static RequestBuilder post(final String uri) {
-        return new RequestBuilder(StandardMethods.POST, uri);
-    }
-
-    public static RequestBuilder put() {
-        return new RequestBuilder(StandardMethods.PUT);
-    }
-
-    /**
-     * @since 4.4
-     */
-    public static RequestBuilder put(final URI uri) {
-        return new RequestBuilder(StandardMethods.PUT, uri);
-    }
-
-    /**
-     * @since 4.4
-     */
-    public static RequestBuilder put(final String uri) {
-        return new RequestBuilder(StandardMethods.PUT, uri);
-    }
-
-    public static RequestBuilder delete() {
-        return new RequestBuilder(StandardMethods.DELETE);
-    }
-
-    /**
-     * @since 4.4
-     */
-    public static RequestBuilder delete(final URI uri) {
-        return new RequestBuilder(StandardMethods.DELETE, uri);
-    }
-
-    /**
-     * @since 4.4
-     */
-    public static RequestBuilder delete(final String uri) {
-        return new RequestBuilder(StandardMethods.DELETE, uri);
-    }
-
-    public static RequestBuilder trace() {
-        return new RequestBuilder(StandardMethods.TRACE);
-    }
-
-    /**
-     * @since 4.4
-     */
-    public static RequestBuilder trace(final URI uri) {
-        return new RequestBuilder(StandardMethods.TRACE, uri);
-    }
-
-    /**
-     * @since 4.4
-     */
-    public static RequestBuilder trace(final String uri) {
-        return new RequestBuilder(StandardMethods.TRACE, uri);
-    }
-
-    public static RequestBuilder options() {
-        return new RequestBuilder(StandardMethods.OPTIONS);
-    }
-
-    /**
-     * @since 4.4
-     */
-    public static RequestBuilder options(final URI uri) {
-        return new RequestBuilder(StandardMethods.OPTIONS, uri);
-    }
-
-    /**
-     * @since 4.4
-     */
-    public static RequestBuilder options(final String uri) {
-        return new RequestBuilder(StandardMethods.OPTIONS, uri);
-    }
-
-    public static RequestBuilder copy(final ClassicHttpRequest request) {
-        Args.notNull(request, "HTTP request");
-        return new RequestBuilder().doCopy(request);
-    }
-
-    private RequestBuilder doCopy(final ClassicHttpRequest request) {
-        if (request == null) {
-            return this;
-        }
-        method = request.getMethod();
-        version = request.getVersion();
-
-        if (headerGroup == null) {
-            headerGroup = new HeaderGroup();
-        }
-        headerGroup.clear();
-        headerGroup.setHeaders(request.getHeaders());
-
-        parameters = null;
-        entity = null;
-
-        final HttpEntity originalEntity = request.getEntity();
-        if (originalEntity != null) {
-            final ContentType contentType = ContentType.parse(originalEntity.getContentType());
-            if (contentType != null &&
-                contentType.getMimeType().equals(ContentType.APPLICATION_FORM_URLENCODED.getMimeType())) {
-                try {
-                    final List<NameValuePair> formParams = EntityUtils.parse(originalEntity);
-                    if (!formParams.isEmpty()) {
-                        parameters = formParams;
-                    }
-                } catch (final IOException ignore) {
-                }
-            } else {
-                entity = originalEntity;
-            }
-        }
-
-        try {
-            uri = request.getUri();
-        } catch (final URISyntaxException ignore) {
-        }
-        if (request instanceof Configurable) {
-            config = ((Configurable) request).getConfig();
-        } else {
-            config = null;
-        }
-        return this;
-    }
-
-    /**
-     * @since 4.4
-     */
-    public RequestBuilder setCharset(final Charset charset) {
-        this.charset = charset;
-        return this;
-    }
-
-    /**
-     * @since 4.4
-     */
-    public Charset getCharset() {
-        return charset;
-    }
-
-    public String getMethod() {
-        return method;
-    }
-
-    public ProtocolVersion getVersion() {
-        return version;
-    }
-
-    public RequestBuilder setVersion(final ProtocolVersion version) {
-        this.version = version;
-        return this;
-    }
-
-    public URI getUri() {
-        return uri;
-    }
-
-    public RequestBuilder setUri(final URI uri) {
-        this.uri = uri;
-        return this;
-    }
-
-    public RequestBuilder setUri(final String uri) {
-        this.uri = uri != null ? URI.create(uri) : null;
-        return this;
-    }
-
-    public Header getFirstHeader(final String name) {
-        return headerGroup != null ? headerGroup.getFirstHeader(name) : null;
-    }
-
-    public Header getLastHeader(final String name) {
-        return headerGroup != null ? headerGroup.getLastHeader(name) : null;
-    }
-
-    public Header[] getHeaders(final String name) {
-        return headerGroup != null ? headerGroup.getHeaders(name) : null;
-    }
-
-    public RequestBuilder addHeader(final Header header) {
-        if (headerGroup == null) {
-            headerGroup = new HeaderGroup();
-        }
-        headerGroup.addHeader(header);
-        return this;
-    }
-
-    public RequestBuilder addHeader(final String name, final String value) {
-        if (headerGroup == null) {
-            headerGroup = new HeaderGroup();
-        }
-        this.headerGroup.addHeader(new BasicHeader(name, value));
-        return this;
-    }
-
-    public RequestBuilder removeHeader(final Header header) {
-        if (headerGroup == null) {
-            headerGroup = new HeaderGroup();
-        }
-        headerGroup.removeHeader(header);
-        return this;
-    }
-
-    public RequestBuilder removeHeaders(final String name) {
-        if (name == null || headerGroup == null) {
-            return this;
-        }
-        for (final Iterator<Header> i = headerGroup.headerIterator(); i.hasNext(); ) {
-            final Header header = i.next();
-            if (name.equalsIgnoreCase(header.getName())) {
-                i.remove();
-            }
-        }
-        return this;
-    }
-
-    public RequestBuilder setHeader(final Header header) {
-        if (headerGroup == null) {
-            headerGroup = new HeaderGroup();
-        }
-        this.headerGroup.setHeader(header);
-        return this;
-    }
-
-    public RequestBuilder setHeader(final String name, final String value) {
-        if (headerGroup == null) {
-            headerGroup = new HeaderGroup();
-        }
-        this.headerGroup.setHeader(new BasicHeader(name, value));
-        return this;
-    }
-
-    public HttpEntity getEntity() {
-        return entity;
-    }
-
-    public RequestBuilder setEntity(final HttpEntity entity) {
-        this.entity = entity;
-        return this;
-    }
-
-    public List<NameValuePair> getParameters() {
-        return parameters != null ? new ArrayList<>(parameters) :
-            new ArrayList<NameValuePair>();
-    }
-
-    public RequestBuilder addParameter(final NameValuePair nvp) {
-        Args.notNull(nvp, "Name value pair");
-        if (parameters == null) {
-            parameters = new LinkedList<>();
-        }
-        parameters.add(nvp);
-        return this;
-    }
-
-    public RequestBuilder addParameter(final String name, final String value) {
-        return addParameter(new BasicNameValuePair(name, value));
-    }
-
-    public RequestBuilder addParameters(final NameValuePair... nvps) {
-        for (final NameValuePair nvp: nvps) {
-            addParameter(nvp);
-        }
-        return this;
-    }
-
-    public RequestConfig getConfig() {
-        return config;
-    }
-
-    public RequestBuilder setConfig(final RequestConfig config) {
-        this.config = config;
-        return this;
-    }
-
-    public ClassicHttpRequest build() {
-        URI uriNotNull = this.uri != null ? this.uri : URI.create("/");
-        HttpEntity entityCopy = this.entity;
-        if (parameters != null && !parameters.isEmpty()) {
-            if (entityCopy == null && (StandardMethods.POST.name().equalsIgnoreCase(method)
-                    || StandardMethods.PUT.name().equalsIgnoreCase(method))) {
-                entityCopy = new UrlEncodedFormEntity(parameters, charset != null ? charset : StandardCharsets.ISO_8859_1);
-            } else {
-                try {
-                    uriNotNull = new URIBuilder(uriNotNull)
-                      .setCharset(this.charset)
-                      .addParameters(parameters)
-                      .build();
-                } catch (final URISyntaxException ex) {
-                    // should never happen
-                }
-            }
-        }
-
-        if (entityCopy != null && StandardMethods.TRACE.name().equalsIgnoreCase(method)) {
-            throw new IllegalStateException(StandardMethods.TRACE.name() + " requests may not include an entity.");
-        }
-
-        final HttpUriRequestBase result = new HttpUriRequestBase(method, uriNotNull);
-        result.setVersion(this.version != null ? this.version : HttpVersion.HTTP_1_1);
-        if (this.headerGroup != null) {
-            result.setHeaders(this.headerGroup.getHeaders());
-        }
-        result.setEntity(entityCopy);
-        result.setConfig(this.config);
-        return result;
-    }
-
-    @Override
-    public String toString() {
-        final StringBuilder builder = new StringBuilder();
-        builder.append("RequestBuilder [method=");
-        builder.append(method);
-        builder.append(", charset=");
-        builder.append(charset);
-        builder.append(", version=");
-        builder.append(version);
-        builder.append(", uri=");
-        builder.append(uri);
-        builder.append(", headerGroup=");
-        builder.append(headerGroup);
-        builder.append(", entity=");
-        builder.append(entity);
-        builder.append(", parameters=");
-        builder.append(parameters);
-        builder.append(", config=");
-        builder.append(config);
-        builder.append("]");
-        return builder.toString();
-    }
-
-}
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/TLS.java b/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/TLS.java
deleted file mode 100644
index 5d175ea..0000000
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/TLS.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.hc.client5.http.ssl;
-
-import org.apache.hc.core5.http.ParseException;
-import org.apache.hc.core5.http.ProtocolVersion;
-
-/**
- * Supported {@code TLS} protocol versions.
- *
- * @since 5.0
- *
- * @deprecated Use {@link org.apache.hc.core5.http.ssl.TLS}
- */
-@Deprecated
-public enum TLS {
-
-    V_1_0("TLSv1",   new ProtocolVersion("TLS", 1, 0)),
-    V_1_1("TLSv1.1", new ProtocolVersion("TLS", 1, 1)),
-    V_1_2("TLSv1.2", new ProtocolVersion("TLS", 1, 2)),
-    V_1_3("TLSv1.3", new ProtocolVersion("TLS", 1, 3));
-
-    public final String ident;
-    public final ProtocolVersion version;
-
-    TLS(final String ident, final ProtocolVersion version) {
-        this.ident = ident;
-        this.version = version;
-    }
-
-    public boolean isSame(final ProtocolVersion protocolVersion) {
-        return version.equals(protocolVersion);
-    }
-
-    public boolean isComparable(final ProtocolVersion protocolVersion) {
-        return version.isComparable(protocolVersion);
-    }
-
-    public boolean greaterEquals(final ProtocolVersion protocolVersion) {
-        return version.greaterEquals(protocolVersion);
-    }
-
-    public boolean lessEquals(final ProtocolVersion protocolVersion) {
-        return version.lessEquals(protocolVersion);
-    }
-
-    public static ProtocolVersion parse(final String s) throws ParseException {
-        return org.apache.hc.core5.http.ssl.TLS.parse(s);
-    }
-
-}
