diff --git a/modules/json/test/org/apache/axis2/json/gson/JSONXMLStreamAPITest.java b/modules/json/test/org/apache/axis2/json/gson/JSONXMLStreamAPITest.java
index bb11e97..348ab23 100644
--- a/modules/json/test/org/apache/axis2/json/gson/JSONXMLStreamAPITest.java
+++ b/modules/json/test/org/apache/axis2/json/gson/JSONXMLStreamAPITest.java
@@ -32,8 +32,6 @@
     public void xmlStreamAPITest()throws Exception{
         String getLibURL = server.getEndpoint("LibraryService") + "getLibrary";
         String echoLibURL = server.getEndpoint("LibraryService") + "echoLibrary";
-        String contentType = "application/json";
-        String charSet = "UTF-8";
 
         String echoLibrary = "{\"echoLibrary\":{\"args0\":{\"admin\":{\"address\":{\"city\":\"My City\",\"country\":" +
                 "\"My Country\",\"street\":\"My Street\",\"zipCode\":\"00000\"},\"age\":24,\"name\":\"micheal\"," +
@@ -67,11 +65,11 @@
                 "{\"author\":\"Jhon_4\",\"numOfPages\":175,\"publisher\":\"Foxier\",\"reviewers\":[\"rev1\",\"rev2\"," +
                 "\"rev3\"]}],\"staff\":50}}}";
 
-        String actualResponse = UtilTest.post(echoLibrary, echoLibURL, contentType, charSet);
+        String actualResponse = UtilTest.post(echoLibrary, echoLibURL);
         Assert.assertNotNull(actualResponse);
         Assert.assertEquals(echoLibraryResponse , actualResponse);
 
-        String actualRespose_2 = UtilTest.post(getLibrary, getLibURL, contentType, charSet);
+        String actualRespose_2 = UtilTest.post(getLibrary, getLibURL);
         Assert.assertNotNull(actualRespose_2);
         Assert.assertEquals(getLibraryResponse, actualRespose_2);
 
diff --git a/modules/json/test/org/apache/axis2/json/gson/UtilTest.java b/modules/json/test/org/apache/axis2/json/gson/UtilTest.java
index ac1df45..c70937b 100644
--- a/modules/json/test/org/apache/axis2/json/gson/UtilTest.java
+++ b/modules/json/test/org/apache/axis2/json/gson/UtilTest.java
@@ -19,26 +19,38 @@
 
 package org.apache.axis2.json.gson;
 
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.methods.PostMethod;
-import org.apache.commons.httpclient.methods.RequestEntity;
-import org.apache.commons.httpclient.methods.StringRequestEntity;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.HttpEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
 
 import java.io.IOException;
 
 public class UtilTest {
 
-    public static String post(String jsonString, String strURL, String contentType, String charSet)
+    public static String post(String jsonString, String strURL)
             throws IOException {
-        PostMethod post = new PostMethod(strURL);
-        RequestEntity entity = new StringRequestEntity(jsonString, contentType, charSet);
-        post.setRequestEntity(entity);
-        HttpClient httpclient = new HttpClient();
+        HttpEntity stringEntity = new StringEntity(jsonString,ContentType.APPLICATION_JSON);
+	HttpPost httpPost = new HttpPost(strURL);
+        httpPost.setEntity(stringEntity);
+	CloseableHttpClient httpclient = HttpClients.createDefault();
+
         try {
-            int result = httpclient.executeMethod(post);
-            return post.getResponseBodyAsString();
+            CloseableHttpResponse response = httpclient.execute(httpPost);
+	    int status = response.getStatusLine().getStatusCode();
+            if (status >= 200 && status < 300) {
+                HttpEntity entity = response.getEntity();
+                return entity != null ? EntityUtils.toString(entity,"UTF-8") : null;
+            } else {
+                throw new ClientProtocolException("Unexpected response status: " + status);
+            }
         }finally {
-            post.releaseConnection();
+            httpclient.close();
         }
     }
 }
diff --git a/modules/json/test/org/apache/axis2/json/gson/rpc/JSONRPCIntegrationTest.java b/modules/json/test/org/apache/axis2/json/gson/rpc/JSONRPCIntegrationTest.java
index f5566c3..1b364ea 100644
--- a/modules/json/test/org/apache/axis2/json/gson/rpc/JSONRPCIntegrationTest.java
+++ b/modules/json/test/org/apache/axis2/json/gson/rpc/JSONRPCIntegrationTest.java
@@ -29,15 +29,12 @@
     @ClassRule
     public static Axis2Server server = new Axis2Server("target/repo/gson");
     
-    String contentType = "application/json";
-    String charSet = "UTF-8";
-
     @Test
     public void testJsonRpcMessageReceiver() throws Exception {
         String jsonRequest = "{\"echoPerson\":[{\"arg0\":{\"name\":\"Simon\",\"age\":\"35\",\"gender\":\"male\"}}]}";
         String echoPersonUrl = server.getEndpoint("JSONPOJOService") + "echoPerson";
         String expectedResponse = "{\"response\":{\"name\":\"Simon\",\"age\":\"35\",\"gender\":\"male\"}}";
-        String response = UtilTest.post(jsonRequest, echoPersonUrl, contentType, charSet);
+        String response = UtilTest.post(jsonRequest, echoPersonUrl);
         Assert.assertNotNull(response);
         Assert.assertEquals(expectedResponse , response);
     }
@@ -46,7 +43,7 @@
     public void testJsonInOnlyRPCMessageReceiver() throws Exception {
         String jsonRequest = "{\"ping\":[{\"arg0\":{\"name\":\"Simon\",\"age\":\"35\",\"gender\":\"male\"}}]}";
         String echoPersonUrl = server.getEndpoint("JSONPOJOService") + "ping";
-        String response = UtilTest.post(jsonRequest, echoPersonUrl, contentType, charSet);
+        String response = UtilTest.post(jsonRequest, echoPersonUrl);
         Assert.assertEquals("", response);
     }
 }
diff --git a/modules/samples/json/src/sample/json/client/JsonClient.java b/modules/samples/json/src/sample/json/client/JsonClient.java
index ebd3681..c5be2a8 100644
--- a/modules/samples/json/src/sample/json/client/JsonClient.java
+++ b/modules/samples/json/src/sample/json/client/JsonClient.java
@@ -19,45 +19,57 @@
 
 package sample.json.client;
 
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpException;
-import org.apache.commons.httpclient.methods.PostMethod;
-import org.apache.commons.httpclient.methods.RequestEntity;
-import org.apache.commons.httpclient.methods.StringRequestEntity;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.HttpEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
 
 import java.io.IOException;
-import java.io.UnsupportedEncodingException;
 
 public class JsonClient{
 
     private String url = "http://localhost:8080/axis2/services/JsonService/echoUser";
-    private String contentType = "application/json";
-    private String charSet = "UTF-8";
 
     public static void main(String[] args)throws IOException {
-	String echoUser = "{\"echoUser\":[{\"arg0\":{\"name\":\"My_Name\",\"surname\":\"MY_Surname\",\"middleName\":" + "\"My_MiddleName\",\"age\":123,\"address\":{\"country\":\"My_Country\",\"city\":\"My_City\",\"street\":" + "\"My_Street\",\"building\":\"My_Building\",\"flat\":\"My_Flat\",\"zipCode\":\"My_ZipCode\"}}}]}";
+
+        String echoUser = "{\"echoUser\":[{\"arg0\":{\"name\":\"My_Name\",\"surname\":\"MY_Surname\",\"middleName\":" +
+            "\"My_MiddleName\",\"age\":123,\"address\":{\"country\":\"My_Country\",\"city\":\"My_City\",\"street\":" +
+            "\"My_Street\",\"building\":\"My_Building\",\"flat\":\"My_Flat\",\"zipCode\":\"My_ZipCode\"}}}]}";
 
         JsonClient jsonClient = new JsonClient();
-        jsonClient.post(echoUser);
+        String echo = jsonClient.post(echoUser);
+        System.out.println (echo);
+
     }
 
-    public boolean post(String message) throws UnsupportedEncodingException {
-        PostMethod post = new PostMethod(url);
-        RequestEntity entity = new StringRequestEntity(message , contentType, charSet);
-        post.setRequestEntity(entity);
-        HttpClient httpclient = new HttpClient();
+    public String post(String message) throws IOException {
+
+        HttpEntity stringEntity = new StringEntity(message,ContentType.APPLICATION_JSON);
+        HttpPost httpPost = new HttpPost(url);
+        httpPost.setEntity(stringEntity);
+        CloseableHttpClient httpclient = HttpClients.createDefault();
+
         try {
-            int result = httpclient.executeMethod(post);
-            System.out.println("Response status code: " + result);
-            System.out.println("Response body: ");
-            System.out.println(post.getResponseBodyAsString());
-        } catch (HttpException e) {
-            e.printStackTrace();
-        } catch (IOException e) {
-            e.printStackTrace();
-        } finally {
-            post.releaseConnection();
+            CloseableHttpResponse response = httpclient.execute(httpPost);
+            HttpEntity entity = null;
+            int status = response.getStatusLine().getStatusCode();
+            if (status >= 200 && status < 300) {
+                entity = response.getEntity();
+            } else {
+                throw new ClientProtocolException("Unexpected HTTP response status: " + status);
+            }
+            if (entity == null || EntityUtils.toString(entity,"UTF-8") == null) {
+                throw new ClientProtocolException("Error connecting to url: "+url+" , unexpected response: " + EntityUtils.toString(entity,"UTF-8"));
+            }
+            return EntityUtils.toString(entity,"UTF-8");
+        }finally {
+            httpclient.close();
         }
-       return false;
     }
+
 }
