diff --git a/commons-jcs-core/pom.xml b/commons-jcs-core/pom.xml
index 8049bc7..6853a02 100644
--- a/commons-jcs-core/pom.xml
+++ b/commons-jcs-core/pom.xml
@@ -48,8 +48,8 @@
 
     <!--  JDBC DISK CACHE -->
     <dependency>
-      <groupId>commons-dbcp</groupId>
-      <artifactId>commons-dbcp</artifactId>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-dbcp2</artifactId>
       <optional>true</optional>
     </dependency>
 
@@ -94,14 +94,8 @@
     </dependency -->
 
     <dependency>
-      <groupId>org.apache.velocity</groupId>
-      <artifactId>velocity-tools</artifactId>
-      <optional>true</optional>
-    </dependency>
-
-    <dependency>
-      <groupId>commons-httpclient</groupId>
-      <artifactId>commons-httpclient</artifactId>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpclient</artifactId>
       <optional>true</optional>
     </dependency>
 
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/remote/http/client/AbstractHttpClient.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/remote/http/client/AbstractHttpClient.java
index 71cd9ec..9862887 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/remote/http/client/AbstractHttpClient.java
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/remote/http/client/AbstractHttpClient.java
@@ -1,7 +1,5 @@
 package org.apache.commons.jcs.auxiliary.remote.http.client;
 
-import java.io.IOException;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -21,14 +19,18 @@
  * under the License.
  */
 
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpMethod;
-import org.apache.commons.httpclient.HttpState;
-import org.apache.commons.httpclient.HttpVersion;
-import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
-import org.apache.commons.httpclient.cookie.CookiePolicy;
+import java.io.IOException;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpVersion;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.config.CookieSpecs;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.client.methods.RequestBuilder;
+import org.apache.http.impl.client.HttpClientBuilder;
 
 /**
  * This class simply configures the http multithreaded connection manager.
@@ -37,12 +39,12 @@
  */
 public abstract class AbstractHttpClient
 {
-    /** The connection manager. */
-    private MultiThreadedHttpConnectionManager connectionManager;
-
     /** The client */
     private HttpClient httpClient;
 
+    /** The protocol version */
+    private HttpVersion httpVersion;
+
     /** Configuration settings. */
     private RemoteHttpCacheAttributes remoteHttpCacheAttributes;
 
@@ -58,84 +60,87 @@
     public AbstractHttpClient( RemoteHttpCacheAttributes remoteHttpCacheAttributes )
     {
         this.remoteHttpCacheAttributes = remoteHttpCacheAttributes;
-        this.connectionManager = new MultiThreadedHttpConnectionManager();
-        this.httpClient = new HttpClient(this.connectionManager);
 
-        configureClient();
+        String httpVersion = getRemoteHttpCacheAttributes().getHttpVersion();
+        if ( "1.1".equals( httpVersion ) )
+        {
+            this.httpVersion = HttpVersion.HTTP_1_1;
+        }
+        else if ( "1.0".equals( httpVersion ) )
+        {
+            this.httpVersion = HttpVersion.HTTP_1_0;
+        }
+        else
+        {
+            log.warn( "Unrecognized value for 'httpVersion': [" + httpVersion + "], defaulting to 1.1" );
+            this.httpVersion = HttpVersion.HTTP_1_1;
+        }
+
+        HttpClientBuilder builder = HttpClientBuilder.create();
+        configureClient(builder);
+        this.httpClient = builder.build();
     }
 
     /**
      * Configures the http client.
+     *
+     * @param builder client builder to configure
      */
-    protected void configureClient()
+    protected void configureClient(HttpClientBuilder builder)
     {
         if ( getRemoteHttpCacheAttributes().getMaxConnectionsPerHost() > 0 )
         {
-            this.connectionManager.getParams()
-                .setMaxTotalConnections(getRemoteHttpCacheAttributes().getMaxConnectionsPerHost());
-            this.connectionManager.getParams()
-                .setDefaultMaxConnectionsPerHost(getRemoteHttpCacheAttributes().getMaxConnectionsPerHost());
+            builder.setMaxConnTotal(getRemoteHttpCacheAttributes().getMaxConnectionsPerHost());
+            builder.setMaxConnPerRoute(getRemoteHttpCacheAttributes().getMaxConnectionsPerHost());
         }
 
-        this.connectionManager.getParams().setSoTimeout( getRemoteHttpCacheAttributes().getSocketTimeoutMillis() );
-
-        String httpVersion = getRemoteHttpCacheAttributes().getHttpVersion();
-        if ( httpVersion != null )
-        {
-            if ( "1.1".equals( httpVersion ) )
-            {
-                this.httpClient.getParams().setParameter( "http.protocol.version", HttpVersion.HTTP_1_1 );
-            }
-            else if ( "1.0".equals( httpVersion ) )
-            {
-                this.httpClient.getParams().setParameter( "http.protocol.version", HttpVersion.HTTP_1_0 );
-            }
-            else
-            {
-                log.warn( "Unrecognized value for 'httpVersion': [" + httpVersion + "]" );
-            }
-        }
-
-        this.connectionManager.getParams()
-            .setConnectionTimeout(getRemoteHttpCacheAttributes().getConnectionTimeoutMillis());
-
-        // By default we instruct HttpClient to ignore cookies.
-        this.httpClient.getParams().setCookiePolicy( CookiePolicy.IGNORE_COOKIES );
+        builder.setDefaultRequestConfig(RequestConfig.custom()
+                .setConnectTimeout(getRemoteHttpCacheAttributes().getConnectionTimeoutMillis())
+                .setSocketTimeout(getRemoteHttpCacheAttributes().getSocketTimeoutMillis())
+                // By default we instruct HttpClient to ignore cookies.
+                .setCookieSpec(CookieSpecs.IGNORE_COOKIES)
+                .build());
     }
 
     /**
-     * Extracted method that can be overwritten to do additional things to the post before the call
-     * is made.
+     * Execute the web service call
      * <p>
-     * @param post the post that is about to get executed.
+     * @param builder builder for the post request
+     *
+     * @return the call response
+     *
      * @throws IOException on i/o error
      */
-    protected final void doWebserviceCall( HttpMethod post )
+    protected final HttpResponse doWebserviceCall( RequestBuilder builder )
         throws IOException
     {
-        HttpState httpState = preProcessWebserviceCall( post );
-        this.httpClient.executeMethod( null, post, httpState );
-        postProcessWebserviceCall( post, httpState );
+        preProcessWebserviceCall( builder.setVersion(httpVersion) );
+        HttpUriRequest request = builder.build();
+        HttpResponse httpResponse = this.httpClient.execute( request );
+        postProcessWebserviceCall( request, httpResponse );
+
+        return httpResponse;
     }
 
     /**
-     * Called before the executeMethod on the client.
+     * Called before the execute call on the client.
      * <p>
-     * @param post http method
-     * @return HttpState
+     * @param requestBuilder http method request builder
+     *
      * @throws IOException
      */
-    protected abstract HttpState preProcessWebserviceCall( HttpMethod post )
+    protected abstract void preProcessWebserviceCall( RequestBuilder requestBuilder )
         throws IOException;
 
     /**
-     * Called after the executeMethod on the client.
+     * Called after the execute call on the client.
      * <p>
-     * @param post http method
-     * @param httpState state
+     * @param request http request
+     * @param httpState result of execution
+     *
      * @throws IOException
      */
-    protected abstract void postProcessWebserviceCall( HttpMethod post, HttpState httpState )
+    protected abstract void postProcessWebserviceCall( HttpUriRequest request, HttpResponse httpState )
         throws IOException;
 
     /**
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/remote/http/client/RemoteHttpCacheDispatcher.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/remote/http/client/RemoteHttpCacheDispatcher.java
index a19ef51..3bf3c99 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/remote/http/client/RemoteHttpCacheDispatcher.java
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/remote/http/client/RemoteHttpCacheDispatcher.java
@@ -20,21 +20,20 @@
  */
 
 import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
+import java.nio.charset.Charset;
 
-import org.apache.commons.httpclient.HttpException;
-import org.apache.commons.httpclient.HttpMethod;
-import org.apache.commons.httpclient.HttpState;
-import org.apache.commons.httpclient.methods.ByteArrayRequestEntity;
-import org.apache.commons.httpclient.methods.PostMethod;
-import org.apache.commons.httpclient.methods.RequestEntity;
 import org.apache.commons.jcs.auxiliary.remote.behavior.IRemoteCacheDispatcher;
 import org.apache.commons.jcs.auxiliary.remote.value.RemoteCacheRequest;
 import org.apache.commons.jcs.auxiliary.remote.value.RemoteCacheResponse;
 import org.apache.commons.jcs.utils.serialization.StandardSerializer;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.http.HttpException;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.client.methods.RequestBuilder;
+import org.apache.http.entity.ByteArrayEntity;
+import org.apache.http.util.EntityUtils;
 
 /** Calls the service. */
 public class RemoteHttpCacheDispatcher
@@ -42,7 +41,7 @@
     implements IRemoteCacheDispatcher
 {
     /** Parameter encoding */
-    private static final String DEFAULT_ENCODING = "UTF-8";
+    private static final Charset DEFAULT_ENCODING = Charset.forName("UTF-8");
 
     /** Named of the parameter */
     private static final String PARAMETER_REQUEST_TYPE = "RequestType";
@@ -85,9 +84,9 @@
         {
             byte[] requestAsByteArray = serializer.serialize( remoteCacheRequest );
 
-            String url = addParameters( remoteCacheRequest, getRemoteHttpCacheAttributes().getUrl() );
-
-            byte[] responseAsByteArray = processRequest( requestAsByteArray, url );
+            byte[] responseAsByteArray = processRequest( requestAsByteArray,
+                    remoteCacheRequest,
+                    getRemoteHttpCacheAttributes().getUrl());
 
             RemoteCacheResponse<T> remoteCacheResponse = null;
             try
@@ -107,121 +106,88 @@
     }
 
     /**
-     * @param requestAsByteArray
-     * @param url
+     * Process single request
+     *
+     * @param requestAsByteArray request body
+     * @param remoteCacheRequest the cache request
+     * @param url target url
+     *
      * @return byte[] - the response
+     *
      * @throws IOException
      * @throws HttpException
      */
-    protected byte[] processRequest( byte[] requestAsByteArray, String url )
+    protected <K, V> byte[] processRequest( byte[] requestAsByteArray,
+            RemoteCacheRequest<K, V> remoteCacheRequest, String url )
         throws IOException, HttpException
     {
-        PostMethod post = new PostMethod( url );
-        RequestEntity requestEntity = new ByteArrayRequestEntity( requestAsByteArray );
-        post.setRequestEntity( requestEntity );
-        doWebserviceCall( post );
-        byte[] response = post.getResponseBody();
+        RequestBuilder builder = RequestBuilder.post( url ).setCharset( DEFAULT_ENCODING );
+
+        if ( getRemoteHttpCacheAttributes().isIncludeCacheNameAsParameter()
+            && remoteCacheRequest.getCacheName() != null )
+        {
+            builder.addParameter( PARAMETER_CACHE_NAME, remoteCacheRequest.getCacheName() );
+        }
+        if ( getRemoteHttpCacheAttributes().isIncludeKeysAndPatternsAsParameter() )
+        {
+            String keyValue = "";
+            switch ( remoteCacheRequest.getRequestType() )
+            {
+                case GET:
+                case REMOVE:
+                case GET_KEYSET:
+                    keyValue = remoteCacheRequest.getKey().toString();
+                    break;
+                case GET_MATCHING:
+                    keyValue = remoteCacheRequest.getPattern();
+                    break;
+                case GET_MULTIPLE:
+                    keyValue = remoteCacheRequest.getKeySet().toString();
+                    break;
+                case UPDATE:
+                    keyValue = remoteCacheRequest.getCacheElement().getKey().toString();
+                    break;
+                default:
+                    break;
+            }
+            builder.addParameter( PARAMETER_KEY, keyValue );
+        }
+        if ( getRemoteHttpCacheAttributes().isIncludeRequestTypeasAsParameter() )
+        {
+            builder.addParameter( PARAMETER_REQUEST_TYPE,
+                remoteCacheRequest.getRequestType().toString() );
+        }
+
+        builder.setEntity(new ByteArrayEntity( requestAsByteArray ));
+        HttpResponse httpResponse = doWebserviceCall( builder );
+        byte[] response = EntityUtils.toByteArray( httpResponse.getEntity() );
         return response;
     }
 
     /**
-     * @param remoteCacheRequest
-     * @param baseUrl
-     * @return String
-     */
-    protected <K, V> String addParameters( RemoteCacheRequest<K, V> remoteCacheRequest, String baseUrl )
-    {
-        StringBuilder url = new StringBuilder( baseUrl == null ? "" : baseUrl );
-
-        try
-        {
-            if ( baseUrl != null && baseUrl.indexOf( "?" ) == -1 )
-            {
-                url.append( "?" );
-            }
-            else
-            {
-                url.append( "&" );
-            }
-
-            if ( getRemoteHttpCacheAttributes().isIncludeCacheNameAsParameter() )
-            {
-                if ( remoteCacheRequest.getCacheName() != null )
-                {
-                    url.append( PARAMETER_CACHE_NAME + "="
-                        + URLEncoder.encode( remoteCacheRequest.getCacheName(), DEFAULT_ENCODING ) );
-                }
-            }
-            if ( getRemoteHttpCacheAttributes().isIncludeKeysAndPatternsAsParameter() )
-            {
-                String keyValue = "";
-                switch ( remoteCacheRequest.getRequestType() )
-                {
-                    case GET:
-                    case REMOVE:
-                    case GET_KEYSET:
-                        keyValue = remoteCacheRequest.getKey() + "";
-                        break;
-                    case GET_MATCHING:
-                        keyValue = remoteCacheRequest.getPattern();
-                        break;
-                    case GET_MULTIPLE:
-                        keyValue = remoteCacheRequest.getKeySet() + "";
-                        break;
-                    case UPDATE:
-                        keyValue = remoteCacheRequest.getCacheElement().getKey() + "";
-                        break;
-                    default:
-                        break;
-                }
-                String encodedKeyValue = URLEncoder.encode( keyValue, DEFAULT_ENCODING );
-                url.append( "&" + PARAMETER_KEY + "=" + encodedKeyValue );
-            }
-            if ( getRemoteHttpCacheAttributes().isIncludeRequestTypeasAsParameter() )
-            {
-                url.append( "&"
-                    + PARAMETER_REQUEST_TYPE
-                    + "="
-                    + URLEncoder.encode( remoteCacheRequest.getRequestType().toString(), DEFAULT_ENCODING ) );
-            }
-        }
-        catch ( UnsupportedEncodingException e )
-        {
-            log.error( "Couldn't encode URL.", e );
-        }
-
-        if ( log.isDebugEnabled() )
-        {
-            log.debug( "Url: " + url.toString() );
-        }
-
-        return url.toString();
-    }
-
-    /**
-     * Called before the executeMethod on the client.
+     * Called before the execute call on the client.
      * <p>
-     * @param post http method
-     * @return HttpState
+     * @param requestBuilder http method request builder
+     *
      * @throws IOException
      */
     @Override
-    protected HttpState preProcessWebserviceCall( HttpMethod post )
+    protected void preProcessWebserviceCall( RequestBuilder requestBuilder )
         throws IOException
     {
         // do nothing. Child can override.
-        return null;
     }
 
     /**
-     * Called after the executeMethod on the client.
+     * Called after the execute call on the client.
      * <p>
-     * @param post http method
-     * @param httpState state
+     * @param request http request
+     * @param httpState result of execution
+     *
      * @throws IOException
      */
     @Override
-    protected void postProcessWebserviceCall( HttpMethod post, HttpState httpState )
+    protected void postProcessWebserviceCall( HttpUriRequest request, HttpResponse httpState )
         throws IOException
     {
         // do nothing. Child can override.
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/config/PropertySetter.java b/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/config/PropertySetter.java
index f33800d..c6502e4 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/config/PropertySetter.java
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/config/PropertySetter.java
@@ -1,5 +1,14 @@
 package org.apache.commons.jcs.utils.config;
 
+import java.beans.BeanInfo;
+import java.beans.IntrospectionException;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
+import java.io.File;
+import java.lang.reflect.Method;
+import java.util.Enumeration;
+import java.util.Properties;
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -22,15 +31,6 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
-import java.beans.BeanInfo;
-import java.beans.IntrospectionException;
-import java.beans.Introspector;
-import java.beans.PropertyDescriptor;
-import java.io.File;
-import java.lang.reflect.Method;
-import java.util.Enumeration;
-import java.util.Properties;
-
 /**
  * This class is based on the log4j class org.apache.log4j.config.PropertySetter that was made by
  * Anders Kristensen
@@ -265,7 +265,6 @@
         }
         else if( type.isEnum() )
         {
-            @SuppressWarnings("unchecked") // type check in if()
             Enum<?> en = Enum.valueOf(type.asSubclass(Enum.class), v );
             return en;
         }
diff --git a/commons-jcs-core/src/test/java/org/apache/commons/jcs/auxiliary/remote/http/client/RemoteHttpCacheDispatcherUnitTest.java b/commons-jcs-core/src/test/java/org/apache/commons/jcs/auxiliary/remote/http/client/RemoteHttpCacheDispatcherUnitTest.java
deleted file mode 100644
index 923c5af..0000000
--- a/commons-jcs-core/src/test/java/org/apache/commons/jcs/auxiliary/remote/http/client/RemoteHttpCacheDispatcherUnitTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.apache.commons.jcs.auxiliary.remote.http.client;
-
-/*
- * 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.
- */
-
-import junit.framework.TestCase;
-import org.apache.commons.jcs.auxiliary.remote.value.RemoteCacheRequest;
-import org.apache.commons.jcs.auxiliary.remote.value.RemoteRequestType;
-
-/** Unit tests for the dispatcher. */
-public class RemoteHttpCacheDispatcherUnitTest
-    extends TestCase
-{
-    /**
-     * Verify that we don't get two ?'s
-     */
-    public void testAddParameters_withQueryString()
-    {
-        // SETUP
-        RemoteHttpCacheAttributes remoteHttpCacheAttributes = new RemoteHttpCacheAttributes();
-        RemoteHttpCacheDispatcher dispatcher = new RemoteHttpCacheDispatcher( remoteHttpCacheAttributes );
-
-        RemoteCacheRequest<String, String> remoteCacheRequest = new RemoteCacheRequest<String, String>();
-        remoteCacheRequest.setRequestType( RemoteRequestType.REMOVE_ALL );
-        String cacheName = "myCache";
-        remoteCacheRequest.setCacheName( cacheName );
-
-        String baseUrl = "http://localhost?thishasaquestionmark";
-
-        // DO WORK
-        String result = dispatcher.addParameters( remoteCacheRequest, baseUrl );
-
-        // VERIFY
-        assertEquals( "Wrong url", baseUrl + "&CacheName=" + cacheName + "&Key=&RequestType=REMOVE_ALL", result  );
-    }
-}
diff --git a/pom.xml b/pom.xml
index 79bff4a..a6cecd8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -306,17 +306,9 @@
 
       <!--  JDBC DISK CACHE -->
       <dependency>
-        <groupId>commons-dbcp</groupId>
-        <artifactId>commons-dbcp</artifactId>
-        <version>1.4</version>
-        <optional>true</optional>
-      </dependency>
-
-      <!--  JDBC DISK CACHE -->
-      <dependency>
-        <groupId>commons-pool</groupId>
-        <artifactId>commons-pool</artifactId>
-        <version>1.6</version>
+        <groupId>org.apache.commons</groupId>
+        <artifactId>commons-dbcp2</artifactId>
+        <version>2.1.1</version>
         <optional>true</optional>
       </dependency>
 
@@ -365,16 +357,9 @@
       </dependency -->
 
       <dependency>
-        <groupId>org.apache.velocity</groupId>
-        <artifactId>velocity-tools</artifactId>
-        <version>2.0</version>
-        <optional>true</optional>
-      </dependency>
-
-      <dependency>
-        <groupId>commons-httpclient</groupId>
-        <artifactId>commons-httpclient</artifactId>
-        <version>3.1</version>
+        <groupId>org.apache.httpcomponents</groupId>
+        <artifactId>httpclient</artifactId>
+        <version>4.5.3</version>
         <optional>true</optional>
       </dependency>
 
@@ -539,7 +524,7 @@
 
     <jsr107.api.version>1.0.0</jsr107.api.version>
     <commons.collections.version>4.1</commons.collections.version>
-    <commons.lang.version>3.3.2</commons.lang.version>
+    <commons.lang.version>3.6</commons.lang.version>
     <commons.clirr.version>2.8</commons.clirr.version>
 
     <test.type>Unit</test.type>
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index bd49413..4376e99 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -20,6 +20,18 @@
 	</properties>
 	<body>
         <release version="3.0" date="unreleased">
+            <action dev="tv" type="remove">
+                Remove dependency on velocity-tools
+            </action>
+            <action dev="tv" type="remove">
+                Remove deprecated code
+            </action>
+            <action issue="JCS-181" dev="tv" type="update">
+                Update dependency to httpclient 4.5.3
+            </action>
+            <action dev="tv" type="update">
+                Update dependency commons-dbcp2
+            </action>
             <action dev="tv" type="update">
                 Finally require Java 8
             </action>
