diff --git a/modules/integration/pom.xml b/modules/integration/pom.xml
index b57160c..f8e7120 100644
--- a/modules/integration/pom.xml
+++ b/modules/integration/pom.xml
@@ -126,11 +126,6 @@
             <artifactId>log4j-slf4j-impl</artifactId>
         </dependency>
         <dependency>
-            <groupId>commons-httpclient</groupId>
-            <artifactId>commons-httpclient</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
             <groupId>com.sun.activation</groupId>
             <artifactId>jakarta.activation</artifactId>
             <scope>test</scope>
diff --git a/modules/integration/test/org/apache/axis2/mtom/EchoRawMTOMFaultReportTest.java b/modules/integration/test/org/apache/axis2/mtom/EchoRawMTOMFaultReportTest.java
index 2ce2373..7f2191a 100644
--- a/modules/integration/test/org/apache/axis2/mtom/EchoRawMTOMFaultReportTest.java
+++ b/modules/integration/test/org/apache/axis2/mtom/EchoRawMTOMFaultReportTest.java
@@ -31,18 +31,30 @@
 import org.apache.axis2.integration.UtilServerBasedTestCase;
 import org.apache.axis2.receivers.RawXMLINOutMessageReceiver;
 import org.apache.axis2.wsdl.WSDLConstants;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpMethod;
-import org.apache.commons.httpclient.HttpMethodRetryHandler;
-import org.apache.commons.httpclient.HttpStatus;
-import org.apache.commons.httpclient.NoHttpResponseException;
-import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
-import org.apache.commons.httpclient.methods.PostMethod;
-import org.apache.commons.httpclient.params.HttpMethodParams;
+
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.HttpRequestRetryHandler;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicHeader;
+import org.apache.http.Header;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpHeaders;
+import org.apache.http.NoHttpResponseException;
+import org.apache.http.entity.InputStreamEntity;
+import org.apache.http.HttpStatus;
+import org.apache.http.protocol.HttpContext;
+import org.apache.http.util.EntityUtils;
 
 import javax.xml.namespace.QName;
+import java.util.List;
+import java.util.ArrayList;
 import java.io.FileInputStream;
 import java.io.IOException;
+import java.io.InterruptedIOException;
 
 public class EchoRawMTOMFaultReportTest extends UtilServerBasedTestCase {
 
@@ -82,50 +94,52 @@
     }
 
     public void testEchoFaultSync() throws Exception {
-        HttpClient client = new HttpClient();
+	HttpPost httpPost = new HttpPost("http://127.0.0.1:" + (UtilServer.TESTING_PORT) + "/axis2/services/EchoService/mtomSample");
 
-        PostMethod httppost = new PostMethod("http://127.0.0.1:"
-                + (UtilServer.TESTING_PORT)
-                + "/axis2/services/EchoService/mtomSample");
-
-        HttpMethodRetryHandler myretryhandler = new HttpMethodRetryHandler() {
-            public boolean retryMethod(final HttpMethod method,
-                                       final IOException exception,
-                                       int executionCount) {
-                if (executionCount >= 10) {
-                    return false;
-                }
-                if (exception instanceof NoHttpResponseException) {
-                    return true;
-                }
-                if (!method.isRequestSent()) {
-                    return true;
-                }
-                // otherwise do not retry
-                return false;
-            }
-        };
-        httppost.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
-                                          myretryhandler);
-        httppost.setRequestEntity(new InputStreamRequestEntity(
+        httpPost.setEntity(new InputStreamEntity(
                 new FileInputStream(TestingUtils.prefixBaseDirectory("test-resources/mtom/wmtom.bin"))));
 
-        httppost.setRequestHeader("Content-Type",
-                                  "multipart/related; boundary=--MIMEBoundary258DE2D105298B756D; type=\"application/xop+xml\"; start=\"<0.15B50EF49317518B01@apache.org>\"; start-info=\"application/soap+xml\"");
-        try {
-            client.executeMethod(httppost);
+	Header header = new BasicHeader(HttpHeaders.CONTENT_TYPE, "multipart/related; boundary=--MIMEBoundary258DE2D105298B756D; type=\"application/xop+xml\"; start=\"<0.15B50EF49317518B01@apache.org>\"; start-info=\"application/soap+xml\"");
 
-            if (httppost.getStatusCode() ==
-                    HttpStatus.SC_INTERNAL_SERVER_ERROR) {
+	List<Header> headers = new ArrayList();
+        headers.add(header);
+	
+	CloseableHttpClient httpclient = HttpClients.custom().setDefaultHeaders(headers).setRetryHandler(new HttpRequestRetryHandler() {
+                @Override
+                public boolean retryRequest(IOException exception, int executionCount, HttpContext context) {
+                    if (executionCount >= 10) {
+                        return false;
+                    }
+                    if (exception instanceof NoHttpResponseException) {
+                        return true;
+                    }
+                    if (exception instanceof InterruptedIOException) {
+                        return true;
+                    }
+                    HttpClientContext clientContext = HttpClientContext.adapt(context);
+                    if (!clientContext.isRequestSent()) {
+                        return true;
+                    }
+                    // otherwise do not retry
+                    return false;
+                }
+            }).build();
+
+
+        try {
+            CloseableHttpResponse hcResponse = httpclient.execute(httpPost);
+	    int status = hcResponse.getStatusLine().getStatusCode();
+            if (status == HttpStatus.SC_INTERNAL_SERVER_ERROR) {
                 
                 // TODO: There is a missing wsa:Action header in the SOAP message.  Fix or look for correct fault text!
 
 //                assertEquals("HTTP/1.1 500 Internal server error",
 //                             httppost.getStatusLine().toString());
             }
-        } catch (NoHttpResponseException e) {
-        } finally {
-            httppost.releaseConnection();
+	    System.out.println("\ntestEchoFaultSync() result status: " + status + " , statusLine: " + hcResponse.getStatusLine());
+
+        }finally {
+            httpclient.close();
         }
-    }
+    }	
 }
diff --git a/modules/integration/test/org/apache/axis2/rest/RESTfulServiceTest.java b/modules/integration/test/org/apache/axis2/rest/RESTfulServiceTest.java
index a6fed47..4ba2973 100644
--- a/modules/integration/test/org/apache/axis2/rest/RESTfulServiceTest.java
+++ b/modules/integration/test/org/apache/axis2/rest/RESTfulServiceTest.java
@@ -34,11 +34,19 @@
 import org.apache.axis2.engine.AxisConfiguration;
 import org.apache.axis2.integration.UtilServer;
 import org.apache.axis2.integration.UtilServerBasedTestCase;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpStatus;
-import org.apache.commons.httpclient.methods.GetMethod;
+
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpStatus;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
 
 import javax.xml.namespace.QName;
+import java.io.InterruptedIOException;
 import java.util.Comparator;
 import java.util.Map;
 import java.util.TreeMap;
@@ -132,43 +140,59 @@
         axisConfig.addService(axisService);
         assertEquals("StockService", axisService.getName());
 
-        HttpClient httpClient = new HttpClient();
-
         String url1 = "http://127.0.0.1:" + (UtilServer.TESTING_PORT)
                       + "/axis2/services/StockService/add/IBM/value/34.7";
 
-        GetMethod method1 = new GetMethod(url1);
+	HttpGet httpGet = new HttpGet(url1);
+
+	CloseableHttpClient httpclient = HttpClients.createDefault();
 
         try {
-            int statusCode = httpClient.executeMethod(method1);
-            if (statusCode != HttpStatus.SC_OK) {
-                System.err.println("Method failed: " + method1.getStatusLine());
+            CloseableHttpResponse hcResponse = httpclient.execute(httpGet);
+	    int status = hcResponse.getStatusLine().getStatusCode();
+            if (status != HttpStatus.SC_OK) {
+                throw new ClientProtocolException("url request failed: " + hcResponse.getStatusLine());
             }
-            OMElement response = AXIOMUtil.stringToOM(new String(method1.getResponseBody()));
-            OMElement returnElem = response.getFirstChildWithName(new QName("return"));
+	    HttpEntity responseEntity = hcResponse.getEntity();
+            if(responseEntity==null) {
+                throw new ClientProtocolException("url request returned null entity: " + hcResponse.getStatusLine());
+            }
+            String responseStr = EntityUtils.toString(responseEntity);
+            OMElement axisResponse = AXIOMUtil.stringToOM(responseStr);
+            OMElement returnElem = axisResponse.getFirstChildWithName(new QName("return"));
             assertEquals("IBM stock added with value : 34.7", returnElem.getText());
 
-        } finally {
-            method1.releaseConnection();
+        }finally {
+            httpclient.close();
         }
 
+        String url2 = "http://127.0.0.1:" + (UtilServer.TESTING_PORT) + "/axis2/services/StockService/get/IBM";
 
-        String url2 = "http://127.0.0.1:" + (UtilServer.TESTING_PORT)
-                             + "/axis2/services/StockService/get/IBM";
-        GetMethod method2 = new GetMethod(url2);
+	httpGet = null;
+	httpclient = null;
+
+	httpGet = new HttpGet(url2);
+
+	httpclient = HttpClients.createDefault();
 
         try {
-            int statusCode = httpClient.executeMethod(method2);
-
-            if (statusCode != HttpStatus.SC_OK) {
-                System.err.println("Method failed: " + method2.getStatusLine());
+            CloseableHttpResponse hcResponse = httpclient.execute(httpGet);
+	    int status = hcResponse.getStatusLine().getStatusCode();
+            if (status != HttpStatus.SC_OK) {
+                throw new ClientProtocolException("url request failed: " + hcResponse.getStatusLine());
             }
-            OMElement response = AXIOMUtil.stringToOM(new String(method2.getResponseBody()));
-            OMElement returnElem = response.getFirstChildWithName(new QName("return"));
+	    HttpEntity responseEntity = hcResponse.getEntity();
+            if(responseEntity==null) {
+                throw new ClientProtocolException("url request returned null entity: " + hcResponse.getStatusLine());
+            }
+
+            String responseStr = EntityUtils.toString(responseEntity);
+            OMElement axisResponse = AXIOMUtil.stringToOM(responseStr);
+            OMElement returnElem = axisResponse.getFirstChildWithName(new QName("return"));
             assertEquals("34.7", returnElem.getText());
 
-        } finally {
-            method2.releaseConnection();
+        }finally {
+            httpclient.close();
         }
 
     }
