You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-commits@axis.apache.org by bi...@apache.org on 2020/04/14 20:03:12 UTC

[axis-axis2-java-core] 06/15: AXIS2-4318 - Refactoring existing codes.

This is an automated email from the ASF dual-hosted git repository.

billblough pushed a commit to branch AXIS2-4318
in repository https://gitbox.apache.org/repos/asf/axis-axis2-java-core.git

commit 69270e8661685385b29d77d15f183f4c16efbb29
Author: Sagara Gunathunga <sa...@apache.org>
AuthorDate: Thu Jan 12 09:33:53 2012 +0000

    AXIS2-4318 -  Refactoring existing codes.
---
 .../axis2/transport/http/AbstractHTTPSender.java   | 689 +--------------------
 .../axis2/transport/http/AxisRequestEntity.java    |  15 +-
 .../apache/axis2/transport/http/AxisServlet.java   |  18 +-
 .../transport/http/CommonsHTTPTransportSender.java |  39 +-
 .../transport/http/CommonsTransportHeaders.java    |  30 +-
 .../axis2/transport/http/HTTPAuthenticator.java    | 107 ++++
 .../apache/axis2/transport/http/HTTPSender.java    | 281 ++-------
 .../transport/http/HTTPTransportConstants.java     |  52 ++
 ...equestEntity2.java => HTTPTransportSender.java} |  30 +-
 .../transport/http/HttpTransportProperties.java    | 136 +---
 .../axis2/transport/http/RESTRequestEntity.java    |  62 +-
 .../axis2/transport/http/RESTRequestEntity2.java   |  20 +-
 .../impl/httpclient3/AxisRequestEntityImpl.java    |  50 ++
 .../httpclient3/HTTPClient3TransportSender.java    |  42 ++
 .../httpclient3/HTTPProxcyConfigurator.java}       | 274 ++++----
 .../httpclient3/HTTPSenderImpl.java}               | 680 +++++++++++++-------
 .../httpclient3/HTTPTransportHeaders.java}         |  34 +-
 .../httpclient3/HttpTransportPropertiesImpl.java   |  90 +++
 .../httpclient3/RESTRequestEntity2Impl.java}       |  28 +-
 .../httpclient3/RESTRequestEntityImpl.java}        |  32 +-
 .../http/util/HTTPProxyConfigurationUtil.java      |   1 +
 21 files changed, 1179 insertions(+), 1531 deletions(-)

diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/AbstractHTTPSender.java b/modules/transport/http/src/org/apache/axis2/transport/http/AbstractHTTPSender.java
index f02875a..09bd9c2 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/AbstractHTTPSender.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/AbstractHTTPSender.java
@@ -19,65 +19,27 @@
 
 package org.apache.axis2.transport.http;
 
-import org.apache.axiom.om.OMAttribute;
-import org.apache.axiom.om.OMElement;
+
+import java.io.IOException;
+import java.net.URL;
+
 import org.apache.axiom.om.OMOutputFormat;
 import org.apache.axis2.AxisFault;
-import org.apache.axis2.Constants;
 import org.apache.axis2.context.MessageContext;
-import org.apache.axis2.context.NamedValue;
-import org.apache.axis2.context.OperationContext;
-import org.apache.axis2.context.ConfigurationContext;
 import org.apache.axis2.description.TransportOutDescription;
-import org.apache.axis2.i18n.Messages;
-import org.apache.axis2.transport.MessageFormatter;
-import org.apache.axis2.transport.TransportUtils;
-import org.apache.axis2.transport.http.util.HTTPProxyConfigurationUtil;
-import org.apache.axis2.wsdl.WSDLConstants;
-import org.apache.commons.httpclient.Credentials;
-import org.apache.commons.httpclient.Header;
-import org.apache.commons.httpclient.HeaderElement;
-import org.apache.commons.httpclient.HostConfiguration;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpConnectionManager;
-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.commons.httpclient.MultiThreadedHttpConnectionManager;
-import org.apache.commons.httpclient.NTCredentials;
-import org.apache.commons.httpclient.NameValuePair;
-import org.apache.commons.httpclient.UsernamePasswordCredentials;
-import org.apache.commons.httpclient.auth.AuthPolicy;
-import org.apache.commons.httpclient.auth.AuthScope;
-import org.apache.commons.httpclient.params.HttpMethodParams;
-import org.apache.commons.httpclient.protocol.Protocol;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.http.protocol.HTTP;
 
-import javax.xml.namespace.QName;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.zip.GZIPInputStream;
+
+
 
 public abstract class AbstractHTTPSender {
-    protected static final String ANONYMOUS = "anonymous";
-    protected static final String PROXY_HOST_NAME = "proxy_host";
-    protected static final String PROXY_PORT = "proxy_port";
+    
     protected boolean chunked = false;
     protected String httpVersion = HTTPConstants.HEADER_PROTOCOL_11;
-    private static final Log log = LogFactory.getLog(AbstractHTTPSender.class);
-
-    protected static final String PROTOCOL_HTTP = "http";
-    protected static final String PROTOCOL_HTTPS = "https";
+    
+    private static final Log log = LogFactory.getLog(AbstractHTTPSender.class);   
 
     /**
      * proxydiscription
@@ -109,638 +71,13 @@ public abstract class AbstractHTTPSender {
                                 + " Can have values only HTTP/1.0 or HTTP/1.1");
             }
         }
-    }
-
-    /**
-     * Collect the HTTP header information and set them in the message context
-     *
-     * @param method HttpMethodBase from which to get information
-     * @param msgContext the MessageContext in which to place the information... OR NOT!
-     * @throws AxisFault if problems occur
-     */
-    protected void obtainHTTPHeaderInformation(HttpMethodBase method,
-                                               MessageContext msgContext) throws AxisFault {
-        // Set RESPONSE properties onto the REQUEST message context.  They will need to be copied off the request context onto
-        // the response context elsewhere, for example in the OutInOperationClient.
-        Map transportHeaders = new CommonsTransportHeaders(method.getResponseHeaders());
-        msgContext.setProperty(MessageContext.TRANSPORT_HEADERS, transportHeaders);
-        msgContext.setProperty(HTTPConstants.MC_HTTP_STATUS_CODE, new Integer(method.getStatusCode()));
-        Header header = method.getResponseHeader(HTTPConstants.HEADER_CONTENT_TYPE);
-
-        if (header != null) {
-            HeaderElement[] headers = header.getElements();
-            MessageContext inMessageContext = msgContext.getOperationContext().getMessageContext(
-                    WSDLConstants.MESSAGE_LABEL_IN_VALUE);
-
-            Object contentType = header.getValue();
-            Object charSetEnc = null;
-
-            for (int i = 0; i < headers.length; i++) {
-                NameValuePair charsetEnc = headers[i].getParameterByName(
-                        HTTPConstants.CHAR_SET_ENCODING);
-                if (charsetEnc != null) {
-                    charSetEnc = charsetEnc.getValue();
-                }
-            }
-
-            if (inMessageContext != null) {
-                inMessageContext
-                        .setProperty(Constants.Configuration.CONTENT_TYPE, contentType);
-                inMessageContext
-                        .setProperty(Constants.Configuration.CHARACTER_SET_ENCODING, charSetEnc);
-            } else {
-
-                // Transport details will be stored in a HashMap so that anybody interested can
-                // retrieve them
-                HashMap transportInfoMap = new HashMap();
-                transportInfoMap.put(Constants.Configuration.CONTENT_TYPE, contentType);
-                transportInfoMap.put(Constants.Configuration.CHARACTER_SET_ENCODING, charSetEnc);
-
-                //the HashMap is stored in the outgoing message.
-                msgContext.setProperty(Constants.Configuration.TRANSPORT_INFO_MAP,
-                                       transportInfoMap);
-            }
-        }
-
-        String sessionCookie = null;
-        // Process old style headers first
-        Header[] cookieHeaders = method.getResponseHeaders(HTTPConstants.HEADER_SET_COOKIE);
-        String customCoookiId = (String) msgContext.getProperty(Constants.CUSTOM_COOKIE_ID);
-        for (int i = 0; i < cookieHeaders.length; i++) {
-            HeaderElement[] elements = cookieHeaders[i].getElements();
-            for (int e = 0; e < elements.length; e++) {
-                HeaderElement element = elements[e];
-                if (Constants.SESSION_COOKIE.equalsIgnoreCase(element.getName()) ||
-                        Constants.SESSION_COOKIE_JSESSIONID.equalsIgnoreCase(element.getName())) {
-                    sessionCookie = processCookieHeader(element);
-                }
-                if (customCoookiId != null && customCoookiId.equalsIgnoreCase(element.getName())) {
-                    sessionCookie = processCookieHeader(element);
-                }
-            }
-        }
-        // Overwrite old style cookies with new style ones if present
-        cookieHeaders = method.getResponseHeaders(HTTPConstants.HEADER_SET_COOKIE2);
-        for (int i = 0; i < cookieHeaders.length; i++) {
-            HeaderElement[] elements = cookieHeaders[i].getElements();
-            for (int e = 0; e < elements.length; e++) {
-                HeaderElement element = elements[e];
-                if (Constants.SESSION_COOKIE.equalsIgnoreCase(element.getName()) ||
-                        Constants.SESSION_COOKIE_JSESSIONID.equalsIgnoreCase(element.getName())) {
-                    sessionCookie = processCookieHeader(element);
-                }
-                if(customCoookiId!=null&&customCoookiId.equalsIgnoreCase(element.getName())){
-                    sessionCookie = processCookieHeader(element);
-                }
-            }
-        }
-
-        if (sessionCookie != null) {
-            msgContext.getServiceContext().setProperty(HTTPConstants.COOKIE_STRING, sessionCookie);
-        }
-    }
-
-    private String processCookieHeader(HeaderElement element) {
-        String cookie = element.getName() + "=" + element.getValue();
-        NameValuePair[] parameters =  element.getParameters();
-        for (int j = 0; parameters != null && j < parameters.length; j++) {
-            NameValuePair parameter = parameters[j];
-            cookie = cookie + "; " + parameter.getName() + "=" + parameter.getValue();
-        }
-        return cookie;
-    }
-
-    protected void processResponse(HttpMethodBase httpMethod,
-                                   MessageContext msgContext)
-            throws IOException {
-        obtainHTTPHeaderInformation(httpMethod, msgContext);
-
-        InputStream in = httpMethod.getResponseBodyAsStream();
-        if (in == null) {
-            throw new AxisFault(Messages.getMessage("canNotBeNull", "InputStream"));
-        }
-        Header contentEncoding =
-                httpMethod.getResponseHeader(HTTPConstants.HEADER_CONTENT_ENCODING);
-        if (contentEncoding != null) {
-            if (contentEncoding.getValue().
-                    equalsIgnoreCase(HTTPConstants.COMPRESSION_GZIP)) {
-                in = new GZIPInputStream(in);
-                // If the content-encoding is identity we can basically ignore it.
-            } else if (!"identity".equalsIgnoreCase(contentEncoding.getValue())) {
-                throw new AxisFault("HTTP :" + "unsupported content-encoding of '"
-                        + contentEncoding.getValue() + "' found");
-            }
-        }
-
-        OperationContext opContext = msgContext.getOperationContext();
-        if (opContext != null) {
-            opContext.setProperty(MessageContext.TRANSPORT_IN, in);
-        }
-    }
+    }       
 
     public abstract void send(MessageContext msgContext, URL url, String soapActionString)
-            throws IOException;
-
-    /**
-     * getting host configuration to support standard http/s, proxy and NTLM support
-     *
-     * @param client active HttpClient
-     * @param msgCtx active MessageContext
-     * @param targetURL the target URL
-     * @return a HostConfiguration set up with proxy information
-     * @throws AxisFault if problems occur
-     */
-    protected HostConfiguration getHostConfiguration(HttpClient client,
-                                                     MessageContext msgCtx,
-                                                     URL targetURL)throws AxisFault {
-
-        boolean isAuthenticationEnabled = isAuthenticationEnabled(msgCtx);
-        int port = targetURL.getPort();
-
-        String protocol = targetURL.getProtocol();
-        if (port == -1) {
-            if (PROTOCOL_HTTP.equals(protocol)) {
-                port = 80;
-            } else if (PROTOCOL_HTTPS.equals(protocol)) {
-                port = 443;
-            }
-
-        }
-
-        // to see the host is a proxy and in the proxy list - available in axis2.xml
-        HostConfiguration config = new HostConfiguration();
-
-        // one might need to set his own socket factory. Let's allow that case as well.
-        Protocol protocolHandler =
-                (Protocol)msgCtx.getOptions().getProperty(HTTPConstants.CUSTOM_PROTOCOL_HANDLER);
-
-        // setting the real host configuration
-        // I assume the 90% case, or even 99% case will be no protocol handler case.
-        if (protocolHandler == null) {
-            config.setHost(targetURL.getHost(), port, targetURL.getProtocol());
-        } else {
-            config.setHost(targetURL.getHost(), port, protocolHandler);
-        }
-
-        if (isAuthenticationEnabled) {
-            // Basic, Digest, NTLM and custom authentications.
-            this.setAuthenticationInfo(client, msgCtx, config);
-        }
-        // proxy configuration
-
-        if (HTTPProxyConfigurationUtil.isProxyEnabled(msgCtx, targetURL)) {
-            if(log.isDebugEnabled()){
-                log.debug("Configuring HTTP proxy.");
-            }
-            HTTPProxyConfigurationUtil.configure(msgCtx, client, config);
-        }
-
-        return config;
-    }
-
-    protected boolean isAuthenticationEnabled(MessageContext msgCtx) {
-        return (msgCtx.getProperty(HTTPConstants.AUTHENTICATE) != null);
-    }
-
-    /*
-    This will handle server Authentication, It could be either NTLM, Digest or Basic Authentication.
-    Apart from that user can change the priory or add a custom authentication scheme.
-    */
-    protected void setAuthenticationInfo(HttpClient agent,
-                                         MessageContext msgCtx,
-                                         HostConfiguration config) throws AxisFault {
-        HttpTransportProperties.Authenticator authenticator;
-        Object obj = msgCtx.getProperty(HTTPConstants.AUTHENTICATE);
-        if (obj != null) {
-            if (obj instanceof HttpTransportProperties.Authenticator) {
-                authenticator = (HttpTransportProperties.Authenticator) obj;
-
-                String username = authenticator.getUsername();
-                String password = authenticator.getPassword();
-                String host = authenticator.getHost();
-                String domain = authenticator.getDomain();
-
-                int port = authenticator.getPort();
-                String realm = authenticator.getRealm();
-
-                /* If retrying is available set it first */
-                isAllowedRetry = authenticator.isAllowedRetry();
-
-                Credentials creds;
-
-                HttpState tmpHttpState = null;
-                HttpState httpState = (HttpState)msgCtx.getProperty(HTTPConstants.CACHED_HTTP_STATE);
-                if (httpState != null) {
-                    tmpHttpState = httpState;
-                } else {
-                    tmpHttpState = agent.getState();
-                }
-                
-                agent.getParams()
-                        .setAuthenticationPreemptive(authenticator.getPreemptiveAuthentication());
-
-                if (host != null) {
-                    if (domain != null) {
-                        /*Credentials for NTLM Authentication*/
-                        creds = new NTCredentials(username, password, host, domain);
-                    } else {
-                        /*Credentials for Digest and Basic Authentication*/
-                        creds = new UsernamePasswordCredentials(username, password);
-                    }
-                    tmpHttpState.setCredentials(new AuthScope(host, port, realm), creds);
-                } else {
-                    if (domain != null) {
-                        /*Credentials for NTLM Authentication when host is ANY_HOST*/
-                        creds = new NTCredentials(username, password, AuthScope.ANY_HOST, domain);
-                        tmpHttpState.setCredentials(
-                                new AuthScope(AuthScope.ANY_HOST, port, realm), creds);
-                    } else {
-                        /*Credentials only for Digest and Basic Authentication*/
-                        creds = new UsernamePasswordCredentials(username, password);
-                        tmpHttpState.setCredentials(new AuthScope(AuthScope.ANY), creds);
-                    }
-                }
-                /* Customizing the priority Order */
-                List schemes = authenticator.getAuthSchemes();
-                if (schemes != null && schemes.size() > 0) {
-                    List authPrefs = new ArrayList(3);
-                    for (int i = 0; i < schemes.size(); i++) {
-                        if (schemes.get(i) instanceof AuthPolicy) {
-                            authPrefs.add(schemes.get(i));
-                            continue;
-                        }
-                        String scheme = (String) schemes.get(i);
-                        if (HttpTransportProperties.Authenticator.BASIC.equals(scheme)) {
-                            authPrefs.add(AuthPolicy.BASIC);
-                        } else if (HttpTransportProperties.Authenticator.NTLM.equals(scheme)) {
-                            authPrefs.add(AuthPolicy.NTLM);
-                        } else if (HttpTransportProperties.Authenticator.DIGEST.equals(scheme)) {
-                            authPrefs.add(AuthPolicy.DIGEST);
-                        }
-                    }
-                    agent.getParams().setParameter(AuthPolicy.AUTH_SCHEME_PRIORITY,
-                            authPrefs);
-                }
-
-            } else {
-                throw new AxisFault("HttpTransportProperties.Authenticator class cast exception");
-            }
-        }
-
-    }
-
-    /**
-     * Method used to copy all the common properties
-     *
-     * @param msgContext       - The messageContext of the request message
-     * @param url              - The target URL
-     * @param httpMethod       - The http method used to send the request
-     * @param httpClient       - The httpclient used to send the request
-     * @param soapActionString - The soap action atring of the request message
-     * @return MessageFormatter - The messageFormatter for the relavent request message
-     * @throws AxisFault - Thrown in case an exception occurs
-     */
-    protected MessageFormatter populateCommonProperties(MessageContext msgContext, URL url,
-                                                      HttpMethodBase httpMethod,
-                                                      HttpClient httpClient,
-                                                      String soapActionString)
-            throws AxisFault {
-
-        if (isAuthenticationEnabled(msgContext)) {
-            httpMethod.setDoAuthentication(true);
-        }
-
-        MessageFormatter messageFormatter = TransportUtils.getMessageFormatter(
-                msgContext);
-
-        url = messageFormatter.getTargetAddress(msgContext, format, url);
-
-        httpMethod.setPath(url.getPath());
-
-        httpMethod.setQueryString(url.getQuery());
-
-        httpMethod.setRequestHeader(HTTPConstants.HEADER_CONTENT_TYPE,
-                                    messageFormatter.getContentType(msgContext, format,
-                                                                    soapActionString));
-
-        httpMethod.setRequestHeader(HTTPConstants.HEADER_HOST, url.getHost());
-
-        if (msgContext.getOptions() != null && msgContext.getOptions().isManageSession()) {
-            // setting the cookie in the out path
-            Object cookieString = msgContext.getProperty(HTTPConstants.COOKIE_STRING);
-
-            if (cookieString != null) {
-                StringBuffer buffer = new StringBuffer();
-                buffer.append(cookieString);
-                httpMethod.setRequestHeader(HTTPConstants.HEADER_COOKIE, buffer.toString());
-            }
-        }
-
-        if (httpVersion.equals(HTTPConstants.HEADER_PROTOCOL_10)) {
-            httpClient.getParams().setVersion(HttpVersion.HTTP_1_0);
-        }
-        return messageFormatter;
-    }
-
-    /**
-     * This is used to get the dynamically set time out values from the
-     * message context. If the values are not available or invalid then
-     * the default values or the values set by the configuration will be used
-     *
-     * @param msgContext the active MessageContext
-     * @param httpClient
-     */
-    protected void initializeTimeouts(MessageContext msgContext, HttpClient httpClient) {
-        // If the SO_TIMEOUT of CONNECTION_TIMEOUT is set by dynamically the
-        // override the static config
-        Integer tempSoTimeoutProperty =
-                (Integer) msgContext.getProperty(HTTPConstants.SO_TIMEOUT);
-        Integer tempConnTimeoutProperty =
-                (Integer) msgContext
-                        .getProperty(HTTPConstants.CONNECTION_TIMEOUT);
-        long timeout = msgContext.getOptions().getTimeOutInMilliSeconds();
-
-        if (tempConnTimeoutProperty != null) {
-            int connectionTimeout = tempConnTimeoutProperty.intValue();
-            // timeout for initial connection
-            httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(connectionTimeout);
-        } else {
-            // set timeout in client
-            if (timeout > 0) {
-                httpClient.getHttpConnectionManager().getParams().setConnectionTimeout((int) timeout);
-            }
-        }
-
-        if (tempSoTimeoutProperty != null) {
-            int soTimeout = tempSoTimeoutProperty.intValue();
-            // SO_TIMEOUT -- timeout for blocking reads
-            httpClient.getHttpConnectionManager().getParams().setSoTimeout(soTimeout);
-            httpClient.getParams().setSoTimeout(soTimeout);
-        } else {
-            // set timeout in client
-            if (timeout > 0) {
-                httpClient.getHttpConnectionManager().getParams().setSoTimeout((int) timeout);
-                httpClient.getParams().setSoTimeout((int) timeout);
-            }
-        }
-    }
-
-    /**
-     * This is used to get the dynamically set time out values from the
-     * message context. If the values are not available or invalid then
-     * the default values or the values set by the configuration will be used
-     *
-     * @param msgContext the active MessageContext
-     * @param httpMethod method
-     */
-    protected void setTimeouts(MessageContext msgContext, HttpMethod httpMethod) {
-        // If the SO_TIMEOUT of CONNECTION_TIMEOUT is set by dynamically the
-        // override the static config
-        Integer tempSoTimeoutProperty =
-                (Integer) msgContext.getProperty(HTTPConstants.SO_TIMEOUT);
-        Integer tempConnTimeoutProperty =
-                (Integer) msgContext
-                        .getProperty(HTTPConstants.CONNECTION_TIMEOUT);
-        long timeout = msgContext.getOptions().getTimeOutInMilliSeconds();
-
-        if (tempConnTimeoutProperty != null) {
-            // timeout for initial connection
-            httpMethod.getParams().setParameter("http.connection.timeout",
-                    tempConnTimeoutProperty);
-        }
-
-        if (tempSoTimeoutProperty != null) {
-            // SO_TIMEOUT -- timeout for blocking reads
-            httpMethod.getParams().setSoTimeout(tempSoTimeoutProperty);
-        } else {
-            // set timeout in client
-            if (timeout > 0) {
-                httpMethod.getParams().setSoTimeout((int) timeout);
-            }
-        }
-    }
+            throws IOException;   
 
     public void setFormat(OMOutputFormat format) {
         this.format = format;
-    }
-
-    protected HttpClient getHttpClient(MessageContext msgContext) {
-        ConfigurationContext configContext = msgContext.getConfigurationContext();
-
-        HttpClient httpClient = (HttpClient) msgContext.getProperty(
-                HTTPConstants.CACHED_HTTP_CLIENT);
-
-        if (httpClient == null) {
-            httpClient = (HttpClient) configContext.getProperty(HTTPConstants.CACHED_HTTP_CLIENT);
-        }
-
-        if (httpClient != null) {
-            return httpClient;
-        }
-
-        synchronized (this) {
-            httpClient = (HttpClient) msgContext.getProperty(HTTPConstants.CACHED_HTTP_CLIENT);
-
-            if (httpClient == null) {
-                httpClient = (HttpClient) configContext.getProperty(
-                        HTTPConstants.CACHED_HTTP_CLIENT);
-            }
-
-            if (httpClient != null) {
-                return httpClient;
-            }
-
-            HttpConnectionManager connManager =
-                    (HttpConnectionManager) msgContext.getProperty(
-                            HTTPConstants.MULTITHREAD_HTTP_CONNECTION_MANAGER);
-            if (connManager == null) {
-                connManager =
-                        (HttpConnectionManager) msgContext.getProperty(
-                                HTTPConstants.MUTTITHREAD_HTTP_CONNECTION_MANAGER);
-            }
-            if (connManager == null) {
-                // reuse HttpConnectionManager
-                synchronized (configContext) {
-                    connManager = (HttpConnectionManager) configContext.getProperty(
-                            HTTPConstants.MULTITHREAD_HTTP_CONNECTION_MANAGER);
-                    if (connManager == null) {
-                        log.trace("Making new ConnectionManager");
-                        connManager = new MultiThreadedHttpConnectionManager();
-                        configContext.setProperty(
-                                HTTPConstants.MULTITHREAD_HTTP_CONNECTION_MANAGER, connManager);
-                    }
-                }
-            }
-            /*
-             * Create a new instance of HttpClient since the way
-             * it is used here it's not fully thread-safe.
-             */
-            httpClient = new HttpClient(connManager);
-
-            // Set the default timeout in case we have a connection pool starvation to 30sec
-            httpClient.getParams().setConnectionManagerTimeout(30000);
-
-            // Get the timeout values set in the runtime
-            initializeTimeouts(msgContext, httpClient);
-
-            return httpClient;
-        }
-    }
-
-    protected void executeMethod(HttpClient httpClient, MessageContext msgContext, URL url,
-                                 HttpMethod method) throws IOException {
-        HostConfiguration config = this.getHostConfiguration(httpClient, msgContext, url);
-
-        // set the custom headers, if available
-        addCustomHeaders(method, msgContext);
-
-        // add compression headers if needed
-        if (msgContext.isPropertyTrue(HTTPConstants.MC_ACCEPT_GZIP)) {
-            method.addRequestHeader(HTTPConstants.HEADER_ACCEPT_ENCODING,
-                    HTTPConstants.COMPRESSION_GZIP);
-        }
-
-        if (msgContext.isPropertyTrue(HTTPConstants.MC_GZIP_REQUEST)) {
-            method.addRequestHeader(HTTPConstants.HEADER_CONTENT_ENCODING,
-                    HTTPConstants.COMPRESSION_GZIP);
-        }
-        
-        if (msgContext.getProperty(HTTPConstants.HTTP_METHOD_PARAMS) != null) {
-            HttpMethodParams params = (HttpMethodParams)msgContext
-                    .getProperty(HTTPConstants.HTTP_METHOD_PARAMS);
-            method.setParams(params);
-        }
-
-        String cookiePolicy = (String) msgContext.getProperty(HTTPConstants.COOKIE_POLICY);
-        if (cookiePolicy != null) {
-            method.getParams().setCookiePolicy(cookiePolicy);   
-        }
-        HttpState httpState = (HttpState)msgContext.getProperty(HTTPConstants.CACHED_HTTP_STATE);
-
-        setTimeouts(msgContext, method);
-
-        httpClient.executeMethod(config, method, httpState);
-    }
-
-    public void addCustomHeaders(HttpMethod method, MessageContext msgContext) {
-
-        boolean isCustomUserAgentSet = false;
-        // set the custom headers, if available
-        Object httpHeadersObj = msgContext.getProperty(HTTPConstants.HTTP_HEADERS);
-        if (httpHeadersObj != null) {
-            if (httpHeadersObj instanceof List) {
-                List httpHeaders = (List) httpHeadersObj;
-                for (int i = 0; i < httpHeaders.size(); i++) {
-                    NamedValue nv = (NamedValue) httpHeaders.get(i);
-                    if (nv != null) {
-                        Header header = new Header(nv.getName(), nv.getValue());
-                        if (HTTPConstants.HEADER_USER_AGENT.equals(header.getName())) {
-                            isCustomUserAgentSet = true;
-                        }
-                        method.addRequestHeader(header);
-                    }
-                }
-    
-            }
-            if (httpHeadersObj instanceof Map) {
-                Map httpHeaders = (Map) httpHeadersObj;
-                for (Iterator iterator = httpHeaders.entrySet().iterator(); iterator.hasNext();) {
-                    Map.Entry entry  = (Map.Entry) iterator.next();
-                    String key = (String) entry.getKey();
-                    String value = (String) entry.getValue();
-                    if (HTTPConstants.HEADER_USER_AGENT.equals(key)) {
-                        isCustomUserAgentSet = true;
-                    }
-                    method.addRequestHeader(key, value);
-                }
-            }
-        }
-
-        // we have to consider the TRANSPORT_HEADERS map as well
-        Map transportHeaders = (Map) msgContext.getProperty(MessageContext.TRANSPORT_HEADERS);
-        if (transportHeaders != null) {
-            removeUnwantedHeaders(msgContext);
-
-            Set headerEntries = transportHeaders.entrySet();
-
-            for (Object headerEntry : headerEntries) {
-                if (headerEntry instanceof Map.Entry) {
-                    Header[] headers = method.getRequestHeaders();
-
-                    boolean headerAdded = false;
-                    for (Header header : headers) {
-                        if (header.getName() != null &&                                 
-                                header.getName().equals(((Map.Entry) headerEntry).getKey())) {
-                            headerAdded = true;
-                            break;
-                        }
-                    }
-
-                    if (!headerAdded) {
-                        method.addRequestHeader(((Map.Entry) headerEntry).getKey().toString(),
-                                ((Map.Entry) headerEntry).getValue().toString());
-                    }
-                }
-            }
-        }
-
-        if (!isCustomUserAgentSet) {
-            String userAgentString = getUserAgent(msgContext);
-            method.setRequestHeader(HTTPConstants.HEADER_USER_AGENT, userAgentString);
-        }
-
-    }
-
-
-    /**
-     * Remove unwanted headers from the transport headers map of outgoing request. These are headers which
-     * should be dictated by the transport and not the user. We remove these as these may get
-     * copied from the request messages
-     *
-     * @param msgContext the Axis2 Message context from which these headers should be removed
-     */
-    private void removeUnwantedHeaders(MessageContext msgContext) {
-        Map headers = (Map) msgContext.getProperty(MessageContext.TRANSPORT_HEADERS);
-
-        if (headers == null || headers.isEmpty()) {
-            return;
-        }
-
-        Iterator iter = headers.keySet().iterator();
-        while (iter.hasNext()) {
-            String headerName = (String) iter.next();
-            if (HTTP.CONN_DIRECTIVE.equalsIgnoreCase(headerName) ||
-                HTTP.TRANSFER_ENCODING.equalsIgnoreCase(headerName) ||
-                HTTP.DATE_HEADER.equalsIgnoreCase(headerName) ||
-                HTTP.CONTENT_TYPE.equalsIgnoreCase(headerName) ||
-                HTTP.CONTENT_LEN.equalsIgnoreCase(headerName)) {
-                iter.remove();
-            }
-        }
-    }
-
-    private String getUserAgent(MessageContext messageContext) {
-        String userAgentString = "Axis2";
-        boolean locked = false;
-        if (messageContext.getParameter(HTTPConstants.USER_AGENT) != null) {
-            OMElement userAgentElement =
-                    messageContext.getParameter(HTTPConstants.USER_AGENT).getParameterElement();
-            userAgentString = userAgentElement.getText().trim();
-            OMAttribute lockedAttribute = userAgentElement.getAttribute(new QName("locked"));
-            if (lockedAttribute != null) {
-                if (lockedAttribute.getAttributeValue().equalsIgnoreCase("true")) {
-                    locked = true;
-                }
-            }
-        }
-        // Runtime overing part
-        if (!locked) {
-            if (messageContext.getProperty(HTTPConstants.USER_AGENT) != null) {
-                userAgentString = (String) messageContext.getProperty(HTTPConstants.USER_AGENT);
-            }
-        }
-
-        return userAgentString;
-    }
+    }  
     
 }
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/AxisRequestEntity.java b/modules/transport/http/src/org/apache/axis2/transport/http/AxisRequestEntity.java
index 0de3084..8834def 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/AxisRequestEntity.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/AxisRequestEntity.java
@@ -24,7 +24,6 @@ import org.apache.axis2.AxisFault;
 import org.apache.axis2.context.MessageContext;
 import org.apache.axis2.transport.MessageFormatter;
 import org.apache.axis2.util.JavaUtils;
-import org.apache.commons.httpclient.methods.RequestEntity;
 
 import javax.xml.stream.FactoryConfigurationError;
 import java.io.IOException;
@@ -35,7 +34,7 @@ import java.util.zip.GZIPOutputStream;
  * This Request Entity is used by the HTTPCommonsTransportSender. This wraps the
  * Axis2 message formatter object.
  */
-public class AxisRequestEntity implements RequestEntity {
+public abstract class AxisRequestEntity  {
 
     private MessageFormatter messageFormatter;
 
@@ -114,7 +113,17 @@ public class AxisRequestEntity implements RequestEntity {
         return bytes.length;
     }
 
-    public String getContentType() {
+    public String getContentTypeAsString() {
         return messageFormatter.getContentType(messageContext, format, soapAction);
     }
+
+    public boolean isChunked() {
+        return chunked;
+    }
+
+    public void setChunked(boolean chunked) {
+        this.chunked = chunked;
+    }
+    
+    
 }
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/AxisServlet.java b/modules/transport/http/src/org/apache/axis2/transport/http/AxisServlet.java
index ae43283..f78af68 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/AxisServlet.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/AxisServlet.java
@@ -555,7 +555,23 @@ public class AxisServlet extends HttpServlet {
         // AXIS2-4898: MultiThreadedHttpConnectionManager starts a thread that is not stopped by the
         // shutdown of the connection manager. If we want to avoid a resource leak, we need to call
         // shutdownAll here.
-        MultiThreadedHttpConnectionManager.shutdownAll();
+        // TODO - This action need be changed according to current HTTPClient.
+        String clientVersion = getHTTPClientVersion();
+        if (clientVersion != null
+                && HTTPTransportConstants.HTTP_CLIENT_4_X_VERSION.equals(clientVersion)) {
+            // TODO - Handle for HTTPClient 4
+        } else {
+            MultiThreadedHttpConnectionManager.shutdownAll();
+        }
+        
+    }
+
+    private String getHTTPClientVersion() {
+        Object version = configContext.getProperty(HTTPTransportConstants.HTTP_CLIENT_VERSION);
+        if (version != null) {
+            return String.valueOf(version);
+        }
+        return null;
     }
 
     /**
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/CommonsHTTPTransportSender.java b/modules/transport/http/src/org/apache/axis2/transport/http/CommonsHTTPTransportSender.java
index edb7d99..4181a56 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/CommonsHTTPTransportSender.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/CommonsHTTPTransportSender.java
@@ -31,11 +31,10 @@ import org.apache.axis2.description.TransportOutDescription;
 import org.apache.axis2.handlers.AbstractHandler;
 import org.apache.axis2.transport.MessageFormatter;
 import org.apache.axis2.transport.OutTransportInfo;
-import org.apache.axis2.transport.TransportSender;
 import org.apache.axis2.transport.TransportUtils;
+import org.apache.axis2.transport.http.impl.httpclient3.HTTPSenderImpl;
 import org.apache.axis2.transport.http.server.AxisHttpResponse;
 import org.apache.axis2.util.JavaUtils;
-import org.apache.commons.httpclient.HttpException;
 import org.apache.commons.httpclient.HttpMethod;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -51,8 +50,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.zip.GZIPOutputStream;
 
-public class CommonsHTTPTransportSender extends AbstractHandler implements
-        TransportSender {
+public class CommonsHTTPTransportSender extends AbstractHandler implements HTTPTransportSender {
     /**
      * The {@link TransportOutDescription} object received by the call to
      * {@link #init(ConfigurationContext, TransportOutDescription)}.
@@ -80,20 +78,22 @@ public class CommonsHTTPTransportSender extends AbstractHandler implements
     private int connectionTimeout = HTTPConstants.DEFAULT_CONNECTION_TIMEOUT;
 
     public void cleanup(MessageContext msgContext) throws AxisFault {
-        HttpMethod httpMethod = (HttpMethod) msgContext.getProperty(HTTPConstants.HTTP_METHOD);
-
-        if (httpMethod != null) {
-            // TODO : Don't do this if we're not on the right thread! Can we confirm?
-            log.trace("cleanup() releasing connection for " + httpMethod);
-
-            httpMethod.releaseConnection();
-            msgContext.removeProperty(HTTPConstants.HTTP_METHOD); // guard against multiple calls
-        }
+        
+            HttpMethod httpMethod = (HttpMethod) msgContext.getProperty(HTTPConstants.HTTP_METHOD);
+            if (httpMethod != null) {
+                // TODO : Don't do this if we're not on the right thread! Can we confirm?
+                log.trace("cleanup() releasing connection for " + httpMethod);
+
+                httpMethod.releaseConnection();
+                msgContext.removeProperty(HTTPConstants.HTTP_METHOD); // guard against multiple calls
+            }        
     }
 
     public void init(ConfigurationContext confContext,
                      TransportOutDescription transportOut) throws AxisFault {
         this.transportOut = transportOut;
+        //Set HTTP client version
+        setHTTPClientVersion(confContext);
         
         // <parameter name="PROTOCOL">HTTP/1.0</parameter> or
         // <parameter name="PROTOCOL">HTTP/1.1</parameter> is
@@ -376,7 +376,7 @@ public class CommonsHTTPTransportSender extends AbstractHandler implements
             // select the Message Sender depending on the REST status
             AbstractHTTPSender sender;
 
-            sender = new HTTPSender();
+            sender = new HTTPSenderImpl();
 
             boolean chunked;
             if (messageContext.getProperty(HTTPConstants.CHUNKED) != null) {
@@ -403,10 +403,7 @@ public class CommonsHTTPTransportSender extends AbstractHandler implements
         } catch (MalformedURLException e) {
             log.debug(e);
             throw AxisFault.makeFault(e);
-        } catch (HttpException e) {
-            log.debug(e);
-            throw AxisFault.makeFault(e);
-        } catch (IOException e) {
+        }  catch (IOException e) {
             log.debug(e);
             throw AxisFault.makeFault(e);
         }
@@ -505,4 +502,10 @@ public class CommonsHTTPTransportSender extends AbstractHandler implements
 
         return soapActionString;
     }
+    
+    public void setHTTPClientVersion(ConfigurationContext configurationContext) {
+        configurationContext.setProperty(HTTPTransportConstants.HTTP_CLIENT_VERSION,
+                HTTPTransportConstants.HTTP_CLIENT_3_X_VERSION);
+    }
+    
 }
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/CommonsTransportHeaders.java b/modules/transport/http/src/org/apache/axis2/transport/http/CommonsTransportHeaders.java
index d09ebad..828d226 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/CommonsTransportHeaders.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/CommonsTransportHeaders.java
@@ -19,30 +19,18 @@
 
 package org.apache.axis2.transport.http;
 
-import org.apache.commons.httpclient.Header;
 
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
 
-public class CommonsTransportHeaders implements Map {
-    private Header[] headers;
+public abstract class CommonsTransportHeaders implements Map {  
 
     HashMap headerMap = null;
-
-    public CommonsTransportHeaders(Header[] headers) {
-        this.headers = headers;
-    }
-
-    private void init() {
-        headerMap = new HashMap();
-
-        for (int i = 0; i < headers.length; i++) {
-            headerMap.put(headers[i].getName(), headers[i].getValue());
-        }
-    }
-
+   
+    protected abstract void init();
+    
     public int size() {
         if (headerMap == null) {
             init();
@@ -125,4 +113,14 @@ public class CommonsTransportHeaders implements Map {
         }
         return headerMap.put(key, value);
     }
+
+    public HashMap getHeaderMap() {
+        return headerMap;
+    }
+
+    public void setHeaderMap(HashMap headerMap) {
+        this.headerMap = headerMap;
+    }
+    
+    
 }
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/HTTPAuthenticator.java b/modules/transport/http/src/org/apache/axis2/transport/http/HTTPAuthenticator.java
new file mode 100644
index 0000000..2796b5e
--- /dev/null
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/HTTPAuthenticator.java
@@ -0,0 +1,107 @@
+/*
+ * 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.
+ */
+
+package org.apache.axis2.transport.http;
+
+import java.util.List;
+
+public abstract class HTTPAuthenticator {
+
+    /* host that needed to be authenticated with */
+    private String host;
+    /* Domain needed by NTCredentials for NT Domain */
+    private String domain;
+    /* User for authenticate */
+    private String username;
+    /* Password of the user for authenticate */
+    private String password;
+    /* Switch to use preemptive authentication or not */
+    private boolean preemptive = false;
+    /* if Authentication scheme needs retry just turn on the following flag */
+    private boolean allowedRetry = false;
+    /* Changing the priorty or adding a custom AuthPolicy */
+    private List authSchemes;
+
+    public abstract int getPort();
+
+    public abstract void setPort(int port);
+
+    public abstract String getRealm();
+
+    public abstract void setRealm(String realm);
+
+    public abstract Object getAuthPolicyPref(String schema);
+
+    public String getHost() {
+        return host;
+    }
+
+    public void setHost(String host) {
+        this.host = host;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public void setPreemptiveAuthentication(boolean preemptive) {
+        this.preemptive = preemptive;
+    }
+
+    public boolean getPreemptiveAuthentication() {
+        return this.preemptive;
+    }
+
+    public String getDomain() {
+        return domain;
+    }
+
+    public void setDomain(String domain) {
+        this.domain = domain;
+    }
+
+    public void setAuthSchemes(List authSchemes) {
+        this.authSchemes = authSchemes;
+    }
+
+    public List getAuthSchemes() {
+        return this.authSchemes;
+    }
+
+    public void setAllowedRetry(boolean allowedRetry) {
+        this.allowedRetry = allowedRetry;
+    }
+
+    public boolean isAllowedRetry() {
+        return this.allowedRetry;
+    }
+
+}
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/HTTPSender.java b/modules/transport/http/src/org/apache/axis2/transport/http/HTTPSender.java
index 1227004..118ffbf 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/HTTPSender.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/HTTPSender.java
@@ -23,58 +23,17 @@ package org.apache.axis2.transport.http;
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.Constants;
 import org.apache.axis2.context.MessageContext;
-import org.apache.axis2.context.OperationContext;
-import org.apache.axis2.i18n.Messages;
-import org.apache.axis2.transport.MessageFormatter;
-import org.apache.axis2.wsdl.WSDLConstants;
-import org.apache.commons.httpclient.Header;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpMethod;
-import org.apache.commons.httpclient.HttpMethodBase;
-import org.apache.commons.httpclient.HttpStatus;
-import org.apache.commons.httpclient.methods.DeleteMethod;
-import org.apache.commons.httpclient.methods.GetMethod;
-import org.apache.commons.httpclient.methods.PostMethod;
-import org.apache.commons.httpclient.methods.PutMethod;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
 import java.io.IOException;
 import java.net.URL;
 
-public class HTTPSender extends AbstractHTTPSender {
+//TODO - It better if we can define these method in a interface move these into AbstractHTTPSender and get rid of this class.
+public abstract class HTTPSender extends AbstractHTTPSender {
 
     private static final Log log = LogFactory.getLog(HTTPSender.class);
-
-    public void send(MessageContext msgContext, URL url, String soapActionString)
-            throws IOException {
-
-        // execute the HtttpMethodBase - a connection manager can be given for
-        // handle multiple
-
-        String httpMethod =
-                (String) msgContext.getProperty(Constants.Configuration.HTTP_METHOD);
-
-        if ((httpMethod != null)) {
-
-            if (Constants.Configuration.HTTP_METHOD_GET.equalsIgnoreCase(httpMethod)) {
-                this.sendViaGet(msgContext, url, soapActionString);
-
-                return;
-            } else if (Constants.Configuration.HTTP_METHOD_DELETE.equalsIgnoreCase(httpMethod)) {
-                this.sendViaDelete(msgContext, url, soapActionString);
-
-                return;
-            } else if (Constants.Configuration.HTTP_METHOD_PUT.equalsIgnoreCase(httpMethod)) {
-                this.sendViaPut(msgContext, url, soapActionString);
-
-                return;
-            }
-        }
-
-        this.sendViaPost(msgContext, url, soapActionString);
-    }
-
+    
     /**
      * Used to send a request via HTTP Get method
      *
@@ -83,39 +42,9 @@ public class HTTPSender extends AbstractHTTPSender {
      * @param soapActiionString - The soapAction string of the request
      * @throws AxisFault - Thrown in case an exception occurs
      */
-    private void sendViaGet(MessageContext msgContext, URL url, String soapActiionString)
-            throws AxisFault {
-
-        GetMethod getMethod = new GetMethod();
-        HttpClient httpClient = getHttpClient(msgContext);
-        MessageFormatter messageFormatter =
-                populateCommonProperties(msgContext, url, getMethod, httpClient, soapActiionString);
-
-        // Need to have this here because we can have soap action when using the soap response MEP
-        String soapAction =
-                messageFormatter.formatSOAPAction(msgContext, format, soapActiionString);
-
-        if (soapAction != null) {
-            getMethod.setRequestHeader(HTTPConstants.HEADER_SOAP_ACTION, soapAction);
-        }
-        try {
-            executeMethod(httpClient, msgContext, url, getMethod);
-            handleResponse(msgContext, getMethod);
-        } catch (IOException e) {
-            log.info("Unable to sendViaGet to url[" + url + "]", e);
-            throw AxisFault.makeFault(e);
-        } finally {
-            cleanup(msgContext, getMethod);
-        }
-    }
-
-    private void cleanup(MessageContext msgContext, HttpMethod method) {
-        if (msgContext.isPropertyTrue(HTTPConstants.AUTO_RELEASE_CONNECTION)) {
-            log.trace("AutoReleasing " + method);
-            method.releaseConnection();
-        }
-    }
-
+    protected abstract void sendViaGet(MessageContext msgContext, URL url, String soapActiionString)
+            throws AxisFault;
+    
     /**
      * Used to send a request via HTTP Delete Method
      *
@@ -124,24 +53,8 @@ public class HTTPSender extends AbstractHTTPSender {
      * @param soapActiionString - The soapAction string of the request
      * @throws AxisFault - Thrown in case an exception occurs
      */
-    private void sendViaDelete(MessageContext msgContext, URL url, String soapActiionString)
-            throws AxisFault {
-
-        DeleteMethod deleteMethod = new DeleteMethod();
-        HttpClient httpClient = getHttpClient(msgContext);
-        populateCommonProperties(msgContext, url, deleteMethod, httpClient, soapActiionString);
-
-        try {
-            executeMethod(httpClient, msgContext, url, deleteMethod);
-            handleResponse(msgContext, deleteMethod);
-        } catch (IOException e) {
-            log.info("Unable to sendViaDelete to url[" + url + "]", e);
-            throw AxisFault.makeFault(e);
-        } finally {
-            cleanup(msgContext, deleteMethod);
-        }
-    }
-
+    protected abstract void sendViaDelete(MessageContext msgContext, URL url, String soapActiionString)
+            throws AxisFault; 
     /**
      * Used to send a request via HTTP Post Method
      *
@@ -150,55 +63,9 @@ public class HTTPSender extends AbstractHTTPSender {
      * @param soapActionString - The soapAction string of the request
      * @throws AxisFault - Thrown in case an exception occurs
      */
-    private void sendViaPost(MessageContext msgContext, URL url,
-                             String soapActionString) throws AxisFault {
-
-
-        HttpClient httpClient = getHttpClient(msgContext);
-
-/*  What's up with this, it never gets used anywhere?? --Glen
-        String charEncoding =
-                (String) msgContext.getProperty(Constants.Configuration.CHARACTER_SET_ENCODING);
-
-        if (charEncoding == null) {
-            charEncoding = MessageContext.DEFAULT_CHAR_SET_ENCODING;
-        }
-*/
-
-        PostMethod postMethod = new PostMethod();
-        if (log.isTraceEnabled()) {
-            log.trace(Thread.currentThread() + " PostMethod " + postMethod + " / " + httpClient);
-        }
-        MessageFormatter messageFormatter =
-                populateCommonProperties(msgContext, url, postMethod, httpClient, soapActionString);
+    protected abstract void sendViaPost(MessageContext msgContext, URL url,
+                             String soapActionString) throws AxisFault;
 
-        postMethod.setRequestEntity(new AxisRequestEntity(messageFormatter,
-                                                          msgContext, format, soapActionString,
-                                                          chunked, isAllowedRetry));
-
-        if (!httpVersion.equals(HTTPConstants.HEADER_PROTOCOL_10) && chunked) {
-            postMethod.setContentChunked(true);
-        }
-
-        String soapAction = messageFormatter.formatSOAPAction(msgContext, format, soapActionString);
-
-        if (soapAction != null) {
-            postMethod.setRequestHeader(HTTPConstants.HEADER_SOAP_ACTION, soapAction);
-        }
-
-        /*
-         *   main excecution takes place..
-         */
-        try {
-            executeMethod(httpClient, msgContext, url, postMethod);
-            handleResponse(msgContext, postMethod);
-        } catch (IOException e) {
-            log.info("Unable to sendViaPost to url[" + url + "]", e);
-            throw AxisFault.makeFault(e);
-        } finally {
-            cleanup(msgContext, postMethod);
-        }
-    }
 
     /**
      * Used to send a request via HTTP Put Method
@@ -208,51 +75,10 @@ public class HTTPSender extends AbstractHTTPSender {
      * @param soapActionString - The soapAction string of the request
      * @throws AxisFault - Thrown in case an exception occurs
      */
-    private void sendViaPut(MessageContext msgContext, URL url,
-                            String soapActionString) throws AxisFault {
-
-
-        HttpClient httpClient = getHttpClient(msgContext);
-
-/*  Same deal - this value never gets used, why is it here? --Glen
-        String charEncoding =
-                (String) msgContext.getProperty(Constants.Configuration.CHARACTER_SET_ENCODING);
-
-        if (charEncoding == null) {
-            charEncoding = MessageContext.DEFAULT_CHAR_SET_ENCODING;
-        }
-*/
+    protected abstract void sendViaPut(MessageContext msgContext, URL url,
+                            String soapActionString) throws AxisFault;
 
-        PutMethod putMethod = new PutMethod();
-        MessageFormatter messageFormatter =
-                populateCommonProperties(msgContext, url, putMethod, httpClient, soapActionString);
-
-        putMethod.setRequestEntity(new AxisRequestEntity(messageFormatter,
-                                                         msgContext, format, soapActionString,
-                                                         chunked, isAllowedRetry));
-
-        if (!httpVersion.equals(HTTPConstants.HEADER_PROTOCOL_10) && chunked) {
-            putMethod.setContentChunked(true);
-        }
-
-        String soapAction = messageFormatter.formatSOAPAction(msgContext, format, soapActionString);
-        if (soapAction != null) {
-            putMethod.setRequestHeader(HTTPConstants.HEADER_SOAP_ACTION, soapAction);
-        }
-
-        /*
-         *   main excecution takes place..
-         */
-        try {
-            executeMethod(httpClient, msgContext, url, putMethod);
-            handleResponse(msgContext, putMethod);
-        } catch (IOException e) {
-            log.info("Unable to sendViaPut to url[" + url + "]", e);
-            throw AxisFault.makeFault(e);
-        } finally {
-            cleanup(msgContext, putMethod);
-        }
-    }
+     
 
     /**
      * Used to handle the HTTP Response
@@ -261,55 +87,40 @@ public class HTTPSender extends AbstractHTTPSender {
      * @param method     - The HTTP method used
      * @throws IOException - Thrown in case an exception occurs
      */
-    private void handleResponse(MessageContext msgContext,
-                                HttpMethodBase method) throws IOException {
-        int statusCode = method.getStatusCode();
-        log.trace("Handling response - " + statusCode);
-        if (statusCode == HttpStatus.SC_OK) {
-            // Save the HttpMethod so that we can release the connection when cleaning up
-            msgContext.setProperty(HTTPConstants.HTTP_METHOD, method);
-            processResponse(method, msgContext);
-        } else if (statusCode == HttpStatus.SC_ACCEPTED) {
-        	/* When an HTTP 202 Accepted code has been received, this will be the case of an execution 
-        	 * of an in-only operation. In such a scenario, the HTTP response headers should be returned,
-        	 * i.e. session cookies. */
-        	obtainHTTPHeaderInformation(method, msgContext);
-        	// Since we don't expect any content with a 202 response, we must release the connection
-        	method.releaseConnection();
-        } else if (statusCode == HttpStatus.SC_INTERNAL_SERVER_ERROR ||
-                statusCode == HttpStatus.SC_BAD_REQUEST) {
-            // Save the HttpMethod so that we can release the connection when cleaning up
-            msgContext.setProperty(HTTPConstants.HTTP_METHOD, method);
-            Header contenttypeHeader =
-                    method.getResponseHeader(HTTPConstants.HEADER_CONTENT_TYPE);
-            String value = null;
-            if (contenttypeHeader != null) {
-                value = contenttypeHeader.getValue();
-            }
-             OperationContext opContext = msgContext.getOperationContext();
-            if(opContext!=null){
-                MessageContext inMessageContext =
-                        opContext.getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE);
-                if(inMessageContext!=null){
-                    inMessageContext.setProcessingFault(true);
-                }
-            }
-            if (value != null) {
+    protected abstract void handleResponse(MessageContext msgContext,
+                                Object httpMethodBase) throws IOException;
+    
+    protected abstract void cleanup(MessageContext msgContext, Object httpMethod);
+    
+    
 
-                processResponse(method, msgContext);
-            }
-            
-            if (org.apache.axis2.util.Utils.isClientThreadNonBlockingPropertySet(msgContext)) {
-            	 throw new AxisFault(Messages.getMessage("transportError",
-                         String.valueOf(statusCode),
-                         method.getStatusText()));
+    public void send(MessageContext msgContext, URL url, String soapActionString)
+            throws IOException {
+
+        // execute the HtttpMethodBase - a connection manager can be given for
+        // handle multiple
+
+        String httpMethod =
+                (String) msgContext.getProperty(Constants.Configuration.HTTP_METHOD);
+
+        if ((httpMethod != null)) {
+
+            if (Constants.Configuration.HTTP_METHOD_GET.equalsIgnoreCase(httpMethod)) {
+                this.sendViaGet(msgContext, url, soapActionString);
+
+                return;
+            } else if (Constants.Configuration.HTTP_METHOD_DELETE.equalsIgnoreCase(httpMethod)) {
+                this.sendViaDelete(msgContext, url, soapActionString);
+
+                return;
+            } else if (Constants.Configuration.HTTP_METHOD_PUT.equalsIgnoreCase(httpMethod)) {
+                this.sendViaPut(msgContext, url, soapActionString);
+
+                return;
             }
-        } else {
-            // Since we don't process the response, we must release the connection immediately
-            method.releaseConnection();
-            throw new AxisFault(Messages.getMessage("transportError",
-                                                    String.valueOf(statusCode),
-                                                    method.getStatusText()));
         }
-    }
+
+        this.sendViaPost(msgContext, url, soapActionString);
+    }    
+       
 }
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/HTTPTransportConstants.java b/modules/transport/http/src/org/apache/axis2/transport/http/HTTPTransportConstants.java
new file mode 100644
index 0000000..73dfeb5
--- /dev/null
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/HTTPTransportConstants.java
@@ -0,0 +1,52 @@
+/*
+ * 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.
+ */
+
+package org.apache.axis2.transport.http;
+
+public class HTTPTransportConstants {
+
+    //Settings for HTTP proxy configuration.
+    public static final String HTTP_PROXY_HOST = "http.proxyHost";
+    public static final String HTTP_PROXY_PORT = "http.proxyPort";
+    public static final String HTTP_NON_PROXY_HOSTS = "http.nonProxyHosts";
+
+    public static final String ATTR_PROXY = "Proxy";
+    public static final String PROXY_HOST_ELEMENT = "ProxyHost";
+    public static final String PROXY_PORT_ELEMENT = "ProxyPort";
+    public static final String PROXY_USER_ELEMENT = "ProxyUser";
+    public static final String PROXY_PASSWORD_ELEMENT = "ProxyPassword";
+
+    public static final String PROXY_CONFIGURATION_NOT_FOUND = "HTTP Proxy is enabled, but proxy configuration element is missing in axis2.xml";
+    public static final String PROXY_HOST_ELEMENT_NOT_FOUND = "HTTP Proxy is enabled, but proxy host element is missing in axis2.xml";
+    public static final String PROXY_PORT_ELEMENT_NOT_FOUND = "HTTP Proxy is enabled, but proxy port element is missing in axis2.xml";
+    public static final String PROXY_HOST_ELEMENT_WITH_EMPTY_VALUE = "HTTP Proxy is enabled, but proxy host value is empty.";
+    public static final String PROXY_PORT_ELEMENT_WITH_EMPTY_VALUE = "HTTP Proxy is enabled, but proxy port value is empty.";
+    
+    //Settings to define HTTPClient version
+    public static final String HTTP_CLIENT_VERSION = "http.client.version"; 
+    public static final String HTTP_CLIENT_3_X_VERSION = "http.client.version.3x";
+    public static final String HTTP_CLIENT_4_X_VERSION = "http.client.version.4x";  
+    
+    public static final String ANONYMOUS = "anonymous";
+    public static final String PROXY_HOST_NAME = "proxy_host";
+    public static final String PROXY_PORT = "proxy_port";
+    public static final String PROTOCOL_HTTP = "http";
+    public static final String PROTOCOL_HTTPS = "https";
+
+}
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java b/modules/transport/http/src/org/apache/axis2/transport/http/HTTPTransportSender.java
similarity index 52%
copy from modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java
copy to modules/transport/http/src/org/apache/axis2/transport/http/HTTPTransportSender.java
index 81a3c6e..0f6641e 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/HTTPTransportSender.java
@@ -19,33 +19,11 @@
 
 package org.apache.axis2.transport.http;
 
-import org.apache.commons.httpclient.methods.RequestEntity;
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.transport.TransportSender;
 
-import java.io.IOException;
-import java.io.OutputStream;
+public interface HTTPTransportSender extends TransportSender {
 
-public class RESTRequestEntity2 implements RequestEntity {
-    private String contentType;
-    private String postRequestBody;
+    void setHTTPClientVersion(ConfigurationContext configurationContext);
 
-    public RESTRequestEntity2(String postRequestBody, String contentType) {
-        this.postRequestBody = postRequestBody;
-        this.contentType = contentType;
-    }
-
-    public void writeRequest(OutputStream output) throws IOException {
-        output.write(postRequestBody.getBytes());
-    }
-
-    public long getContentLength() {
-        return this.postRequestBody.getBytes().length;
-    }
-
-    public String getContentType() {
-        return this.contentType;
-    }
-
-    public boolean isRepeatable() {
-        return true;
-    }
 }
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/HttpTransportProperties.java b/modules/transport/http/src/org/apache/axis2/transport/http/HttpTransportProperties.java
index 25c58bf..01f7376 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/HttpTransportProperties.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/HttpTransportProperties.java
@@ -19,48 +19,36 @@
 
 package org.apache.axis2.transport.http;
 
-import org.apache.commons.httpclient.HttpVersion;
-import org.apache.commons.httpclient.auth.AuthPolicy;
-import org.apache.commons.httpclient.auth.AuthScope;
-
-import java.util.List;
 import java.util.Properties;
 
 /**
  * Utility bean for setting transport properties in runtime.
  */
-public class HttpTransportProperties {
-    protected boolean chunked;
-    protected HttpVersion httpVersion;
+public abstract class HttpTransportProperties {
+    
+    protected boolean chunked;    
     protected String protocol;
-
-    public HttpTransportProperties() {
-    }
+       
+    public abstract void setHttpVersion(Object httpVerion);
+    
+    public abstract Object getHttpVersion();
 
     public boolean getChunked() {
         return chunked;
     }
-
-    public HttpVersion getHttpVersion() {
-        return httpVersion;
-    }
-
+    
     public String getProtocol() {
         return protocol;
     }
 
     public void setChunked(boolean chunked) {
         this.chunked = chunked;
-    }
-
-    public void setHttpVersion(HttpVersion httpVerion) {
-        this.httpVersion = httpVerion;
-    }
+    }  
 
     public void setProtocol(String protocol) {
         this.protocol = protocol;
     }
-
+    
     public static class ProxyProperties {
         protected int proxyPort = -1;
         protected String domain = null;
@@ -112,109 +100,7 @@ public class HttpTransportProperties {
         }
     }
 
-    /*
-    This class is responsible for holding all the necessary information needed for NTML, Digest
-    and Basic Authentication. Authentication itself is handled by httpclient. User doesn't need to
-    warry about what authentication mechanism it uses. Axis2 uses httpclinet's default authentication
-    patterns.
-    */
-    public static class Authenticator {
-        /*host that needed to be authenticated with*/
-        private String host;
-        /*port of the host that needed to be authenticated with*/
-        private int port = AuthScope.ANY_PORT;
-        /*Realm for authentication scope*/
-        private String realm = AuthScope.ANY_REALM;
-        /*Domain needed by NTCredentials for NT Domain*/
-        private String domain;
-        /*User for authenticate*/
-        private String username;
-        /*Password of the user for authenticate*/
-        private String password;
-        /* Switch to use preemptive authentication or not*/
-        private boolean preemptive = false;
-        /* if Authentication scheme needs retry just turn on the following flag */
-        private boolean allowedRetry = false;
-        /* Changing the priorty or adding a custom AuthPolicy*/
-        private List authSchemes;
-
-        /* Default Auth Schems*/
-        public static final String NTLM = AuthPolicy.NTLM;
-        public static final String DIGEST = AuthPolicy.DIGEST;
-        public static final String BASIC = AuthPolicy.BASIC;
-
-        public String getHost() {
-            return host;
-        }
-
-        public void setHost(String host) {
-            this.host = host;
-        }
-
-        public int getPort() {
-            return port;
-        }
-
-        public void setPort(int port) {
-            this.port = port;
-        }
-
-        public String getRealm() {
-            return realm;
-        }
-
-        public void setRealm(String realm) {
-            this.realm = realm;
-        }
-
-        public String getUsername() {
-            return username;
-        }
-
-        public void setUsername(String username) {
-            this.username = username;
-        }
-
-        public String getPassword() {
-            return password;
-        }
-
-        public void setPassword(String password) {
-            this.password = password;
-        }
-
-        public void setPreemptiveAuthentication(boolean preemptive) {
-            this.preemptive = preemptive;
-        }
-
-        public boolean getPreemptiveAuthentication() {
-            return this.preemptive;
-        }
-
-        public String getDomain() {
-            return domain;
-        }
-
-        public void setDomain(String domain) {
-            this.domain = domain;
-        }
-
-        public void setAuthSchemes(List authSchemes) {
-            this.authSchemes = authSchemes;
-        }
-
-        public List getAuthSchemes() {
-            return this.authSchemes;
-        }
-
-        public void setAllowedRetry(boolean allowedRetry) {
-            this.allowedRetry = allowedRetry;
-        }
-
-        public boolean isAllowedRetry() {
-            return this.allowedRetry;
-        }
-    }
+   
 
     /**
      * @deprecated org.apache.axis2.transport.http.HttpTransportProperties.MailProperties has been
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity.java b/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity.java
index bca0588..6410584 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity.java
@@ -23,7 +23,6 @@ import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMOutputFormat;
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.context.MessageContext;
-import org.apache.commons.httpclient.methods.RequestEntity;
 
 import javax.xml.stream.FactoryConfigurationError;
 import javax.xml.stream.XMLStreamException;
@@ -31,7 +30,7 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 
-public class RESTRequestEntity implements RequestEntity {
+public abstract class RESTRequestEntity {
     private byte[] bytes;
     private String charSetEnc;
     private boolean chunked;
@@ -115,7 +114,7 @@ public class RESTRequestEntity implements RequestEntity {
         }
     }
 
-    public String getContentType() {
+    public String getContentTypeAsString() {
         String encoding = format.getCharSetEncoding();
         String contentType = format.getContentType();
         if (encoding != null) {
@@ -133,4 +132,61 @@ public class RESTRequestEntity implements RequestEntity {
     public boolean isRepeatable() {
         return true;
     }
+
+    public byte[] getBytes() {
+        return bytes;
+    }
+
+    public void setBytes(byte[] bytes) {
+        this.bytes = bytes;
+    }
+
+    public String getCharSetEnc() {
+        return charSetEnc;
+    }
+
+    public void setCharSetEnc(String charSetEnc) {
+        this.charSetEnc = charSetEnc;
+    }
+
+    public boolean isChunked() {
+        return chunked;
+    }
+
+    public void setChunked(boolean chunked) {
+        this.chunked = chunked;
+    }
+
+    public OMElement getElement() {
+        return element;
+    }
+
+    public void setElement(OMElement element) {
+        this.element = element;
+    }
+
+    public MessageContext getMsgCtxt() {
+        return msgCtxt;
+    }
+
+    public void setMsgCtxt(MessageContext msgCtxt) {
+        this.msgCtxt = msgCtxt;
+    }
+
+    public String getSoapActionString() {
+        return soapActionString;
+    }
+
+    public void setSoapActionString(String soapActionString) {
+        this.soapActionString = soapActionString;
+    }
+
+    public OMOutputFormat getFormat() {
+        return format;
+    }
+
+    public void setFormat(OMOutputFormat format) {
+        this.format = format;
+    }    
+    
 }
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java b/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java
index 81a3c6e..434b127 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java
@@ -19,12 +19,10 @@
 
 package org.apache.axis2.transport.http;
 
-import org.apache.commons.httpclient.methods.RequestEntity;
-
 import java.io.IOException;
 import java.io.OutputStream;
 
-public class RESTRequestEntity2 implements RequestEntity {
+public abstract class RESTRequestEntity2 {
     private String contentType;
     private String postRequestBody;
 
@@ -41,11 +39,25 @@ public class RESTRequestEntity2 implements RequestEntity {
         return this.postRequestBody.getBytes().length;
     }
 
-    public String getContentType() {
+    public String getContentTypeAsString() {
         return this.contentType;
     }
 
     public boolean isRepeatable() {
         return true;
     }
+   
+
+    public void setContentType(String contentType) {
+        this.contentType = contentType;
+    }
+
+    public String getPostRequestBody() {
+        return postRequestBody;
+    }
+
+    public void setPostRequestBody(String postRequestBody) {
+        this.postRequestBody = postRequestBody;
+    }
+    
 }
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/AxisRequestEntityImpl.java b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/AxisRequestEntityImpl.java
new file mode 100644
index 0000000..33f42e9
--- /dev/null
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/AxisRequestEntityImpl.java
@@ -0,0 +1,50 @@
+/*
+ * 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.
+ */
+
+package org.apache.axis2.transport.http.impl.httpclient3;
+
+import org.apache.axiom.om.OMOutputFormat;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.transport.MessageFormatter;
+import org.apache.axis2.transport.http.AxisRequestEntity;
+
+import org.apache.commons.httpclient.methods.RequestEntity;
+
+/**
+ * This Request Entity is used by the HTTPCommonsTransportSender. This wraps the
+ * Axis2 message formatter object.
+ */
+public class AxisRequestEntityImpl extends AxisRequestEntity implements RequestEntity {
+
+    /**
+     * Method calls to this request entity are delegated to the following Axis2
+     * message formatter object.
+     * 
+     * @param messageFormatter
+     */
+    public AxisRequestEntityImpl(MessageFormatter messageFormatter, MessageContext msgContext,
+            OMOutputFormat format, String soapAction, boolean chunked, boolean isAllowedRetry) {
+        super(messageFormatter, msgContext, format, soapAction, chunked, isAllowedRetry);
+    }
+
+    public String getContentType() {
+        return getContentTypeAsString();
+    }
+
+}
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HTTPClient3TransportSender.java b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HTTPClient3TransportSender.java
new file mode 100644
index 0000000..fbaaef4
--- /dev/null
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HTTPClient3TransportSender.java
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ */
+
+package org.apache.axis2.transport.http.impl.httpclient3;
+
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.transport.http.CommonsHTTPTransportSender;
+import org.apache.axis2.transport.http.HTTPTransportConstants;
+import org.apache.axis2.transport.http.HTTPTransportSender;
+
+public class HTTPClient3TransportSender extends CommonsHTTPTransportSender implements
+        HTTPTransportSender {
+
+    public void setHTTPClientVersion(ConfigurationContext configurationContext) {
+        configurationContext.setProperty(HTTPTransportConstants.HTTP_CLIENT_VERSION,
+                HTTPTransportConstants.HTTP_CLIENT_3_X_VERSION);
+    }
+
+    @Override
+    public void cleanup(MessageContext msgContext) throws AxisFault {
+        super.cleanup(msgContext);
+    }
+
+}
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/util/HTTPProxyConfigurationUtil.java b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HTTPProxcyConfigurator.java
similarity index 60%
copy from modules/transport/http/src/org/apache/axis2/transport/http/util/HTTPProxyConfigurationUtil.java
copy to modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HTTPProxcyConfigurator.java
index a163450..670e9e1 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/util/HTTPProxyConfigurationUtil.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HTTPProxcyConfigurator.java
@@ -17,13 +17,19 @@
  * under the License.
  */
 
-package org.apache.axis2.transport.http.util;
+package org.apache.axis2.transport.http.impl.httpclient3;
+
+import java.net.URL;
+import java.util.StringTokenizer;
+
+import javax.xml.namespace.QName;
 
 import org.apache.axiom.om.OMElement;
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.context.MessageContext;
 import org.apache.axis2.description.Parameter;
 import org.apache.axis2.transport.http.HTTPConstants;
+import org.apache.axis2.transport.http.HTTPTransportConstants;
 import org.apache.axis2.transport.http.HttpTransportProperties;
 import org.apache.commons.httpclient.Credentials;
 import org.apache.commons.httpclient.HostConfiguration;
@@ -35,60 +41,31 @@ import org.apache.commons.httpclient.auth.AuthScope;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
-import javax.xml.namespace.QName;
-import java.net.URL;
-import java.util.StringTokenizer;
+public class HTTPProxcyConfigurator {
 
-/**
- * Contains utility functions used when configuring HTTP Proxy for HTTP Sender.
- */
-public class HTTPProxyConfigurationUtil {
-    private static Log log = LogFactory.getLog(HTTPProxyConfigurationUtil.class);
-
-    protected static final String HTTP_PROXY_HOST = "http.proxyHost";
-    protected static final String HTTP_PROXY_PORT = "http.proxyPort";
-    protected static final String HTTP_NON_PROXY_HOSTS = "http.nonProxyHosts";
-
-    protected static final String ATTR_PROXY = "Proxy";
-    protected static final String PROXY_HOST_ELEMENT = "ProxyHost";
-    protected static final String PROXY_PORT_ELEMENT = "ProxyPort";
-    protected static final String PROXY_USER_ELEMENT = "ProxyUser";
-    protected static final String PROXY_PASSWORD_ELEMENT = "ProxyPassword";
-
-
-    protected static final String PROXY_CONFIGURATION_NOT_FOUND =
-            "HTTP Proxy is enabled, but proxy configuration element is missing in axis2.xml";
-    protected static final String PROXY_HOST_ELEMENT_NOT_FOUND =
-            "HTTP Proxy is enabled, but proxy host element is missing in axis2.xml";
-    protected static final String PROXY_PORT_ELEMENT_NOT_FOUND =
-            "HTTP Proxy is enabled, but proxy port element is missing in axis2.xml";
-    protected static final String PROXY_HOST_ELEMENT_WITH_EMPTY_VALUE =
-            "HTTP Proxy is enabled, but proxy host value is empty.";
-    protected static final String PROXY_PORT_ELEMENT_WITH_EMPTY_VALUE =
-            "HTTP Proxy is enabled, but proxy port value is empty.";
+    private static Log log = LogFactory.getLog(HTTPProxcyConfigurator.class);
 
     /**
-     * Configure HTTP Proxy settings of commons-httpclient HostConfiguration. Proxy settings can be get from
-     * axis2.xml, Java proxy settings or can be override through property in message context.
+     * Configure HTTP Proxy settings of commons-httpclient HostConfiguration.
+     * Proxy settings can be get from axis2.xml, Java proxy settings or can be
+     * override through property in message context.
      * <p/>
-     * HTTP Proxy setting element format:
-     * <parameter name="Proxy">
-     * <Configuration>
-     * <ProxyHost>example.org</ProxyHost>
-     * <ProxyPort>3128</ProxyPort>
-     * <ProxyUser>EXAMPLE/John</ProxyUser>
-     * <ProxyPassword>password</ProxyPassword>
-     * <Configuration>
-     * <parameter>
-     *
-     * @param messageContext in message context for
-     * @param httpClient     commons-httpclient instance
-     * @param config         commons-httpclient HostConfiguration
-     * @throws AxisFault if Proxy settings are invalid
+     * HTTP Proxy setting element format: <parameter name="Proxy">
+     * <Configuration> <ProxyHost>example.org</ProxyHost>
+     * <ProxyPort>3128</ProxyPort> <ProxyUser>EXAMPLE/John</ProxyUser>
+     * <ProxyPassword>password</ProxyPassword> <Configuration> <parameter>
+     * 
+     * @param messageContext
+     *            in message context for
+     * @param httpClient
+     *            commons-httpclient instance
+     * @param config
+     *            commons-httpclient HostConfiguration
+     * @throws AxisFault
+     *             if Proxy settings are invalid
      */
-    public static void configure(MessageContext messageContext,
-                                 HttpClient httpClient,
-                                 HostConfiguration config) throws AxisFault {
+    public static void configure(MessageContext messageContext, HttpClient httpClient,
+            HostConfiguration config) throws AxisFault {
 
         Credentials proxyCredentials = null;
         String proxyHost = null;
@@ -97,23 +74,23 @@ public class HTTPProxyConfigurationUtil {
         String proxyUser = null;
         String proxyPassword = null;
 
-        //Getting configuration values from Axis2.xml
-        Parameter proxySettingsFromAxisConfig = messageContext.getConfigurationContext().getAxisConfiguration()
-                .getParameter(ATTR_PROXY);
+        // Getting configuration values from Axis2.xml
+        Parameter proxySettingsFromAxisConfig = messageContext.getConfigurationContext()
+                .getAxisConfiguration().getParameter(HTTPTransportConstants.ATTR_PROXY);
         if (proxySettingsFromAxisConfig != null) {
             OMElement proxyConfiguration = getProxyConfigurationElement(proxySettingsFromAxisConfig);
             proxyHost = getProxyHost(proxyConfiguration);
             proxyPort = getProxyPort(proxyConfiguration);
             proxyUser = getProxyUser(proxyConfiguration);
             proxyPassword = getProxyPassword(proxyConfiguration);
-            if(proxyUser != null){
-                if(proxyPassword == null){
+            if (proxyUser != null) {
+                if (proxyPassword == null) {
                     proxyPassword = "";
                 }
                 int proxyUserDomainIndex = proxyUser.indexOf("\\");
-                if( proxyUserDomainIndex > 0){
+                if (proxyUserDomainIndex > 0) {
                     String domain = proxyUser.substring(0, proxyUserDomainIndex);
-                    if(proxyUser.length() > proxyUserDomainIndex + 1) {
+                    if (proxyUser.length() > proxyUserDomainIndex + 1) {
                         String user = proxyUser.substring(proxyUserDomainIndex + 1);
                         proxyCredentials = new NTCredentials(user, proxyPassword, proxyHost, domain);
                     }
@@ -123,12 +100,13 @@ public class HTTPProxyConfigurationUtil {
 
         }
 
-        // If there is runtime proxy settings, these settings will override settings from axis2.xml
-        HttpTransportProperties.ProxyProperties proxyProperties =
-                (HttpTransportProperties.ProxyProperties) messageContext.getProperty(HTTPConstants.PROXY);
-        if(proxyProperties != null) {
+        // If there is runtime proxy settings, these settings will override
+        // settings from axis2.xml
+        HttpTransportProperties.ProxyProperties proxyProperties = (HttpTransportProperties.ProxyProperties) messageContext
+                .getProperty(HTTPConstants.PROXY);
+        if (proxyProperties != null) {
             String proxyHostProp = proxyProperties.getProxyHostName();
-            if(proxyHostProp == null || proxyHostProp.length() <= 0) {
+            if (proxyHostProp == null || proxyHostProp.length() <= 0) {
                 throw new AxisFault("HTTP Proxy host is not available. Host is a MUST parameter");
             } else {
                 proxyHost = proxyHostProp;
@@ -140,29 +118,30 @@ public class HTTPProxyConfigurationUtil {
             String password = proxyProperties.getPassWord();
             String domain = proxyProperties.getDomain();
 
-            if(userName != null && password != null && domain != null){
+            if (userName != null && password != null && domain != null) {
                 proxyCredentials = new NTCredentials(userName, password, proxyHost, domain);
-            } else if(userName != null && domain == null){
+            } else if (userName != null && domain == null) {
                 proxyCredentials = new UsernamePasswordCredentials(userName, password);
             }
 
         }
 
         // Overriding proxy settings if proxy is available from JVM settings
-        String host = System.getProperty(HTTP_PROXY_HOST);
-        if(host != null) {
+        String host = System.getProperty(HTTPTransportConstants.HTTP_PROXY_HOST);
+        if (host != null) {
             proxyHost = host;
         }
 
-        String port = System.getProperty(HTTP_PROXY_PORT);
-        if(port != null) {
+        String port = System.getProperty(HTTPTransportConstants.HTTP_PROXY_PORT);
+        if (port != null) {
             proxyPort = Integer.parseInt(port);
         }
 
-        if(proxyCredentials != null) {
+        if (proxyCredentials != null) {
             httpClient.getParams().setAuthenticationPreemptive(true);
-            HttpState cachedHttpState = (HttpState)messageContext.getProperty(HTTPConstants.CACHED_HTTP_STATE);
-            if(cachedHttpState != null){
+            HttpState cachedHttpState = (HttpState) messageContext
+                    .getProperty(HTTPConstants.CACHED_HTTP_STATE);
+            if (cachedHttpState != null) {
                 httpClient.setState(cachedHttpState);
             }
             httpClient.getState().setProxyCredentials(AuthScope.ANY, proxyCredentials);
@@ -170,45 +149,50 @@ public class HTTPProxyConfigurationUtil {
         config.setProxy(proxyHost, proxyPort);
     }
 
-    private static OMElement getProxyConfigurationElement(Parameter proxySettingsFromAxisConfig) throws AxisFault {
-        OMElement proxyConfigurationElement = proxySettingsFromAxisConfig.getParameterElement().getFirstElement();
+    private static OMElement getProxyConfigurationElement(Parameter proxySettingsFromAxisConfig)
+            throws AxisFault {
+        OMElement proxyConfigurationElement = proxySettingsFromAxisConfig.getParameterElement()
+                .getFirstElement();
         if (proxyConfigurationElement == null) {
-            log.error(PROXY_CONFIGURATION_NOT_FOUND);
-            throw new AxisFault(PROXY_CONFIGURATION_NOT_FOUND);
+            log.error(HTTPTransportConstants.PROXY_CONFIGURATION_NOT_FOUND);
+            throw new AxisFault(HTTPTransportConstants.PROXY_CONFIGURATION_NOT_FOUND);
         }
         return proxyConfigurationElement;
     }
 
     private static String getProxyHost(OMElement proxyConfiguration) throws AxisFault {
-        OMElement proxyHostElement = proxyConfiguration.getFirstChildWithName(new QName(PROXY_HOST_ELEMENT));
+        OMElement proxyHostElement = proxyConfiguration.getFirstChildWithName(new QName(
+                HTTPTransportConstants.PROXY_HOST_ELEMENT));
         if (proxyHostElement == null) {
-            log.error(PROXY_HOST_ELEMENT_NOT_FOUND);
-            throw new AxisFault(PROXY_HOST_ELEMENT_NOT_FOUND);
+            log.error(HTTPTransportConstants.PROXY_HOST_ELEMENT_NOT_FOUND);
+            throw new AxisFault(HTTPTransportConstants.PROXY_HOST_ELEMENT_NOT_FOUND);
         }
         String proxyHost = proxyHostElement.getText();
         if (proxyHost == null) {
-            log.error(PROXY_HOST_ELEMENT_WITH_EMPTY_VALUE);
-            throw new AxisFault(PROXY_HOST_ELEMENT_WITH_EMPTY_VALUE);
+            log.error(HTTPTransportConstants.PROXY_HOST_ELEMENT_WITH_EMPTY_VALUE);
+            throw new AxisFault(HTTPTransportConstants.PROXY_HOST_ELEMENT_WITH_EMPTY_VALUE);
         }
         return proxyHost;
     }
 
     private static Integer getProxyPort(OMElement proxyConfiguration) throws AxisFault {
-        OMElement proxyPortElement = proxyConfiguration.getFirstChildWithName(new QName(PROXY_PORT_ELEMENT));
+        OMElement proxyPortElement = proxyConfiguration.getFirstChildWithName(new QName(
+                HTTPTransportConstants.PROXY_PORT_ELEMENT));
         if (proxyPortElement == null) {
-            log.error(PROXY_PORT_ELEMENT_NOT_FOUND);
-            throw new AxisFault(PROXY_PORT_ELEMENT_NOT_FOUND);
+            log.error(HTTPTransportConstants.PROXY_PORT_ELEMENT_NOT_FOUND);
+            throw new AxisFault(HTTPTransportConstants.PROXY_PORT_ELEMENT_NOT_FOUND);
         }
         String proxyPort = proxyPortElement.getText();
         if (proxyPort == null) {
-            log.error(PROXY_PORT_ELEMENT_WITH_EMPTY_VALUE);
-            throw new AxisFault(PROXY_PORT_ELEMENT_WITH_EMPTY_VALUE);
+            log.error(HTTPTransportConstants.PROXY_PORT_ELEMENT_WITH_EMPTY_VALUE);
+            throw new AxisFault(HTTPTransportConstants.PROXY_PORT_ELEMENT_WITH_EMPTY_VALUE);
         }
         return Integer.parseInt(proxyPort);
     }
 
     private static String getProxyUser(OMElement proxyConfiguration) {
-        OMElement proxyUserElement = proxyConfiguration.getFirstChildWithName(new QName(PROXY_USER_ELEMENT));
+        OMElement proxyUserElement = proxyConfiguration.getFirstChildWithName(new QName(
+                HTTPTransportConstants.PROXY_USER_ELEMENT));
         if (proxyUserElement == null) {
             return null;
         }
@@ -222,7 +206,8 @@ public class HTTPProxyConfigurationUtil {
     }
 
     private static String getProxyPassword(OMElement proxyConfiguration) {
-        OMElement proxyPasswordElement = proxyConfiguration.getFirstChildWithName(new QName(PROXY_PASSWORD_ELEMENT));
+        OMElement proxyPasswordElement = proxyConfiguration.getFirstChildWithName(new QName(
+                HTTPTransportConstants.PROXY_PASSWORD_ELEMENT));
         if (proxyPasswordElement == null) {
             return null;
         }
@@ -236,24 +221,26 @@ public class HTTPProxyConfigurationUtil {
     }
 
     /**
-     * Check whether http proxy is configured or active.
-     * This is not a deep check.
-     *
-     * @param messageContext in message context
-     * @param targetURL      URL of the edpoint which we are sending the request
+     * Check whether http proxy is configured or active. This is not a deep
+     * check.
+     * 
+     * @param messageContext
+     *            in message context
+     * @param targetURL
+     *            URL of the edpoint which we are sending the request
      * @return true if proxy is enabled, false otherwise
      */
     public static boolean isProxyEnabled(MessageContext messageContext, URL targetURL) {
         boolean proxyEnabled = false;
 
         Parameter param = messageContext.getConfigurationContext().getAxisConfiguration()
-                .getParameter(ATTR_PROXY);
+                .getParameter(HTTPTransportConstants.ATTR_PROXY);
 
-        //If configuration is over ridden
+        // If configuration is over ridden
         Object obj = messageContext.getProperty(HTTPConstants.PROXY);
 
-        //From Java Networking Properties
-        String sp = System.getProperty(HTTP_PROXY_HOST);
+        // From Java Networking Properties
+        String sp = System.getProperty(HTTPTransportConstants.HTTP_PROXY_HOST);
 
         if (param != null || obj != null || sp != null) {
             proxyEnabled = true;
@@ -265,31 +252,35 @@ public class HTTPProxyConfigurationUtil {
     }
 
     /**
-     * Validates for names that shouldn't be listered as proxies.
-     * The http.nonProxyHosts can be set to specify the hosts which should be
-     * connected to directly (not through the proxy server).
-     * The value of the http.nonProxyHosts property can be a list of hosts,
-     * each separated by a |; it can also take a regular expression for matches;
-     * for example: *.sfbay.sun.com would match any fully qualified hostname in the sfbay domain.
+     * Validates for names that shouldn't be listered as proxies. The
+     * http.nonProxyHosts can be set to specify the hosts which should be
+     * connected to directly (not through the proxy server). The value of the
+     * http.nonProxyHosts property can be a list of hosts, each separated by a
+     * |; it can also take a regular expression for matches; for example:
+     * *.sfbay.sun.com would match any fully qualified hostname in the sfbay
+     * domain.
      * <p/>
-     * For more information refer to : http://java.sun.com/features/2002/11/hilevel_network.html
+     * For more information refer to :
+     * http://java.sun.com/features/2002/11/hilevel_network.html
      * <p/>
-     * false : validation fail : User can use the proxy
-     * true : validation pass ; User can't use the proxy
-     *
+     * false : validation fail : User can use the proxy true : validation pass ;
+     * User can't use the proxy
+     * 
      * @return boolean
      */
     private static boolean validateNonProxyHosts(String host) {
-        //From system property http.nonProxyHosts
-        String nonProxyHosts = System.getProperty(HTTP_NON_PROXY_HOSTS);
+        // From system property http.nonProxyHosts
+        String nonProxyHosts = System.getProperty(HTTPTransportConstants.HTTP_NON_PROXY_HOSTS);
         return isHostInNonProxyList(host, nonProxyHosts);
     }
 
     /**
      * Check if the specified host is in the list of non proxy hosts.
-     *
-     * @param host          host name
-     * @param nonProxyHosts string containing the list of non proxy hosts
+     * 
+     * @param host
+     *            host name
+     * @param nonProxyHosts
+     *            string containing the list of non proxy hosts
      * @return true/false
      */
     public static boolean isHostInNonProxyList(String host, String nonProxyHosts) {
@@ -298,8 +289,8 @@ public class HTTPProxyConfigurationUtil {
         }
 
         /*
-         * The http.nonProxyHosts system property is a list enclosed in
-         * double quotes with items separated by a vertical bar.
+         * The http.nonProxyHosts system property is a list enclosed in double
+         * quotes with items separated by a vertical bar.
          */
         StringTokenizer tokenizer = new StringTokenizer(nonProxyHosts, "|\"");
 
@@ -314,18 +305,17 @@ public class HTTPProxyConfigurationUtil {
 
     /**
      * Matches a string against a pattern. The pattern contains two special
-     * characters:
-     * '*' which means zero or more characters,
-     *
-     * @param pattern         the (non-null) pattern to match against
-     * @param str             the (non-null) string that must be matched against the
-     *                        pattern
+     * characters: '*' which means zero or more characters,
+     * 
+     * @param pattern
+     *            the (non-null) pattern to match against
+     * @param str
+     *            the (non-null) string that must be matched against the pattern
      * @param isCaseSensitive
      * @return <code>true</code> when the string matches against the pattern,
      *         <code>false</code> otherwise.
      */
-    private static boolean match(String pattern, String str,
-                                 boolean isCaseSensitive) {
+    private static boolean match(String pattern, String str, boolean isCaseSensitive) {
 
         char[] patArr = pattern.toCharArray();
         char[] strArr = str.toCharArray();
@@ -346,35 +336,32 @@ public class HTTPProxyConfigurationUtil {
 
             // No '*'s, so we make a shortcut
             if (patIdxEnd != strIdxEnd) {
-                return false;        // Pattern and string do not have the same size
+                return false; // Pattern and string do not have the same size
             }
             for (int i = 0; i <= patIdxEnd; i++) {
                 ch = patArr[i];
                 if (isCaseSensitive && (ch != strArr[i])) {
-                    return false;    // Character mismatch
+                    return false; // Character mismatch
                 }
                 if (!isCaseSensitive
-                        && (Character.toUpperCase(ch)
-                        != Character.toUpperCase(strArr[i]))) {
-                    return false;    // Character mismatch
+                        && (Character.toUpperCase(ch) != Character.toUpperCase(strArr[i]))) {
+                    return false; // Character mismatch
                 }
             }
-            return true;             // String matches against pattern
+            return true; // String matches against pattern
         }
         if (patIdxEnd == 0) {
-            return true;    // Pattern contains only '*', which matches anything
+            return true; // Pattern contains only '*', which matches anything
         }
 
         // Process characters before first star
-        while ((ch = patArr[patIdxStart]) != '*'
-                && (strIdxStart <= strIdxEnd)) {
+        while ((ch = patArr[patIdxStart]) != '*' && (strIdxStart <= strIdxEnd)) {
             if (isCaseSensitive && (ch != strArr[strIdxStart])) {
-                return false;    // Character mismatch
+                return false; // Character mismatch
             }
             if (!isCaseSensitive
-                    && (Character.toUpperCase(ch)
-                    != Character.toUpperCase(strArr[strIdxStart]))) {
-                return false;    // Character mismatch
+                    && (Character.toUpperCase(ch) != Character.toUpperCase(strArr[strIdxStart]))) {
+                return false; // Character mismatch
             }
             patIdxStart++;
             strIdxStart++;
@@ -394,12 +381,11 @@ public class HTTPProxyConfigurationUtil {
         // Process characters after last star
         while ((ch = patArr[patIdxEnd]) != '*' && (strIdxStart <= strIdxEnd)) {
             if (isCaseSensitive && (ch != strArr[strIdxEnd])) {
-                return false;    // Character mismatch
+                return false; // Character mismatch
             }
             if (!isCaseSensitive
-                    && (Character.toUpperCase(ch)
-                    != Character.toUpperCase(strArr[strIdxEnd]))) {
-                return false;    // Character mismatch
+                    && (Character.toUpperCase(ch) != Character.toUpperCase(strArr[strIdxEnd]))) {
+                return false; // Character mismatch
             }
             patIdxEnd--;
             strIdxEnd--;
@@ -440,17 +426,15 @@ public class HTTPProxyConfigurationUtil {
             int strLength = (strIdxEnd - strIdxStart + 1);
             int foundIdx = -1;
 
-            strLoop:
-            for (int i = 0; i <= strLength - patLength; i++) {
+            strLoop: for (int i = 0; i <= strLength - patLength; i++) {
                 for (int j = 0; j < patLength; j++) {
                     ch = patArr[patIdxStart + j + 1];
-                    if (isCaseSensitive
-                            && (ch != strArr[strIdxStart + i + j])) {
+                    if (isCaseSensitive && (ch != strArr[strIdxStart + i + j])) {
                         continue strLoop;
                     }
-                    if (!isCaseSensitive && (Character
-                            .toUpperCase(ch) != Character
-                            .toUpperCase(strArr[strIdxStart + i + j]))) {
+                    if (!isCaseSensitive
+                            && (Character.toUpperCase(ch) != Character
+                                    .toUpperCase(strArr[strIdxStart + i + j]))) {
                         continue strLoop;
                     }
                 }
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/AbstractHTTPSender.java b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HTTPSenderImpl.java
similarity index 52%
copy from modules/transport/http/src/org/apache/axis2/transport/http/AbstractHTTPSender.java
copy to modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HTTPSenderImpl.java
index f02875a..4c5d7b8 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/AbstractHTTPSender.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HTTPSenderImpl.java
@@ -17,31 +17,51 @@
  * under the License.
  */
 
-package org.apache.axis2.transport.http;
+package org.apache.axis2.transport.http.impl.httpclient3;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.zip.GZIPInputStream;
+
+import javax.xml.namespace.QName;
 
 import org.apache.axiom.om.OMAttribute;
 import org.apache.axiom.om.OMElement;
-import org.apache.axiom.om.OMOutputFormat;
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.Constants;
+import org.apache.axis2.context.ConfigurationContext;
 import org.apache.axis2.context.MessageContext;
 import org.apache.axis2.context.NamedValue;
 import org.apache.axis2.context.OperationContext;
-import org.apache.axis2.context.ConfigurationContext;
-import org.apache.axis2.description.TransportOutDescription;
 import org.apache.axis2.i18n.Messages;
 import org.apache.axis2.transport.MessageFormatter;
 import org.apache.axis2.transport.TransportUtils;
-import org.apache.axis2.transport.http.util.HTTPProxyConfigurationUtil;
+import org.apache.axis2.transport.http.HTTPAuthenticator;
+import org.apache.axis2.transport.http.HTTPConstants;
+import org.apache.axis2.transport.http.HTTPSender;
+import org.apache.axis2.transport.http.HTTPTransportConstants;
 import org.apache.axis2.wsdl.WSDLConstants;
-import org.apache.commons.httpclient.Credentials;
 import org.apache.commons.httpclient.Header;
-import org.apache.commons.httpclient.HeaderElement;
-import org.apache.commons.httpclient.HostConfiguration;
 import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpConnectionManager;
 import org.apache.commons.httpclient.HttpMethod;
 import org.apache.commons.httpclient.HttpMethodBase;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.httpclient.methods.DeleteMethod;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.methods.PutMethod;
+
+import org.apache.commons.httpclient.Credentials;
+import org.apache.commons.httpclient.HeaderElement;
+import org.apache.commons.httpclient.HostConfiguration;
+import org.apache.commons.httpclient.HttpConnectionManager;
 import org.apache.commons.httpclient.HttpState;
 import org.apache.commons.httpclient.HttpVersion;
 import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
@@ -56,75 +76,306 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.http.protocol.HTTP;
 
-import javax.xml.namespace.QName;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.zip.GZIPInputStream;
+public class HTTPSenderImpl extends HTTPSender {
+
+    private static final Log log = LogFactory.getLog(HTTPSenderImpl.class);
 
-public abstract class AbstractHTTPSender {
-    protected static final String ANONYMOUS = "anonymous";
-    protected static final String PROXY_HOST_NAME = "proxy_host";
-    protected static final String PROXY_PORT = "proxy_port";
-    protected boolean chunked = false;
-    protected String httpVersion = HTTPConstants.HEADER_PROTOCOL_11;
-    private static final Log log = LogFactory.getLog(AbstractHTTPSender.class);
+    /**
+     * Used to send a request via HTTP Get method
+     * 
+     * @param msgContext
+     *            - The MessageContext of the message
+     * @param url
+     *            - The target URL
+     * @param soapActiionString
+     *            - The soapAction string of the request
+     * @throws AxisFault
+     *             - Thrown in case an exception occurs
+     */
+    protected void sendViaGet(MessageContext msgContext, URL url, String soapActiionString)
+            throws AxisFault {
+
+        GetMethod getMethod = new GetMethod();
+        HttpClient httpClient = getHttpClient(msgContext);
+        MessageFormatter messageFormatter = populateCommonProperties(msgContext, url, getMethod,
+                httpClient, soapActiionString);
+
+        // Need to have this here because we can have soap action when using the
+        // soap response MEP
+        String soapAction = messageFormatter
+                .formatSOAPAction(msgContext, format, soapActiionString);
+
+        if (soapAction != null) {
+            getMethod.setRequestHeader(HTTPConstants.HEADER_SOAP_ACTION, soapAction);
+        }
+        try {
+            executeMethod(httpClient, msgContext, url, getMethod);
+            handleResponse(msgContext, getMethod);
+        } catch (IOException e) {
+            log.info("Unable to sendViaGet to url[" + url + "]", e);
+            throw AxisFault.makeFault(e);
+        } finally {
+            cleanup(msgContext, getMethod);
+        }
+    }
 
-    protected static final String PROTOCOL_HTTP = "http";
-    protected static final String PROTOCOL_HTTPS = "https";
+    protected void cleanup(MessageContext msgContext, Object httpMmethod) {
+        if (httpMmethod instanceof HttpMethod) {
+            if (msgContext.isPropertyTrue(HTTPConstants.AUTO_RELEASE_CONNECTION)) {
+                log.trace("AutoReleasing " + httpMmethod);
+                ((HttpMethod) httpMmethod).releaseConnection();
+            }
+        }
+    }
 
     /**
-     * proxydiscription
+     * Used to send a request via HTTP Delete Method
+     * 
+     * @param msgContext
+     *            - The MessageContext of the message
+     * @param url
+     *            - The target URL
+     * @param soapActiionString
+     *            - The soapAction string of the request
+     * @throws AxisFault
+     *             - Thrown in case an exception occurs
      */
-    protected TransportOutDescription proxyOutSetting = null;
-    protected OMOutputFormat format = new OMOutputFormat();
+    protected void sendViaDelete(MessageContext msgContext, URL url, String soapActiionString)
+            throws AxisFault {
+
+        DeleteMethod deleteMethod = new DeleteMethod();
+        HttpClient httpClient = getHttpClient(msgContext);
+        populateCommonProperties(msgContext, url, deleteMethod, httpClient, soapActiionString);
+
+        try {
+            executeMethod(httpClient, msgContext, url, deleteMethod);
+            handleResponse(msgContext, deleteMethod);
+        } catch (IOException e) {
+            log.info("Unable to sendViaDelete to url[" + url + "]", e);
+            throw AxisFault.makeFault(e);
+        } finally {
+            cleanup(msgContext, deleteMethod);
+        }
+    }
 
     /**
-     * isAllowedRetry will be using to check where the
-     * retry should be allowed or not.
+     * Used to send a request via HTTP Post Method
+     * 
+     * @param msgContext
+     *            - The MessageContext of the message
+     * @param url
+     *            - The target URL
+     * @param soapActionString
+     *            - The soapAction string of the request
+     * @throws AxisFault
+     *             - Thrown in case an exception occurs
      */
-    protected boolean isAllowedRetry = false;
+    protected void sendViaPost(MessageContext msgContext, URL url, String soapActionString)
+            throws AxisFault {
 
-    public void setChunked(boolean chunked) {
-        this.chunked = chunked;
+        HttpClient httpClient = getHttpClient(msgContext);
+
+        /*
+         * What's up with this, it never gets used anywhere?? --Glen String
+         * charEncoding = (String)
+         * msgContext.getProperty(Constants.Configuration
+         * .CHARACTER_SET_ENCODING);
+         * 
+         * if (charEncoding == null) { charEncoding =
+         * MessageContext.DEFAULT_CHAR_SET_ENCODING; }
+         */
+
+        PostMethod postMethod = new PostMethod();
+        if (log.isTraceEnabled()) {
+            log.trace(Thread.currentThread() + " PostMethod " + postMethod + " / " + httpClient);
+        }
+        MessageFormatter messageFormatter = populateCommonProperties(msgContext, url, postMethod,
+                httpClient, soapActionString);
+
+        postMethod.setRequestEntity(new AxisRequestEntityImpl(messageFormatter, msgContext, format,
+                soapActionString, chunked, isAllowedRetry));
+
+        if (!httpVersion.equals(HTTPConstants.HEADER_PROTOCOL_10) && chunked) {
+            postMethod.setContentChunked(true);
+        }
+
+        String soapAction = messageFormatter.formatSOAPAction(msgContext, format, soapActionString);
+
+        if (soapAction != null) {
+            postMethod.setRequestHeader(HTTPConstants.HEADER_SOAP_ACTION, soapAction);
+        }
+
+        /*
+         * main excecution takes place..
+         */
+        try {
+            executeMethod(httpClient, msgContext, url, postMethod);
+            handleResponse(msgContext, postMethod);
+        } catch (IOException e) {
+            log.info("Unable to sendViaPost to url[" + url + "]", e);
+            throw AxisFault.makeFault(e);
+        } finally {
+            cleanup(msgContext, postMethod);
+        }
     }
 
-    public void setHttpVersion(String version) throws AxisFault {
-        if (version != null) {
-            if (HTTPConstants.HEADER_PROTOCOL_11.equals(version)) {
-                this.httpVersion = HTTPConstants.HEADER_PROTOCOL_11;
-            } else if (HTTPConstants.HEADER_PROTOCOL_10.equals(version)) {
-                this.httpVersion = HTTPConstants.HEADER_PROTOCOL_10;
-                // chunked is not possible with HTTP/1.0
-                this.chunked = false;
-            } else {
-                throw new AxisFault(
-                        "Parameter " + HTTPConstants.PROTOCOL_VERSION
-                                + " Can have values only HTTP/1.0 or HTTP/1.1");
+    /**
+     * Used to send a request via HTTP Put Method
+     * 
+     * @param msgContext
+     *            - The MessageContext of the message
+     * @param url
+     *            - The target URL
+     * @param soapActionString
+     *            - The soapAction string of the request
+     * @throws AxisFault
+     *             - Thrown in case an exception occurs
+     */
+    protected void sendViaPut(MessageContext msgContext, URL url, String soapActionString)
+            throws AxisFault {
+
+        HttpClient httpClient = getHttpClient(msgContext);
+
+        /*
+         * Same deal - this value never gets used, why is it here? --Glen String
+         * charEncoding = (String)
+         * msgContext.getProperty(Constants.Configuration
+         * .CHARACTER_SET_ENCODING);
+         * 
+         * if (charEncoding == null) { charEncoding =
+         * MessageContext.DEFAULT_CHAR_SET_ENCODING; }
+         */
+
+        PutMethod putMethod = new PutMethod();
+        MessageFormatter messageFormatter = populateCommonProperties(msgContext, url, putMethod,
+                httpClient, soapActionString);
+
+        putMethod.setRequestEntity(new AxisRequestEntityImpl(messageFormatter, msgContext, format,
+                soapActionString, chunked, isAllowedRetry));
+
+        if (!httpVersion.equals(HTTPConstants.HEADER_PROTOCOL_10) && chunked) {
+            putMethod.setContentChunked(true);
+        }
+
+        String soapAction = messageFormatter.formatSOAPAction(msgContext, format, soapActionString);
+        if (soapAction != null) {
+            putMethod.setRequestHeader(HTTPConstants.HEADER_SOAP_ACTION, soapAction);
+        }
+
+        /*
+         * main excecution takes place..
+         */
+        try {
+            executeMethod(httpClient, msgContext, url, putMethod);
+            handleResponse(msgContext, putMethod);
+        } catch (IOException e) {
+            log.info("Unable to sendViaPut to url[" + url + "]", e);
+            throw AxisFault.makeFault(e);
+        } finally {
+            cleanup(msgContext, putMethod);
+        }
+    }
+
+    /**
+     * Used to handle the HTTP Response
+     * 
+     * @param msgContext
+     *            - The MessageContext of the message
+     * @param method
+     *            - The HTTP method used
+     * @throws IOException
+     *             - Thrown in case an exception occurs
+     */
+    protected void handleResponse(MessageContext msgContext, Object httpMethodBase)
+            throws IOException {
+        HttpMethodBase method;
+        if (httpMethodBase instanceof HttpMethodBase) {
+            method = (HttpMethodBase) httpMethodBase;
+        } else {
+            log.trace("HttpMethodBase expected, but found - " + httpMethodBase);
+            return;
+        }
+        int statusCode = method.getStatusCode();
+        log.trace("Handling response - " + statusCode);
+        if (statusCode == HttpStatus.SC_OK) {
+            // Save the HttpMethod so that we can release the connection when
+            // cleaning up
+            msgContext.setProperty(HTTPConstants.HTTP_METHOD, method);
+            processResponse(method, msgContext);
+        } else if (statusCode == HttpStatus.SC_ACCEPTED) {
+            /*
+             * When an HTTP 202 Accepted code has been received, this will be
+             * the case of an execution of an in-only operation. In such a
+             * scenario, the HTTP response headers should be returned, i.e.
+             * session cookies.
+             */
+            obtainHTTPHeaderInformation(method, msgContext);
+            // Since we don't expect any content with a 202 response, we must
+            // release the connection
+            method.releaseConnection();
+        } else if (statusCode == HttpStatus.SC_INTERNAL_SERVER_ERROR
+                || statusCode == HttpStatus.SC_BAD_REQUEST) {
+            // Save the HttpMethod so that we can release the connection when
+            // cleaning up
+            msgContext.setProperty(HTTPConstants.HTTP_METHOD, method);
+            Header contenttypeHeader = method.getResponseHeader(HTTPConstants.HEADER_CONTENT_TYPE);
+            String value = null;
+            if (contenttypeHeader != null) {
+                value = contenttypeHeader.getValue();
+            }
+            OperationContext opContext = msgContext.getOperationContext();
+            if (opContext != null) {
+                MessageContext inMessageContext = opContext
+                        .getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE);
+                if (inMessageContext != null) {
+                    inMessageContext.setProcessingFault(true);
+                }
+            }
+            if (value != null) {
+
+                processResponse(method, msgContext);
+            }
+
+            if (org.apache.axis2.util.Utils.isClientThreadNonBlockingPropertySet(msgContext)) {
+                throw new AxisFault(Messages.getMessage("transportError",
+                        String.valueOf(statusCode), method.getStatusText()));
             }
+        } else {
+            // Since we don't process the response, we must release the
+            // connection immediately
+            method.releaseConnection();
+            throw new AxisFault(Messages.getMessage("transportError", String.valueOf(statusCode),
+                    method.getStatusText()));
         }
     }
 
     /**
      * Collect the HTTP header information and set them in the message context
-     *
-     * @param method HttpMethodBase from which to get information
-     * @param msgContext the MessageContext in which to place the information... OR NOT!
-     * @throws AxisFault if problems occur
+     * 
+     * @param method
+     *            HttpMethodBase from which to get information
+     * @param msgContext
+     *            the MessageContext in which to place the information... OR
+     *            NOT!
+     * @throws AxisFault
+     *             if problems occur
      */
-    protected void obtainHTTPHeaderInformation(HttpMethodBase method,
-                                               MessageContext msgContext) throws AxisFault {
-        // Set RESPONSE properties onto the REQUEST message context.  They will need to be copied off the request context onto
-        // the response context elsewhere, for example in the OutInOperationClient.
-        Map transportHeaders = new CommonsTransportHeaders(method.getResponseHeaders());
+    protected void obtainHTTPHeaderInformation(Object httpMethodBase, MessageContext msgContext)
+            throws AxisFault {
+        HttpMethod method;
+        if (httpMethodBase instanceof HttpMethodBase) {
+            method = (HttpMethod) httpMethodBase;
+        } else {
+            return;
+        }
+        // Set RESPONSE properties onto the REQUEST message context. They will
+        // need to be copied off the request context onto
+        // the response context elsewhere, for example in the
+        // OutInOperationClient.
+        Map transportHeaders = new HTTPTransportHeaders(method.getResponseHeaders());
         msgContext.setProperty(MessageContext.TRANSPORT_HEADERS, transportHeaders);
-        msgContext.setProperty(HTTPConstants.MC_HTTP_STATUS_CODE, new Integer(method.getStatusCode()));
+        msgContext.setProperty(HTTPConstants.MC_HTTP_STATUS_CODE,
+                new Integer(method.getStatusCode()));
         Header header = method.getResponseHeader(HTTPConstants.HEADER_CONTENT_TYPE);
 
         if (header != null) {
@@ -136,29 +387,29 @@ public abstract class AbstractHTTPSender {
             Object charSetEnc = null;
 
             for (int i = 0; i < headers.length; i++) {
-                NameValuePair charsetEnc = headers[i].getParameterByName(
-                        HTTPConstants.CHAR_SET_ENCODING);
+                NameValuePair charsetEnc = headers[i]
+                        .getParameterByName(HTTPConstants.CHAR_SET_ENCODING);
                 if (charsetEnc != null) {
                     charSetEnc = charsetEnc.getValue();
                 }
             }
 
             if (inMessageContext != null) {
-                inMessageContext
-                        .setProperty(Constants.Configuration.CONTENT_TYPE, contentType);
-                inMessageContext
-                        .setProperty(Constants.Configuration.CHARACTER_SET_ENCODING, charSetEnc);
+                inMessageContext.setProperty(Constants.Configuration.CONTENT_TYPE, contentType);
+                inMessageContext.setProperty(Constants.Configuration.CHARACTER_SET_ENCODING,
+                        charSetEnc);
             } else {
 
-                // Transport details will be stored in a HashMap so that anybody interested can
+                // Transport details will be stored in a HashMap so that anybody
+                // interested can
                 // retrieve them
                 HashMap transportInfoMap = new HashMap();
                 transportInfoMap.put(Constants.Configuration.CONTENT_TYPE, contentType);
                 transportInfoMap.put(Constants.Configuration.CHARACTER_SET_ENCODING, charSetEnc);
 
-                //the HashMap is stored in the outgoing message.
-                msgContext.setProperty(Constants.Configuration.TRANSPORT_INFO_MAP,
-                                       transportInfoMap);
+                // the HashMap is stored in the outgoing message.
+                msgContext
+                        .setProperty(Constants.Configuration.TRANSPORT_INFO_MAP, transportInfoMap);
             }
         }
 
@@ -170,8 +421,8 @@ public abstract class AbstractHTTPSender {
             HeaderElement[] elements = cookieHeaders[i].getElements();
             for (int e = 0; e < elements.length; e++) {
                 HeaderElement element = elements[e];
-                if (Constants.SESSION_COOKIE.equalsIgnoreCase(element.getName()) ||
-                        Constants.SESSION_COOKIE_JSESSIONID.equalsIgnoreCase(element.getName())) {
+                if (Constants.SESSION_COOKIE.equalsIgnoreCase(element.getName())
+                        || Constants.SESSION_COOKIE_JSESSIONID.equalsIgnoreCase(element.getName())) {
                     sessionCookie = processCookieHeader(element);
                 }
                 if (customCoookiId != null && customCoookiId.equalsIgnoreCase(element.getName())) {
@@ -185,11 +436,11 @@ public abstract class AbstractHTTPSender {
             HeaderElement[] elements = cookieHeaders[i].getElements();
             for (int e = 0; e < elements.length; e++) {
                 HeaderElement element = elements[e];
-                if (Constants.SESSION_COOKIE.equalsIgnoreCase(element.getName()) ||
-                        Constants.SESSION_COOKIE_JSESSIONID.equalsIgnoreCase(element.getName())) {
+                if (Constants.SESSION_COOKIE.equalsIgnoreCase(element.getName())
+                        || Constants.SESSION_COOKIE_JSESSIONID.equalsIgnoreCase(element.getName())) {
                     sessionCookie = processCookieHeader(element);
                 }
-                if(customCoookiId!=null&&customCoookiId.equalsIgnoreCase(element.getName())){
+                if (customCoookiId != null && customCoookiId.equalsIgnoreCase(element.getName())) {
                     sessionCookie = processCookieHeader(element);
                 }
             }
@@ -202,7 +453,7 @@ public abstract class AbstractHTTPSender {
 
     private String processCookieHeader(HeaderElement element) {
         String cookie = element.getName() + "=" + element.getValue();
-        NameValuePair[] parameters =  element.getParameters();
+        NameValuePair[] parameters = element.getParameters();
         for (int j = 0; parameters != null && j < parameters.length; j++) {
             NameValuePair parameter = parameters[j];
             cookie = cookie + "; " + parameter.getName() + "=" + parameter.getValue();
@@ -210,8 +461,7 @@ public abstract class AbstractHTTPSender {
         return cookie;
     }
 
-    protected void processResponse(HttpMethodBase httpMethod,
-                                   MessageContext msgContext)
+    protected void processResponse(HttpMethodBase httpMethod, MessageContext msgContext)
             throws IOException {
         obtainHTTPHeaderInformation(httpMethod, msgContext);
 
@@ -219,13 +469,13 @@ public abstract class AbstractHTTPSender {
         if (in == null) {
             throw new AxisFault(Messages.getMessage("canNotBeNull", "InputStream"));
         }
-        Header contentEncoding =
-                httpMethod.getResponseHeader(HTTPConstants.HEADER_CONTENT_ENCODING);
+        Header contentEncoding = httpMethod
+                .getResponseHeader(HTTPConstants.HEADER_CONTENT_ENCODING);
         if (contentEncoding != null) {
-            if (contentEncoding.getValue().
-                    equalsIgnoreCase(HTTPConstants.COMPRESSION_GZIP)) {
+            if (contentEncoding.getValue().equalsIgnoreCase(HTTPConstants.COMPRESSION_GZIP)) {
                 in = new GZIPInputStream(in);
-                // If the content-encoding is identity we can basically ignore it.
+                // If the content-encoding is identity we can basically ignore
+                // it.
             } else if (!"identity".equalsIgnoreCase(contentEncoding.getValue())) {
                 throw new AxisFault("HTTP :" + "unsupported content-encoding of '"
                         + contentEncoding.getValue() + "' found");
@@ -238,44 +488,48 @@ public abstract class AbstractHTTPSender {
         }
     }
 
-    public abstract void send(MessageContext msgContext, URL url, String soapActionString)
-            throws IOException;
-
     /**
-     * getting host configuration to support standard http/s, proxy and NTLM support
-     *
-     * @param client active HttpClient
-     * @param msgCtx active MessageContext
-     * @param targetURL the target URL
+     * getting host configuration to support standard http/s, proxy and NTLM
+     * support
+     * 
+     * @param client
+     *            active HttpClient
+     * @param msgCtx
+     *            active MessageContext
+     * @param targetURL
+     *            the target URL
      * @return a HostConfiguration set up with proxy information
-     * @throws AxisFault if problems occur
+     * @throws AxisFault
+     *             if problems occur
      */
-    protected HostConfiguration getHostConfiguration(HttpClient client,
-                                                     MessageContext msgCtx,
-                                                     URL targetURL)throws AxisFault {
+    protected HostConfiguration getHostConfiguration(HttpClient client, MessageContext msgCtx,
+            URL targetURL) throws AxisFault {
 
         boolean isAuthenticationEnabled = isAuthenticationEnabled(msgCtx);
         int port = targetURL.getPort();
 
         String protocol = targetURL.getProtocol();
         if (port == -1) {
-            if (PROTOCOL_HTTP.equals(protocol)) {
+            if (HTTPTransportConstants.PROTOCOL_HTTP.equals(protocol)) {
                 port = 80;
-            } else if (PROTOCOL_HTTPS.equals(protocol)) {
+            } else if (HTTPTransportConstants.PROTOCOL_HTTPS.equals(protocol)) {
                 port = 443;
             }
 
         }
 
-        // to see the host is a proxy and in the proxy list - available in axis2.xml
+        // to see the host is a proxy and in the proxy list - available in
+        // axis2.xml
         HostConfiguration config = new HostConfiguration();
 
-        // one might need to set his own socket factory. Let's allow that case as well.
-        Protocol protocolHandler =
-                (Protocol)msgCtx.getOptions().getProperty(HTTPConstants.CUSTOM_PROTOCOL_HANDLER);
+        // one might need to set his own socket factory. Let's allow that case
+        // as well.
+        Protocol protocolHandler = (Protocol) msgCtx.getOptions().getProperty(
+                HTTPConstants.CUSTOM_PROTOCOL_HANDLER);
 
         // setting the real host configuration
-        // I assume the 90% case, or even 99% case will be no protocol handler case.
+        // I assume the 90% case, or even 99% case will be no protocol handler
+        // case.
         if (protocolHandler == null) {
             config.setHost(targetURL.getHost(), port, targetURL.getProtocol());
         } else {
@@ -288,11 +542,11 @@ public abstract class AbstractHTTPSender {
         }
         // proxy configuration
 
-        if (HTTPProxyConfigurationUtil.isProxyEnabled(msgCtx, targetURL)) {
-            if(log.isDebugEnabled()){
+        if (HTTPProxcyConfigurator.isProxyEnabled(msgCtx, targetURL)) {
+            if (log.isDebugEnabled()) {
                 log.debug("Configuring HTTP proxy.");
             }
-            HTTPProxyConfigurationUtil.configure(msgCtx, client, config);
+            HTTPProxcyConfigurator.configure(msgCtx, client, config);
         }
 
         return config;
@@ -303,17 +557,17 @@ public abstract class AbstractHTTPSender {
     }
 
     /*
-    This will handle server Authentication, It could be either NTLM, Digest or Basic Authentication.
-    Apart from that user can change the priory or add a custom authentication scheme.
-    */
-    protected void setAuthenticationInfo(HttpClient agent,
-                                         MessageContext msgCtx,
-                                         HostConfiguration config) throws AxisFault {
-        HttpTransportProperties.Authenticator authenticator;
+     * This will handle server Authentication, It could be either NTLM, Digest
+     * or Basic Authentication. Apart from that user can change the priory or
+     * add a custom authentication scheme.
+     */
+    protected void setAuthenticationInfo(HttpClient agent, MessageContext msgCtx,
+            HostConfiguration config) throws AxisFault {
+        HTTPAuthenticator authenticator;
         Object obj = msgCtx.getProperty(HTTPConstants.AUTHENTICATE);
         if (obj != null) {
-            if (obj instanceof HttpTransportProperties.Authenticator) {
-                authenticator = (HttpTransportProperties.Authenticator) obj;
+            if (obj instanceof HTTPAuthenticator) {
+                authenticator = (HTTPAuthenticator) obj;
 
                 String username = authenticator.getUsername();
                 String password = authenticator.getPassword();
@@ -329,33 +583,37 @@ public abstract class AbstractHTTPSender {
                 Credentials creds;
 
                 HttpState tmpHttpState = null;
-                HttpState httpState = (HttpState)msgCtx.getProperty(HTTPConstants.CACHED_HTTP_STATE);
+                HttpState httpState = (HttpState) msgCtx
+                        .getProperty(HTTPConstants.CACHED_HTTP_STATE);
                 if (httpState != null) {
                     tmpHttpState = httpState;
                 } else {
                     tmpHttpState = agent.getState();
                 }
-                
-                agent.getParams()
-                        .setAuthenticationPreemptive(authenticator.getPreemptiveAuthentication());
+
+                agent.getParams().setAuthenticationPreemptive(
+                        authenticator.getPreemptiveAuthentication());
 
                 if (host != null) {
                     if (domain != null) {
-                        /*Credentials for NTLM Authentication*/
+                        /* Credentials for NTLM Authentication */
                         creds = new NTCredentials(username, password, host, domain);
                     } else {
-                        /*Credentials for Digest and Basic Authentication*/
+                        /* Credentials for Digest and Basic Authentication */
                         creds = new UsernamePasswordCredentials(username, password);
                     }
                     tmpHttpState.setCredentials(new AuthScope(host, port, realm), creds);
                 } else {
                     if (domain != null) {
-                        /*Credentials for NTLM Authentication when host is ANY_HOST*/
+                        /*
+                         * Credentials for NTLM Authentication when host is
+                         * ANY_HOST
+                         */
                         creds = new NTCredentials(username, password, AuthScope.ANY_HOST, domain);
-                        tmpHttpState.setCredentials(
-                                new AuthScope(AuthScope.ANY_HOST, port, realm), creds);
+                        tmpHttpState.setCredentials(new AuthScope(AuthScope.ANY_HOST, port, realm),
+                                creds);
                     } else {
-                        /*Credentials only for Digest and Basic Authentication*/
+                        /* Credentials only for Digest and Basic Authentication */
                         creds = new UsernamePasswordCredentials(username, password);
                         tmpHttpState.setCredentials(new AuthScope(AuthScope.ANY), creds);
                     }
@@ -370,16 +628,10 @@ public abstract class AbstractHTTPSender {
                             continue;
                         }
                         String scheme = (String) schemes.get(i);
-                        if (HttpTransportProperties.Authenticator.BASIC.equals(scheme)) {
-                            authPrefs.add(AuthPolicy.BASIC);
-                        } else if (HttpTransportProperties.Authenticator.NTLM.equals(scheme)) {
-                            authPrefs.add(AuthPolicy.NTLM);
-                        } else if (HttpTransportProperties.Authenticator.DIGEST.equals(scheme)) {
-                            authPrefs.add(AuthPolicy.DIGEST);
-                        }
+                        authPrefs.add(authenticator.getAuthPolicyPref(scheme));
+
                     }
-                    agent.getParams().setParameter(AuthPolicy.AUTH_SCHEME_PRIORITY,
-                            authPrefs);
+                    agent.getParams().setParameter(AuthPolicy.AUTH_SCHEME_PRIORITY, authPrefs);
                 }
 
             } else {
@@ -391,27 +643,31 @@ public abstract class AbstractHTTPSender {
 
     /**
      * Method used to copy all the common properties
-     *
-     * @param msgContext       - The messageContext of the request message
-     * @param url              - The target URL
-     * @param httpMethod       - The http method used to send the request
-     * @param httpClient       - The httpclient used to send the request
-     * @param soapActionString - The soap action atring of the request message
-     * @return MessageFormatter - The messageFormatter for the relavent request message
-     * @throws AxisFault - Thrown in case an exception occurs
+     * 
+     * @param msgContext
+     *            - The messageContext of the request message
+     * @param url
+     *            - The target URL
+     * @param httpMethod
+     *            - The http method used to send the request
+     * @param httpClient
+     *            - The httpclient used to send the request
+     * @param soapActionString
+     *            - The soap action atring of the request message
+     * @return MessageFormatter - The messageFormatter for the relavent request
+     *         message
+     * @throws AxisFault
+     *             - Thrown in case an exception occurs
      */
     protected MessageFormatter populateCommonProperties(MessageContext msgContext, URL url,
-                                                      HttpMethodBase httpMethod,
-                                                      HttpClient httpClient,
-                                                      String soapActionString)
+            HttpMethodBase httpMethod, HttpClient httpClient, String soapActionString)
             throws AxisFault {
 
         if (isAuthenticationEnabled(msgContext)) {
             httpMethod.setDoAuthentication(true);
         }
 
-        MessageFormatter messageFormatter = TransportUtils.getMessageFormatter(
-                msgContext);
+        MessageFormatter messageFormatter = TransportUtils.getMessageFormatter(msgContext);
 
         url = messageFormatter.getTargetAddress(msgContext, format, url);
 
@@ -420,8 +676,7 @@ public abstract class AbstractHTTPSender {
         httpMethod.setQueryString(url.getQuery());
 
         httpMethod.setRequestHeader(HTTPConstants.HEADER_CONTENT_TYPE,
-                                    messageFormatter.getContentType(msgContext, format,
-                                                                    soapActionString));
+                messageFormatter.getContentType(msgContext, format, soapActionString));
 
         httpMethod.setRequestHeader(HTTPConstants.HEADER_HOST, url.getHost());
 
@@ -443,31 +698,32 @@ public abstract class AbstractHTTPSender {
     }
 
     /**
-     * This is used to get the dynamically set time out values from the
-     * message context. If the values are not available or invalid then
-     * the default values or the values set by the configuration will be used
-     *
-     * @param msgContext the active MessageContext
+     * This is used to get the dynamically set time out values from the message
+     * context. If the values are not available or invalid then the default
+     * values or the values set by the configuration will be used
+     * 
+     * @param msgContext
+     *            the active MessageContext
      * @param httpClient
      */
     protected void initializeTimeouts(MessageContext msgContext, HttpClient httpClient) {
         // If the SO_TIMEOUT of CONNECTION_TIMEOUT is set by dynamically the
         // override the static config
-        Integer tempSoTimeoutProperty =
-                (Integer) msgContext.getProperty(HTTPConstants.SO_TIMEOUT);
-        Integer tempConnTimeoutProperty =
-                (Integer) msgContext
-                        .getProperty(HTTPConstants.CONNECTION_TIMEOUT);
+        Integer tempSoTimeoutProperty = (Integer) msgContext.getProperty(HTTPConstants.SO_TIMEOUT);
+        Integer tempConnTimeoutProperty = (Integer) msgContext
+                .getProperty(HTTPConstants.CONNECTION_TIMEOUT);
         long timeout = msgContext.getOptions().getTimeOutInMilliSeconds();
 
         if (tempConnTimeoutProperty != null) {
             int connectionTimeout = tempConnTimeoutProperty.intValue();
             // timeout for initial connection
-            httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(connectionTimeout);
+            httpClient.getHttpConnectionManager().getParams()
+                    .setConnectionTimeout(connectionTimeout);
         } else {
             // set timeout in client
             if (timeout > 0) {
-                httpClient.getHttpConnectionManager().getParams().setConnectionTimeout((int) timeout);
+                httpClient.getHttpConnectionManager().getParams()
+                        .setConnectionTimeout((int) timeout);
             }
         }
 
@@ -486,27 +742,26 @@ public abstract class AbstractHTTPSender {
     }
 
     /**
-     * This is used to get the dynamically set time out values from the
-     * message context. If the values are not available or invalid then
-     * the default values or the values set by the configuration will be used
-     *
-     * @param msgContext the active MessageContext
-     * @param httpMethod method
+     * This is used to get the dynamically set time out values from the message
+     * context. If the values are not available or invalid then the default
+     * values or the values set by the configuration will be used
+     * 
+     * @param msgContext
+     *            the active MessageContext
+     * @param httpMethod
+     *            method
      */
     protected void setTimeouts(MessageContext msgContext, HttpMethod httpMethod) {
         // If the SO_TIMEOUT of CONNECTION_TIMEOUT is set by dynamically the
         // override the static config
-        Integer tempSoTimeoutProperty =
-                (Integer) msgContext.getProperty(HTTPConstants.SO_TIMEOUT);
-        Integer tempConnTimeoutProperty =
-                (Integer) msgContext
-                        .getProperty(HTTPConstants.CONNECTION_TIMEOUT);
+        Integer tempSoTimeoutProperty = (Integer) msgContext.getProperty(HTTPConstants.SO_TIMEOUT);
+        Integer tempConnTimeoutProperty = (Integer) msgContext
+                .getProperty(HTTPConstants.CONNECTION_TIMEOUT);
         long timeout = msgContext.getOptions().getTimeOutInMilliSeconds();
 
         if (tempConnTimeoutProperty != null) {
             // timeout for initial connection
-            httpMethod.getParams().setParameter("http.connection.timeout",
-                    tempConnTimeoutProperty);
+            httpMethod.getParams().setParameter("http.connection.timeout", tempConnTimeoutProperty);
         }
 
         if (tempSoTimeoutProperty != null) {
@@ -520,15 +775,11 @@ public abstract class AbstractHTTPSender {
         }
     }
 
-    public void setFormat(OMOutputFormat format) {
-        this.format = format;
-    }
-
     protected HttpClient getHttpClient(MessageContext msgContext) {
         ConfigurationContext configContext = msgContext.getConfigurationContext();
 
-        HttpClient httpClient = (HttpClient) msgContext.getProperty(
-                HTTPConstants.CACHED_HTTP_CLIENT);
+        HttpClient httpClient = (HttpClient) msgContext
+                .getProperty(HTTPConstants.CACHED_HTTP_CLIENT);
 
         if (httpClient == null) {
             httpClient = (HttpClient) configContext.getProperty(HTTPConstants.CACHED_HTTP_CLIENT);
@@ -542,27 +793,25 @@ public abstract class AbstractHTTPSender {
             httpClient = (HttpClient) msgContext.getProperty(HTTPConstants.CACHED_HTTP_CLIENT);
 
             if (httpClient == null) {
-                httpClient = (HttpClient) configContext.getProperty(
-                        HTTPConstants.CACHED_HTTP_CLIENT);
+                httpClient = (HttpClient) configContext
+                        .getProperty(HTTPConstants.CACHED_HTTP_CLIENT);
             }
 
             if (httpClient != null) {
                 return httpClient;
             }
 
-            HttpConnectionManager connManager =
-                    (HttpConnectionManager) msgContext.getProperty(
-                            HTTPConstants.MULTITHREAD_HTTP_CONNECTION_MANAGER);
+            HttpConnectionManager connManager = (HttpConnectionManager) msgContext
+                    .getProperty(HTTPConstants.MULTITHREAD_HTTP_CONNECTION_MANAGER);
             if (connManager == null) {
-                connManager =
-                        (HttpConnectionManager) msgContext.getProperty(
-                                HTTPConstants.MUTTITHREAD_HTTP_CONNECTION_MANAGER);
+                connManager = (HttpConnectionManager) msgContext
+                        .getProperty(HTTPConstants.MULTITHREAD_HTTP_CONNECTION_MANAGER);
             }
             if (connManager == null) {
                 // reuse HttpConnectionManager
                 synchronized (configContext) {
-                    connManager = (HttpConnectionManager) configContext.getProperty(
-                            HTTPConstants.MULTITHREAD_HTTP_CONNECTION_MANAGER);
+                    connManager = (HttpConnectionManager) configContext
+                            .getProperty(HTTPConstants.MULTITHREAD_HTTP_CONNECTION_MANAGER);
                     if (connManager == null) {
                         log.trace("Making new ConnectionManager");
                         connManager = new MultiThreadedHttpConnectionManager();
@@ -572,12 +821,13 @@ public abstract class AbstractHTTPSender {
                 }
             }
             /*
-             * Create a new instance of HttpClient since the way
-             * it is used here it's not fully thread-safe.
+             * Create a new instance of HttpClient since the way it is used here
+             * it's not fully thread-safe.
              */
             httpClient = new HttpClient(connManager);
 
-            // Set the default timeout in case we have a connection pool starvation to 30sec
+            // Set the default timeout in case we have a connection pool
+            // starvation to 30sec
             httpClient.getParams().setConnectionManagerTimeout(30000);
 
             // Get the timeout values set in the runtime
@@ -588,7 +838,7 @@ public abstract class AbstractHTTPSender {
     }
 
     protected void executeMethod(HttpClient httpClient, MessageContext msgContext, URL url,
-                                 HttpMethod method) throws IOException {
+            HttpMethod method) throws IOException {
         HostConfiguration config = this.getHostConfiguration(httpClient, msgContext, url);
 
         // set the custom headers, if available
@@ -604,18 +854,18 @@ public abstract class AbstractHTTPSender {
             method.addRequestHeader(HTTPConstants.HEADER_CONTENT_ENCODING,
                     HTTPConstants.COMPRESSION_GZIP);
         }
-        
+
         if (msgContext.getProperty(HTTPConstants.HTTP_METHOD_PARAMS) != null) {
-            HttpMethodParams params = (HttpMethodParams)msgContext
+            HttpMethodParams params = (HttpMethodParams) msgContext
                     .getProperty(HTTPConstants.HTTP_METHOD_PARAMS);
             method.setParams(params);
         }
 
         String cookiePolicy = (String) msgContext.getProperty(HTTPConstants.COOKIE_POLICY);
         if (cookiePolicy != null) {
-            method.getParams().setCookiePolicy(cookiePolicy);   
+            method.getParams().setCookiePolicy(cookiePolicy);
         }
-        HttpState httpState = (HttpState)msgContext.getProperty(HTTPConstants.CACHED_HTTP_STATE);
+        HttpState httpState = (HttpState) msgContext.getProperty(HTTPConstants.CACHED_HTTP_STATE);
 
         setTimeouts(msgContext, method);
 
@@ -640,12 +890,12 @@ public abstract class AbstractHTTPSender {
                         method.addRequestHeader(header);
                     }
                 }
-    
+
             }
             if (httpHeadersObj instanceof Map) {
                 Map httpHeaders = (Map) httpHeadersObj;
                 for (Iterator iterator = httpHeaders.entrySet().iterator(); iterator.hasNext();) {
-                    Map.Entry entry  = (Map.Entry) iterator.next();
+                    Map.Entry entry = (Map.Entry) iterator.next();
                     String key = (String) entry.getKey();
                     String value = (String) entry.getValue();
                     if (HTTPConstants.HEADER_USER_AGENT.equals(key)) {
@@ -669,8 +919,8 @@ public abstract class AbstractHTTPSender {
 
                     boolean headerAdded = false;
                     for (Header header : headers) {
-                        if (header.getName() != null &&                                 
-                                header.getName().equals(((Map.Entry) headerEntry).getKey())) {
+                        if (header.getName() != null
+                                && header.getName().equals(((Map.Entry) headerEntry).getKey())) {
                             headerAdded = true;
                             break;
                         }
@@ -691,13 +941,15 @@ public abstract class AbstractHTTPSender {
 
     }
 
-
     /**
-     * Remove unwanted headers from the transport headers map of outgoing request. These are headers which
-     * should be dictated by the transport and not the user. We remove these as these may get
-     * copied from the request messages
-     *
-     * @param msgContext the Axis2 Message context from which these headers should be removed
+     * Remove unwanted headers from the transport headers map of outgoing
+     * request. These are headers which should be dictated by the transport and
+     * not the user. We remove these as these may get copied from the request
+     * messages
+     * 
+     * @param msgContext
+     *            the Axis2 Message context from which these headers should be
+     *            removed
      */
     private void removeUnwantedHeaders(MessageContext msgContext) {
         Map headers = (Map) msgContext.getProperty(MessageContext.TRANSPORT_HEADERS);
@@ -709,11 +961,11 @@ public abstract class AbstractHTTPSender {
         Iterator iter = headers.keySet().iterator();
         while (iter.hasNext()) {
             String headerName = (String) iter.next();
-            if (HTTP.CONN_DIRECTIVE.equalsIgnoreCase(headerName) ||
-                HTTP.TRANSFER_ENCODING.equalsIgnoreCase(headerName) ||
-                HTTP.DATE_HEADER.equalsIgnoreCase(headerName) ||
-                HTTP.CONTENT_TYPE.equalsIgnoreCase(headerName) ||
-                HTTP.CONTENT_LEN.equalsIgnoreCase(headerName)) {
+            if (HTTP.CONN_DIRECTIVE.equalsIgnoreCase(headerName)
+                    || HTTP.TRANSFER_ENCODING.equalsIgnoreCase(headerName)
+                    || HTTP.DATE_HEADER.equalsIgnoreCase(headerName)
+                    || HTTP.CONTENT_TYPE.equalsIgnoreCase(headerName)
+                    || HTTP.CONTENT_LEN.equalsIgnoreCase(headerName)) {
                 iter.remove();
             }
         }
@@ -723,8 +975,8 @@ public abstract class AbstractHTTPSender {
         String userAgentString = "Axis2";
         boolean locked = false;
         if (messageContext.getParameter(HTTPConstants.USER_AGENT) != null) {
-            OMElement userAgentElement =
-                    messageContext.getParameter(HTTPConstants.USER_AGENT).getParameterElement();
+            OMElement userAgentElement = messageContext.getParameter(HTTPConstants.USER_AGENT)
+                    .getParameterElement();
             userAgentString = userAgentElement.getText().trim();
             OMAttribute lockedAttribute = userAgentElement.getAttribute(new QName("locked"));
             if (lockedAttribute != null) {
@@ -742,5 +994,5 @@ public abstract class AbstractHTTPSender {
 
         return userAgentString;
     }
-    
+
 }
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HTTPTransportHeaders.java
similarity index 50%
copy from modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java
copy to modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HTTPTransportHeaders.java
index 81a3c6e..6f6deac 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HTTPTransportHeaders.java
@@ -17,35 +17,27 @@
  * under the License.
  */
 
-package org.apache.axis2.transport.http;
+package org.apache.axis2.transport.http.impl.httpclient3;
 
-import org.apache.commons.httpclient.methods.RequestEntity;
+import java.util.HashMap;
 
-import java.io.IOException;
-import java.io.OutputStream;
+import org.apache.axis2.transport.http.CommonsTransportHeaders;
+import org.apache.commons.httpclient.Header;
 
-public class RESTRequestEntity2 implements RequestEntity {
-    private String contentType;
-    private String postRequestBody;
+public class HTTPTransportHeaders extends CommonsTransportHeaders {
 
-    public RESTRequestEntity2(String postRequestBody, String contentType) {
-        this.postRequestBody = postRequestBody;
-        this.contentType = contentType;
-    }
+    private Header[] headers;
 
-    public void writeRequest(OutputStream output) throws IOException {
-        output.write(postRequestBody.getBytes());
-    }
+    public HTTPTransportHeaders(Header[] headers) {
+        this.headers = headers;
 
-    public long getContentLength() {
-        return this.postRequestBody.getBytes().length;
     }
 
-    public String getContentType() {
-        return this.contentType;
+    protected void init() {
+        setHeaderMap(new HashMap());
+        for (int i = 0; i < headers.length; i++) {
+            getHeaderMap().put(headers[i].getName(), headers[i].getValue());
+        }
     }
 
-    public boolean isRepeatable() {
-        return true;
-    }
 }
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HttpTransportPropertiesImpl.java b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HttpTransportPropertiesImpl.java
new file mode 100644
index 0000000..502611e
--- /dev/null
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HttpTransportPropertiesImpl.java
@@ -0,0 +1,90 @@
+/*
+ * 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.
+ */
+
+package org.apache.axis2.transport.http.impl.httpclient3;
+
+import org.apache.axis2.transport.http.HTTPAuthenticator;
+import org.apache.axis2.transport.http.HttpTransportProperties;
+import org.apache.commons.httpclient.HttpVersion;
+import org.apache.commons.httpclient.auth.AuthPolicy;
+import org.apache.commons.httpclient.auth.AuthScope;
+
+public class HttpTransportPropertiesImpl extends HttpTransportProperties {
+
+    protected HttpVersion httpVersion;
+
+    @Override
+    public void setHttpVersion(Object httpVerion) {
+        this.httpVersion = (HttpVersion) httpVerion;
+    }
+
+    @Override
+    public Object getHttpVersion() {
+        return this.httpVersion;
+    }
+
+    /*
+     * This class is responsible for holding all the necessary information
+     * needed for NTML, Digest and Basic Authentication. Authentication itself
+     * is handled by httpclient. User doesn't need to warry about what
+     * authentication mechanism it uses. Axis2 uses httpclinet's default
+     * authentication patterns.
+     */
+    public static class Authenticator extends HTTPAuthenticator {
+
+        /* port of the host that needed to be authenticated with */
+        private int port = AuthScope.ANY_PORT;
+        /* Realm for authentication scope */
+        private String realm = AuthScope.ANY_REALM;
+        /* Default Auth Schems */
+        public static final String NTLM = AuthPolicy.NTLM;
+        public static final String DIGEST = AuthPolicy.DIGEST;
+        public static final String BASIC = AuthPolicy.BASIC;
+
+        public int getPort() {
+            return port;
+        }
+
+        public void setPort(int port) {
+            this.port = port;
+        }
+
+        public String getRealm() {
+            return realm;
+        }
+
+        public void setRealm(String realm) {
+            this.realm = realm;
+        }
+
+        @Override
+        public Object getAuthPolicyPref(String scheme) {
+            if (BASIC.equals(scheme)) {
+                return AuthPolicy.BASIC;
+            } else if (NTLM.equals(scheme)) {
+                return AuthPolicy.NTLM;
+            } else if (DIGEST.equals(scheme)) {
+                return AuthPolicy.DIGEST;
+            }
+            return null;
+        }
+
+    }
+
+}
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/RESTRequestEntity2Impl.java
similarity index 56%
copy from modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java
copy to modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/RESTRequestEntity2Impl.java
index 81a3c6e..2ccf3c8 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/RESTRequestEntity2Impl.java
@@ -17,35 +17,19 @@
  * under the License.
  */
 
-package org.apache.axis2.transport.http;
+package org.apache.axis2.transport.http.impl.httpclient3;
 
+import org.apache.axis2.transport.http.RESTRequestEntity2;
 import org.apache.commons.httpclient.methods.RequestEntity;
 
-import java.io.IOException;
-import java.io.OutputStream;
+public class RESTRequestEntity2Impl extends RESTRequestEntity2 implements RequestEntity {
 
-public class RESTRequestEntity2 implements RequestEntity {
-    private String contentType;
-    private String postRequestBody;
-
-    public RESTRequestEntity2(String postRequestBody, String contentType) {
-        this.postRequestBody = postRequestBody;
-        this.contentType = contentType;
-    }
-
-    public void writeRequest(OutputStream output) throws IOException {
-        output.write(postRequestBody.getBytes());
-    }
-
-    public long getContentLength() {
-        return this.postRequestBody.getBytes().length;
+    public RESTRequestEntity2Impl(String postRequestBody, String contentType) {
+        super(postRequestBody, contentType);
     }
 
     public String getContentType() {
-        return this.contentType;
+        return getContentTypeAsString();
     }
 
-    public boolean isRepeatable() {
-        return true;
-    }
 }
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/RESTRequestEntityImpl.java
similarity index 56%
copy from modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java
copy to modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/RESTRequestEntityImpl.java
index 81a3c6e..387729a 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/RESTRequestEntityImpl.java
@@ -17,35 +17,23 @@
  * under the License.
  */
 
-package org.apache.axis2.transport.http;
+package org.apache.axis2.transport.http.impl.httpclient3;
 
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMOutputFormat;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.transport.http.RESTRequestEntity;
 import org.apache.commons.httpclient.methods.RequestEntity;
 
-import java.io.IOException;
-import java.io.OutputStream;
+public class RESTRequestEntityImpl extends RESTRequestEntity implements RequestEntity {
 
-public class RESTRequestEntity2 implements RequestEntity {
-    private String contentType;
-    private String postRequestBody;
-
-    public RESTRequestEntity2(String postRequestBody, String contentType) {
-        this.postRequestBody = postRequestBody;
-        this.contentType = contentType;
-    }
-
-    public void writeRequest(OutputStream output) throws IOException {
-        output.write(postRequestBody.getBytes());
-    }
-
-    public long getContentLength() {
-        return this.postRequestBody.getBytes().length;
+    public RESTRequestEntityImpl(OMElement element, boolean chunked, MessageContext msgCtxt,
+            String charSetEncoding, String soapActionString, OMOutputFormat format) {
+        super(element, chunked, msgCtxt, charSetEncoding, soapActionString, format);
     }
 
     public String getContentType() {
-        return this.contentType;
+        return getContentTypeAsString();
     }
 
-    public boolean isRepeatable() {
-        return true;
-    }
 }
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/util/HTTPProxyConfigurationUtil.java b/modules/transport/http/src/org/apache/axis2/transport/http/util/HTTPProxyConfigurationUtil.java
index a163450..dcd7b90 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/util/HTTPProxyConfigurationUtil.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/util/HTTPProxyConfigurationUtil.java
@@ -42,6 +42,7 @@ import java.util.StringTokenizer;
 /**
  * Contains utility functions used when configuring HTTP Proxy for HTTP Sender.
  */
+@Deprecated
 public class HTTPProxyConfigurationUtil {
     private static Log log = LogFactory.getLog(HTTPProxyConfigurationUtil.class);