diff --git a/BUILDING.txt b/BUILDING.txt
deleted file mode 100644
index cc22570..0000000
--- a/BUILDING.txt
+++ /dev/null
@@ -1,50 +0,0 @@
-Building HttpComponents AsyncClient 
-============================
-
-(1) Requisites
---------------
-JDK 1.6+ is required in order to compile and run HttpAsyncClient.
-
-HttpAsyncClient utilizes Maven as a distribution management and packaging tool.
-Version 3.0.3 or later is required. 
-
-Maven installation and configuration instructions can be found here:
-
-http://maven.apache.org/run-maven/index.html
-
-(2) Executing test cases
-
-Execute the following command in order to compile and test the components
-
-mvn test
-
-(3) Building packages 
-
-Execute the following command in order to build the JAR packages
-
-mvn package
-
-The resultant packages can be found in the target folders of their respective modules
-
-httpasyncclient/target/httpasyncclient-<VERSION>.jar
-httpasyncclient-cache/target/httpasyncclient-cache-<VERSION>.jar
-httpasyncclient-osgi/target/org.apache.httpcomponents.httpasyncclient_<VERSION>.jar
-
-where <VERSION> is the release version
-
-(4) Validating packages
-
-Check for binary compatibility with the previous version with:
-
-mvn clirr:check
-
-Check for proper license headers with:
-
-mvn apache-rat:check
-
-(5) Building documentation 
-
-Execute the following commands in order to generate Javadoc:
-
-mvn compile javadoc:aggregate
-
diff --git a/LICENSE.txt b/LICENSE.txt
deleted file mode 100644
index 2c41ec8..0000000
--- a/LICENSE.txt
+++ /dev/null
@@ -1,182 +0,0 @@
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-   
-This project contains annotations derived from JCIP-ANNOTATIONS
-Copyright (c) 2005 Brian Goetz and Tim Peierls.
-See http://www.jcip.net and the Creative Commons Attribution License 
-(http://creativecommons.org/licenses/by/2.5)
-
diff --git a/NOTICE.txt b/NOTICE.txt
deleted file mode 100644
index b2bc9c6..0000000
--- a/NOTICE.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-Apache HttpComponents AsyncClient
-Copyright 2010-2015 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
diff --git a/README.txt b/README.txt
index 6c0e096..2d1318c 100644
--- a/README.txt
+++ b/README.txt
@@ -1,71 +1,6 @@
 Apache HttpComponents AsyncClient
 ============================
 
-Welcome to the HttpAsyncClient component of the Apache HttpComponents project.
+HttpAsyncClient has moved to Apache HttpComponents Client project. 
 
-Building Instructions
----------------------
-
-For building from source instructions please refer to BUILDING.txt.
-
-Dependencies
-------------
-
-HttpAsyncClient main module requires Java 5.0 compatible runtime and
-depends on the following external libraries:
-
-* Apache HttpComponents HttpCore
-* Apache HttpComponents HttpCore NIO
-* Apache HttpComponents HttpClient
-* Apache Commons Logging
-* Apache Commons Codec
-
-(for detailed information on external dependencies please see pom.xml)
-
-Licensing
----------
-
-Apache HttpComponents AsyncClient is licensed under the Apache License 2.0.
-See the files called LICENSE.txt and NOTICE.txt for more information.
-
-Cryptographic Software Notice
------------------------------
-
-This distribution may include software that has been designed for use
-with cryptographic software. The country in which you currently reside
-may have restrictions on the import, possession, use, and/or re-export
-to another country, of encryption software. BEFORE using any encryption
-software, please check your country's laws, regulations and policies
-concerning the import, possession, or use, and re-export of encryption
-software, to see if this is permitted. See <http://www.wassenaar.org/>
-for more information.
-
-The U.S. Government Department of Commerce, Bureau of Industry and
-Security (BIS), has classified this software as Export Commodity
-Control Number (ECCN) 5D002.C.1, which includes information security
-software using or performing cryptographic functions with asymmetric
-algorithms. The form and manner of this Apache Software Foundation
-distribution makes it eligible for export under the License Exception
-ENC Technology Software Unrestricted (TSU) exception (see the BIS
-Export Administration Regulations, Section 740.13) for both object
-code and source code.
-
-The following provides more details on the included software that
-may be subject to export controls on cryptographic software:
-
-  Apache HttpComponents AsyncClient interfaces with the
-  Java Secure Socket Extension (JSSE) API to provide
-
-    - HTTPS support
-
-  Apache HttpComponents AsyncClient does not include any
-  implementation of JSSE.
-
-Contact
--------
-
-  o For general information visit the main project site at
-    http://hc.apache.org/
-
-  o For current status information visit the status page at
-    http://hc.apache.org/status.html
+As of version 5.0 it shares the same release cycle as classic HttpClient.  
diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt
deleted file mode 100644
index 55d2bfa..0000000
--- a/RELEASE_NOTES.txt
+++ /dev/null
@@ -1,333 +0,0 @@
-Release 4.1
--------------------
-
-This is the first stable (GA) release of HttpAsyncClient 4.1. Notable features and enhancements 
-included in 4.1 series are:
-
-* Support for pipelined request execution 
-
-* Support for the latest HTTP state management specification (RFC 6265). Please note that the old 
-cookie policy is still used by default for compatibility reasons. RFC 6265 compliant cookie 
-policies need to be explicitly configured by the user. Please also note that as of next feature 
-release support for Netscape draft, RFC 2109 and RFC 2965 cookie policies will be deprecated 
-and disabled by default. It is recommended to use RFC 6265 compliant policies for new applications 
-unless compatibility with RFC 2109 and RFC 2965 is required and to migrate existing applications 
-to the default cookie policy.
-
-* Enhanced, redesigned and rewritten default SSL hostname verifier with improved RFC 2818
-compliance
-
-* Default SSL hostname verifier and default cookie policy now validate certificate identity 
-and cookie domain of origin against the public suffix list maintained by Mozilla.org
-<https://publicsuffix.org/list>
-
-* Authentication cache thread-safety: authentication cache used by HttpClient is now thread-safe
-and can be shared by multiple threads in order to re-use authentication state for subsequent
-requests
-
-
-Changelog:
--------------------
-
-* [HTTPASYNC-90] Fixed SNI support.
-  Contributed by David <dblack at atlassian.com>
-
-* [HTTPASYNC-88] persistent connections can time out while kept alive in the pool
-  causing unexpected SocketTimeoutException
-  Contributed by Oleg Kalnichevski <olegk at apache.org>
-
-* [HTTPASYNC-86]: fixed a race condition upon connection lease from the connection pool:
-  in very rare  circumstances the main execution thread can get jammed for so long
-  that the I/O dispatch thread succeeds in completing the request and releasing the connection
-  while the main still is performing connection validation.
-  Contributed by Oleg Kalnichevski <olegk at apache.org>
-
-* Update Apache Commons Logging version from 1.1.3 to 1.2. 
-  Contributed by Gary Gregory <ggregory at apache.org>
-
-
-Release 4.1 BETA1
--------------------
-
-This is the first BETA release of HttpAsyncClient 4.1. Notable features and enhancements included
-in 4.1 series are:
-
-* Support for pipelined request execution 
-
-* Enhanced redesigned and rewritten default SSL hostname verifier with improved RFC 2818
-compliance
-
-* Default SSL hostname verifier and default cookie policy now validate certificate identity 
-and cookie domain of origin against the public suffix list maintained by Mozilla.org
-<https://publicsuffix.org/list>
-
-* Authentication cache thread-safety: authentication caches used by HttpAsyncClient is now 
-thread-safe and can be shared by multiple contexts in order to re-use authentication state for 
-subsequent requests
-
-
-Release 4.0.2
--------------------
-
-HttpAsyncClient 4.0.2 (GA) is a bug fix release that addresses several issues reported since 
-release 4.0.1. This release also upgrades HttpClient dependency to the latest stable version. 
-
-All users of HttpAsyncClient 4.0 are strongly advised to upgrade.
-
-Changelog
--------------------
-
-* [HTTPASYNC-79] Rearranged sequence of operations upon connection lease to eliminate possibility
-  of a connection leak due to race condition on keep-alive boundary
-  Contributed by Oleg Kalnichevski <olegk at apache.org>
-
-* Replaced dynamic proxies with custom proxy classes to reduce thread contention.
-  Contributed by Oleg Kalnichevski <olegk at apache.org>
-
-* [HTTPASYNC-73] Original request headers are not copied upon redirect
-  Contributed by Oleg Kalnichevski <olegk at apache.org>
-
-
-
-Release 4.0.1
--------------------
-
-This maintenance release fixes a number of bugs including incorrect OSGi bundle metadata
-found since release 4.0. This release also upgrades HttpCore and HttpClient dependencies to 
-the latest stable versions. 
-
-All users of HttpAsyncClient 4.0 are advised to upgrade.
-
-Changelog
--------------------
-
-* [HTTPASYNC-69] Premature cancellation of the response consumer to immediately shut down
-  and release the underlying connection.
-  Contributed by Oleg Kalnichevski <olegk at apache.org>
-
-* [HTTPASYNC-68] Connection closed by the opposite endpoint immediately upon its lease from
-  the pool is never released back and reclaimed by the pool (collection leak).
-  Contributed by Dmitry Potapov <potapov.d at gmail.com>
-
-* Persistent connections always get discarded in case of a response future cancellation
-  even if they can be kept alive.
-  Contributed by Oleg Kalnichevski <olegk at apache.org>
-
-* [HTTPASYNC-64] Race conditions in async caching module.
-  Contributed by Oleg Kalnichevski <olegk at apache.org>
-
-* [HTTPASYNC-65] Relaxed OSGi dependency import version ranges
-  Contributed by Christian Schneider <chris at die-schneider.net> 
-
-* [HTTPCLIENT-1446] NTLM proxy + BASIC target auth fails with 'Unexpected state:
-  MSG_TYPE3_GENERATED'.
-  Contributed by Oleg Kalnichevski <olegk at apache.org>
-
-* [HTTPASYNC-63] ConnectionShutdownException thrown in case of out-of-sequence response.
-  Contributed by Oleg Kalnichevski <olegk at apache.org>
-
-* [HTTPCLIENT-1442] Authentication header set by the user gets removed in case
-  of proxy authentication.
-  Contributed by Oleg Kalnichevski <olegk at apache.org>
-
-* [HTTPASYNC-60] Fixed incorrect OSGi Symbolic-BundleName.
-  Contributed by M. van Cuijk <mark at phedny.net>
-
-
-
-Release 4.0
--------------------
-
-This is the first stable (GA) release of Apache HttpAsyncClient 4.0. HttpAsyncClient is a library 
-for asynchronous client-side HTTP communication built on top of HttpCore NIO transport. 
-It is a complementary library to Apache HttpClient intended and optimized for special cases 
-whereby ability to scale to many thousands of concurrent connections is more important than 
-performance in terms of raw data throughput. 
-
-HttpAsyncClient 4.0 is designed to have similar APIs as Apache HttpClient 4.3 and a comparable
-feature set. In addition HttpAsyncClient provides full support for zero-copy file upload and 
-download operations. It presently does not support transparent content decompression and automatic 
-I/O error recovery. These features may be added in future releases.
-
-
-Changelog:
--------------------
-
-* [HTTPASYNC-56] Fixed thread deadlock in DefaultClientExchangeHandlerImpl.
-  Contributed by Oleg Kalnichevski <olegk at apache.org>
-
-* [HTTPASYNC-57] HTTPS request execution via a HTTP proxy can cause an infinite loop.
-  Contributed by Oleg Kalnichevski <olegk at apache.org>
-
-* [HTTPASYNC-52] Proxy configuration set at the request level does not apply.
-  Contributed by Oleg Kalnichevski <olegk at apache.org>
-
-* [HTTPASYNC-51] Request producers do not get correctly reset if the server responds early 
-  (out of sequence), which can cause entity enclosing requests to be malformed in case of 
-  re-execution.
-  Contributed by Oleg Kalnichevski <olegk at apache.org>
-
-* [HTTPASYNC-45] CachingHttpAsyncClient to override Future returned by the backend.
-  Contributed by James Leigh <james at 3roundstones dot com>
-
-
-Release 4.0 Beta 4
--------------------
-
-The 4.0 BETA4 release delivers significant performance improvements in request execution,
-especially for short HTTP messages, and also re-aligns programming interfaces used by the library 
-with HttpCore 4.3 and HttpClient 4.3 APIs. Configuration and preference APIs of HttpAsyncClient
-are now consistent with those used by HttpClient 4.3.
-
-Users of previous releases of HttpAsyncClient are advised to upgrade.
-
-Changelog:
-
-* [HTTPCLIENT-1353] 303 Redirects Should be Cacheable
-  Contributed by James Leigh <james at 3roundstones dot com>
-
-* Redesign of configuration and preference APIs. 
-  Contributed by Oleg Kalnichevski <olegk at apache.org>
-
-* Redesign of connection management APIs.
-  Contributed by Oleg Kalnichevski <olegk at apache.org>
-
-* [HTTPASYNC-34] HttpAsyncClient fails to re-start request execution if the opposite end 
-  prematurely terminates persistent connection. 
-  Contributed by Oleg Kalnichevski <olegk at apache.org>
-
-* [HTTPASYNC-28] PoolEntry's expiry information is never updated.
-  Contributed by Daniel Kulp <dkulp at apache.org>
-
-
-
-Release 4.0 Beta 3
--------------------
-
-The 4.0 BETA3 is a maintenance release that picks up the latest bug fixes in the core components.
-
-Changelog:
-
-* Upgraded HttpCore to version 4.2.2
-
-* [HTTPASYNC-26] OSGi bundle import fix.
-  Contributed by Daniel Kulp <dkulp at apache.org>
-
-* [HTTPASYNC-25] AsyncSchemeRegistry instance set in the execution context takes precedence over
-  the default one.
-  Contributed by Daniel Kulp <dkulp at apache.org> 
-
-* Ported fix for HTTPCLIENT-1224
-  Contributed by Oleg Kalnichevski <olegk at apache.org>
-
-
-Release 4.0 Beta 2
--------------------
-
-The 4.0 BETA2 release fixes a number of non-critical issues found since release 4.0-beta1 and 
-introduces basic support for HTTP/1.1 response caching. Please note that caching for streaming 
-HTTP exchanges is currently not supported.
-
-Users of previous releases of HttpAsyncClient are advised to upgrade.
-
-Changelog:
-
-* [HTTPASYNC-20] HTTP exchange can now be aborted with HttpUriRequest#abort().
-  Contributed by Oleg Kalnichevski <olegk at apache.org>
-
-* [HTTPASYNC-17] Caching HttpAsyncClient facade.
-  Contributed by Clinton Nielsen <clinton.h.nielsen at gmail.com>
-
-* [HTTPASYNC-19] Fixed incorrect execution of message exchanges that span across multiple hosts 
-  (for instance, in case of a request redirect).  
-  Contributed by Oleg Kalnichevski <olegk at apache.org>
-
-* [HTTPASYNC-18] Fixed thread deadlock that could occur in the DefaultAsyncRequestDirector 
-  in case of a runtime exception.
-  Contributed by Oleg Kalnichevski <olegk at apache.org>
-
-* [HTTPASYNC-15]: HttpAsyncClient hangs if connection leased from the pool gets immediately closed 
-  by the opposite endpoint.
-  Contributed by Oleg Kalnichevski <olegk at apache.org>
-
-
-Release 4.0 Beta 1
--------------------
-
-The 4.0 BETA1 release completes the application programming interface and the feature set 
-of HttpAsyncClient and upgrades to the latest versions of core and client components 
-(HttpCore 4.2-beta1 and HttpClient 4.2-beta1). As of this release HttpAsyncClient is expected
-to be API stable.
-
-Users of previous releases of HttpAsyncClient are advised to upgrade.
-
-Changelog:
-
-* [HTTPASYNC-11]: HttpAsyncClient fails to re-authenticate if connection is non-persistent.
-  Contributed by Oleg Kalnichevski <olegk at apache.org>
-
-* [HTTPASYNC-5]: Allow customized LineParser for asynchronous connections.
-  Contributed by Oleg Kalnichevski <olegk at apache.org>
-
-
-
-Release 4.0 Alpha 3
--------------------
-
-The 4.0 ALPHA3 release largely completes the application programming interface and feature set 
-of HttpAsyncClient. While the API may still change in the course of the ALPHA development phase, 
-this is expected to be the last round of major API changes and the API is expected to be reasonably
-stable as of this release.
-
-We are kindly asking actual and prospective users of HttpAsyncClient to review its API, evaluate
-its functionality and give us feedback while the 4.0 API is still not final. If no major flaws 
-are discovered the 4.0 API is expected to be frozen with the next BETA release. 
-
-Changelog:
-
-* [HTTPASYNC-6]: Fixed NPE in the DefaultAsyncRequestDirector#responseCompleted method.
-  Contributed by Oleg Kalnichevski <olegk at apache.org>
-
-
-Release 4.0 Alpha 2
--------------------
-
-The second ALPHA release of HttpAsyncClient 4.0 comes with a number of important improvements and
-enhancements. As of this version HttpAsyncClient fully supports HTTP state management (cookies) 
-and HTTP authentication (basic, digest, NTLM, spnego/kerberos). Connection management classes have 
-been thoroughly reworked and improved. This version also improves support for zero copy file 
-upload / download operations.
-
-The HttpAsyncClient 4.0 API is still considered experimental and is expected to change 
-in the course of the ALPHA development phase.
-
-Please note that currently HttpAsyncClient DOES NOT support
-
-* Stateful HTTP connections
-
-
-Changelog:
-
-* [HTTPASYNC-3]: Fixed incorrect handling of expired I/O sessions by SessionPool.
-  Contributed by Oleg Kalnichevski <olegk at apache.org>
-
-
-Release 4.0 Alpha 1
--------------------
-
-HttpAsyncClient is a library for asynchronous client-side HTTP communication built on HttpCore NIO
-and HttpClient components.
-
-HttpAsyncClient is NOT meant to replace or supersede Apache HttpClient. It is a complementary
-library to Apache HttpClient intended for special cases where ability to handle a great number of
-concurrent connections is more important than performance in terms of a raw data throughput or
-for those users who prefer event-driven APIs.
-
-The HttpAsyncClient 4.0 API is still very experimental and is expected to change in the course
-of the ALPHA development phase.
-
-Please note that currently HttpAsyncClient DOES NOT support
-
-* HTTP state management (cookies)
-* HTTP authentication
-* Stateful HTTP connections
diff --git a/doap_HttpComponents_AsyncClient.rdf b/doap_HttpComponents_AsyncClient.rdf
deleted file mode 100644
index ea0c3b3..0000000
--- a/doap_HttpComponents_AsyncClient.rdf
+++ /dev/null
@@ -1,128 +0,0 @@
-<?xml version="1.0"?>
-<?xml-stylesheet type="text/xsl"?>
-<rdf:RDF xml:lang="en"
-         xmlns="http://usefulinc.com/ns/doap#"
-         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-         xmlns:asfext="http://projects.apache.org/ns/asfext#"
-         xmlns:foaf="http://xmlns.com/foaf/0.1/">
-<!--
-   ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one
-   or more contributor license agreements.  See the NOTICE file
-   distributed with this work for additional information
-   regarding copyright ownership.  The ASF licenses this file
-   to you under the Apache License, Version 2.0 (the
-   "License"); you may not use this file except in compliance
-   with the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing,
-   software distributed under the License is distributed on an
-   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-   KIND, either express or implied.  See the License for the
-   specific language governing permissions and limitations
-   under the License.
-   ====================================================================
-
-   This software consists of voluntary contributions made by many
-   individuals on behalf of the Apache Software Foundation.  For more
-   information on the Apache Software Foundation, please see
-   <http://www.apache.org />.
--->
-
-  <Project rdf:about="http://hc.apache.org/httpcomponents-asyncclient/">
-    <created>2007-11-15</created>
-    <license rdf:resource="http://usefulinc.com/doap/licenses/asl20" />
-    <name>Apache HttpComponents AsyncClient</name>
-    <homepage rdf:resource="http://hc.apache.org/httpcomponents-asyncclient/" />
-    <asfext:pmc rdf:resource="http://httpcomponents.apache.org" />
-    <shortdesc>
-Java library implementing an asynchronous HTTP client based on HttpCore NIO and HttpClient
-components.
-    </shortdesc>
-    <description>
-HttpAsyncClient is a library for asynchronous client-side HTTP communication built on HttpCore NIO
-and HttpClient components. It is a complementary library to Apache HttpClient for special cases
-where ability to handle a great number of concurrent connections is more important than
-performance in terms of a raw data throughput.
-    </description>
-    <bug-database rdf:resource="http://issues.apache.org/jira/browse/HTTPASYNC" />
-    <mailing-list rdf:resource="http://httpcomponents.apache.org/mail-lists.html" />
-    <download-page rdf:resource="http://httpcomponents.apache.org/downloads.cgi" />
-    <programming-language>Java</programming-language>
-    <category rdf:resource="http://projects.apache.org/category/http" />
-    <category rdf:resource="http://projects.apache.org/category/library" />
-    <category rdf:resource="http://projects.apache.org/category/network-client" />
-
-    <!-- multiple releases can be listed, each in it's own section -->
-    <release>
-      <Version>
-        <name>httpcomponents-asyncclient-4.0-alpha1</name>
-        <created>2011-01-18</created>
-        <revision>4.0-alpha1</revision>
-      </Version>
-      <Version>
-        <name>httpcomponents-asyncclient-4.0-alpha2</name>
-        <created>2011-05-24</created>
-        <revision>4.0-alpha2</revision>
-      </Version>
-      <Version>
-        <name>httpcomponents-asyncclient-4.0-alpha3</name>
-        <created>2011-09-29</created>
-        <revision>4.0-alpha3</revision>
-      </Version>
-    </release>
-
-    <repository>
-      <SVNRepository>
-        <location rdf:resource="http://svn.apache.org/repos/asf/httpcomponents/httpasyncclient/trunk"/>
-        <browse rdf:resource="http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk"/>
-      </SVNRepository>
-    </repository>
-
-    <asfext:implements><asfext:Standard>
-      <asfext:title>Hypertext Transfer Protocol -- HTTP/1.1</asfext:title>
-      <asfext:body>IETF</asfext:body>
-      <asfext:id>RFC 2616</asfext:id>
-      <asfext:url rdf:resource="http://tools.ietf.org/html/rfc2616"/>
-    </asfext:Standard></asfext:implements>
-    <asfext:implements><asfext:Standard>
-      <asfext:title>Hypertext Transfer Protocol -- HTTP/1.0</asfext:title>
-      <asfext:body>IETF</asfext:body>
-      <asfext:id>RFC 1945</asfext:id>
-      <asfext:url rdf:resource="http://tools.ietf.org/html/rfc1945"/>
-    </asfext:Standard></asfext:implements>
-    <asfext:implements><asfext:Standard>
-      <asfext:title>Upgrading to TLS Within HTTP/1.1</asfext:title>
-      <asfext:body>IETF</asfext:body>
-      <asfext:id>RFC 2817</asfext:id>
-      <asfext:url rdf:resource="http://tools.ietf.org/html/rfc2817"/>
-    </asfext:Standard></asfext:implements>
-    <asfext:implements><asfext:Standard>
-      <asfext:title>HTTP Over TLS</asfext:title>
-      <asfext:body>IETF</asfext:body>
-      <asfext:id>RFC 2818</asfext:id>
-      <asfext:url rdf:resource="http://tools.ietf.org/html/rfc2818"/>
-    </asfext:Standard></asfext:implements>
-    <asfext:implements><asfext:Standard>
-      <asfext:title>HTTP Authentication: Basic and Digest Access Authentication</asfext:title>
-      <asfext:body>IETF</asfext:body>
-      <asfext:id>RFC 2617</asfext:id>
-      <asfext:url rdf:resource="http://tools.ietf.org/html/rfc2617"/>
-    </asfext:Standard></asfext:implements>
-    <asfext:implements><asfext:Standard>
-      <asfext:title>HTTP State Management Mechanism (Cookies)</asfext:title>
-      <asfext:body>IETF</asfext:body>
-      <asfext:id>RFC 2109</asfext:id>
-      <asfext:url rdf:resource="http://tools.ietf.org/html/rfc2109"/>
-    </asfext:Standard></asfext:implements>
-    <asfext:implements><asfext:Standard>
-      <asfext:title>HTTP State Management Mechanism (Cookie2)</asfext:title>
-      <asfext:body>IETF</asfext:body>
-      <asfext:id>RFC 2965</asfext:id>
-      <asfext:url rdf:resource="http://tools.ietf.org/html/rfc2965"/>
-    </asfext:Standard></asfext:implements>
-
-  </Project>
-</rdf:RDF>
diff --git a/httpasyncclient-cache/pom.xml b/httpasyncclient-cache/pom.xml
deleted file mode 100644
index 8574841..0000000
--- a/httpasyncclient-cache/pom.xml
+++ /dev/null
@@ -1,165 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one
-   or more contributor license agreements.  See the NOTICE file
-   distributed with this work for additional information
-   regarding copyright ownership.  The ASF licenses this file
-   to you under the Apache License, Version 2.0 (the
-   "License"); you may not use this file except in compliance
-   with the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing,
-   software distributed under the License is distributed on an
-   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-   KIND, either express or implied.  See the License for the
-   specific language governing permissions and limitations
-   under the License.
-   ====================================================================
-
-   This software consists of voluntary contributions made by many
-   individuals on behalf of the Apache Software Foundation.  For more
-   information on the Apache Software Foundation, please see
-   <http://www.apache.org />.
- --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.apache.httpcomponents</groupId>
-    <artifactId>httpcomponents-asyncclient</artifactId>
-    <version>4.2-alpha1-SNAPSHOT</version>
-  </parent>
-  <artifactId>httpasyncclient-cache</artifactId>
-  <name>Apache HttpAsyncClient Cache</name>
-  <description>
-   Apache HttpComponents AsyncClient Cache
-  </description>
-  <url>http://hc.apache.org/httpcomponents-asyncclient</url>
-  <packaging>jar</packaging>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpasyncclient</artifactId>
-      <version>${project.version}</version>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpclient-cache</artifactId>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpclient-cache</artifactId>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-core</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.easymock</groupId>
-      <artifactId>easymock</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.easymock</groupId>
-      <artifactId>easymockclassextension</artifactId>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.rat</groupId>
-        <artifactId>apache-rat-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>verify</phase>
-            <goals>
-              <goal>check</goal>
-            </goals>
-          </execution>
-        </executions>
-        <configuration>
-          <excludes>
-            <exclude>.externalToolBuilders/**</exclude>			
-            <exclude>.pmd</exclude>
-            <exclude>maven-eclipse.xml</exclude>
-          </excludes>
-        </configuration>
-      </plugin>	
-    </plugins>
-    <resources>
-      <resource>
-        <directory>src/main/resources</directory>
-        <filtering>true</filtering>
-        <includes>
-          <include>**/*.properties</include>
-        </includes>
-      </resource>
-    </resources>
-  </build>
-
-  <reporting>
-    <plugins>
-
-      <plugin>
-        <artifactId>maven-javadoc-plugin</artifactId>
-        <version>${hc.javadoc.version}</version>
-        <configuration>
-          <source>${maven.compiler.source}</source>
-          <links>
-            <link>http://download.oracle.com/javase/1.5.0/docs/api/</link>
-            <link>http://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/</link>
-            <link>http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/</link>
-          </links>
-        </configuration>
-        <reportSets>
-          <reportSet>
-            <reports>
-              <report>javadoc</report>
-            </reports>
-          </reportSet>
-        </reportSets>
-      </plugin>
-
-      <plugin>
-        <artifactId>maven-project-info-reports-plugin</artifactId>
-        <version>${hc.project-info.version}</version>
-        <inherited>false</inherited>
-        <reportSets>
-          <reportSet>
-            <reports>
-              <report>dependencies</report>
-              <report>dependency-info</report>
-              <report>summary</report>
-            </reports>
-          </reportSet>
-        </reportSets>
-      </plugin>
-
-      <plugin>
-        <artifactId>maven-jxr-plugin</artifactId>
-        <version>${hc.jxr.version}</version>
-      </plugin>
-
-      <plugin>
-        <artifactId>maven-surefire-report-plugin</artifactId>
-        <version>${hc.surefire-report.version}</version>
-      </plugin>
-
-    </plugins>
-  </reporting>
-
-</project>
diff --git a/httpasyncclient-cache/src/main/java/org/apache/http/impl/client/cache/AsynchronousAsyncValidationRequest.java b/httpasyncclient-cache/src/main/java/org/apache/http/impl/client/cache/AsynchronousAsyncValidationRequest.java
deleted file mode 100644
index 692440f..0000000
--- a/httpasyncclient-cache/src/main/java/org/apache/http/impl/client/cache/AsynchronousAsyncValidationRequest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.client.cache;
-
-import java.util.concurrent.ExecutionException;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpResponse;
-import org.apache.http.ProtocolException;
-import org.apache.http.client.cache.HttpCacheContext;
-import org.apache.http.client.cache.HttpCacheEntry;
-import org.apache.http.client.methods.HttpRequestWrapper;
-import org.apache.http.concurrent.BasicFuture;
-import org.apache.http.concurrent.FutureCallback;
-
-/**
- * Class used to represent an asynchronous revalidation event, such as with
- * "stale-while-revalidate"
- */
-class AsynchronousAsyncValidationRequest implements Runnable {
-    private final AsynchronousAsyncValidator parent;
-    private final CachingHttpAsyncClient cachingAsyncClient;
-    private final HttpHost target;
-    private final HttpRequestWrapper request;
-    private final HttpCacheContext clientContext;
-    private final HttpCacheEntry cacheEntry;
-    private final String identifier;
-
-    private final Log log = LogFactory.getLog(getClass());
-
-    /**
-     * Used internally by {@link AsynchronousValidator} to schedule a
-     * revalidation.
-     */
-    AsynchronousAsyncValidationRequest(final AsynchronousAsyncValidator parent,
-            final CachingHttpAsyncClient cachingClient, final HttpHost target, final HttpRequestWrapper request,
-            final HttpCacheContext clientContext, final HttpCacheEntry cacheEntry, final String identifier) {
-        this.parent = parent;
-        this.cachingAsyncClient = cachingClient;
-        this.target = target;
-        this.request = request;
-        this.clientContext = clientContext;
-        this.cacheEntry = cacheEntry;
-        this.identifier = identifier;
-    }
-
-    @Override
-    public void run() {
-        try {
-            final FutureCallback<HttpResponse> callback = new FutureCallback<HttpResponse>() {
-
-                @Override
-                public void cancelled() {
-                }
-
-                @Override
-                public void completed(final HttpResponse httpResponse) {
-                }
-
-                @Override
-                public void failed(final Exception e) {
-                    log.debug("Asynchronous revalidation failed", e);
-                }
-            };
-            final BasicFuture<HttpResponse> future = new BasicFuture<HttpResponse>(callback);
-            this.cachingAsyncClient.revalidateCacheEntry(future, this.target, this.request,
-                    this.clientContext, this.cacheEntry);
-            future.get();
-        } catch (final ProtocolException pe) {
-            this.log.error("ProtocolException thrown during asynchronous revalidation", pe);
-        } catch (final ExecutionException e) {
-            this.log.error("Exception thrown during asynchronous revalidation", e.getCause());
-        } catch (final InterruptedException e) {
-            Thread.currentThread().interrupt();
-        } finally {
-            this.parent.markComplete(this.identifier);
-        }
-    }
-
-    String getIdentifier() {
-        return this.identifier;
-    }
-
-}
diff --git a/httpasyncclient-cache/src/main/java/org/apache/http/impl/client/cache/AsynchronousAsyncValidator.java b/httpasyncclient-cache/src/main/java/org/apache/http/impl/client/cache/AsynchronousAsyncValidator.java
deleted file mode 100644
index 0d95fe2..0000000
--- a/httpasyncclient-cache/src/main/java/org/apache/http/impl/client/cache/AsynchronousAsyncValidator.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.client.cache;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.RejectedExecutionException;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.http.HttpHost;
-import org.apache.http.client.cache.HttpCacheContext;
-import org.apache.http.client.cache.HttpCacheEntry;
-import org.apache.http.client.methods.HttpRequestWrapper;
-
-/**
- * Class used for asynchronous revalidations to be used when the "stale-
- * while-revalidate" directive is present
- */
-class AsynchronousAsyncValidator {
-    private final CachingHttpAsyncClient cachingAsyncClient;
-    private final ExecutorService executor;
-    private final Set<String> queued;
-    private final CacheKeyGenerator cacheKeyGenerator;
-
-    private final Log log = LogFactory.getLog(getClass());
-
-    /**
-     * Create AsynchronousValidator which will make revalidation requests using
-     * the supplied {@link CachingHttpAsyncClient}, and a {@link ThreadPoolExecutor}
-     * generated according to the thread pool settings provided in the given
-     * {@link CacheConfig}.
-     *
-     * @param cachingClient
-     *            used to execute asynchronous requests
-     * @param config
-     *            specifies thread pool settings. See
-     *            {@link CacheConfig#getAsynchronousWorkersMax()},
-     *            {@link CacheConfig#getAsynchronousWorkersCore()},
-     *            {@link CacheConfig#getAsynchronousWorkerIdleLifetimeSecs()},
-     *            and {@link CacheConfig#getRevalidationQueueSize()}.
-     */
-    public AsynchronousAsyncValidator(final CachingHttpAsyncClient cachingClient, final CacheConfig config) {
-        this(cachingClient, new ThreadPoolExecutor(config.getAsynchronousWorkersCore(),
-                config.getAsynchronousWorkersMax(), config.getAsynchronousWorkerIdleLifetimeSecs(),
-                TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(
-                        config.getRevalidationQueueSize())));
-    }
-
-    /**
-     * Create AsynchronousValidator which will make revalidation requests using
-     * the supplied {@link CachingHttpAsyncClient} and {@link ExecutorService}.
-     *
-     * @param cachingClient
-     *            used to execute asynchronous requests
-     * @param executor
-     *            used to manage a thread pool of revalidation workers
-     */
-    AsynchronousAsyncValidator(final CachingHttpAsyncClient cachingClient, final ExecutorService executor) {
-        this.cachingAsyncClient = cachingClient;
-        this.executor = executor;
-        this.queued = new HashSet<String>();
-        this.cacheKeyGenerator = new CacheKeyGenerator();
-    }
-
-    /**
-     * Schedules an asynchronous revalidation
-     */
-    public synchronized void revalidateCacheEntry(final HttpHost target, final HttpRequestWrapper request,
-            final HttpCacheContext clientContext, final HttpCacheEntry entry) {
-        // getVariantURI will fall back on getURI if no variants exist
-        final String uri = this.cacheKeyGenerator.getVariantURI(target, request, entry);
-
-        if (!this.queued.contains(uri)) {
-            final AsynchronousAsyncValidationRequest asyncRevalidationRequest = new AsynchronousAsyncValidationRequest(
-                    this, this.cachingAsyncClient, target, request, clientContext, entry, uri);
-
-            try {
-                this.executor.execute(asyncRevalidationRequest);
-                this.queued.add(uri);
-            } catch (final RejectedExecutionException ree) {
-                this.log.debug("Revalidation for [" + uri + "] not scheduled: " + ree);
-            }
-        }
-    }
-
-    /**
-     * Removes an identifier from the internal list of revalidation jobs in
-     * progress. This is meant to be called by
-     * {@link AsynchronousValidationRequest#run()} once the revalidation is
-     * complete, using the identifier passed in during constructions.
-     */
-    synchronized void markComplete(final String identifier) {
-        this.queued.remove(identifier);
-    }
-
-    Set<String> getScheduledIdentifiers() {
-        return Collections.unmodifiableSet(this.queued);
-    }
-
-    ExecutorService getExecutor() {
-        return this.executor;
-    }
-
-}
diff --git a/httpasyncclient-cache/src/main/java/org/apache/http/impl/client/cache/CachingHttpAsyncClient.java b/httpasyncclient-cache/src/main/java/org/apache/http/impl/client/cache/CachingHttpAsyncClient.java
deleted file mode 100644
index 576c0b8..0000000
--- a/httpasyncclient-cache/src/main/java/org/apache/http/impl/client/cache/CachingHttpAsyncClient.java
+++ /dev/null
@@ -1,1012 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.client.cache;
-
-import java.io.IOException;
-import java.net.URI;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.Future;
-import java.util.concurrent.atomic.AtomicLong;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.http.Header;
-import org.apache.http.HeaderElement;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpMessage;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.HttpVersion;
-import org.apache.http.ProtocolException;
-import org.apache.http.ProtocolVersion;
-import org.apache.http.RequestLine;
-import org.apache.http.annotation.ThreadSafe;
-import org.apache.http.client.ClientProtocolException;
-import org.apache.http.client.cache.CacheResponseStatus;
-import org.apache.http.client.cache.HeaderConstants;
-import org.apache.http.client.cache.HttpCacheContext;
-import org.apache.http.client.cache.HttpCacheEntry;
-import org.apache.http.client.cache.HttpCacheStorage;
-import org.apache.http.client.cache.ResourceFactory;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpRequestWrapper;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.client.utils.DateUtils;
-import org.apache.http.concurrent.BasicFuture;
-import org.apache.http.concurrent.FutureCallback;
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.impl.nio.client.HttpAsyncClients;
-import org.apache.http.message.BasicHttpResponse;
-import org.apache.http.nio.client.HttpAsyncClient;
-import org.apache.http.nio.protocol.HttpAsyncRequestProducer;
-import org.apache.http.nio.protocol.HttpAsyncResponseConsumer;
-import org.apache.http.nio.reactor.IOReactorException;
-import org.apache.http.protocol.HTTP;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.protocol.HttpCoreContext;
-import org.apache.http.util.Args;
-import org.apache.http.util.EntityUtils;
-import org.apache.http.util.VersionInfo;
-
-@ThreadSafe // So long as the responseCache implementation is threadsafe
-public class CachingHttpAsyncClient implements HttpAsyncClient {
-
-    private final static boolean SUPPORTS_RANGE_AND_CONTENT_RANGE_HEADERS = false;
-
-    private final AtomicLong cacheHits = new AtomicLong();
-    private final AtomicLong cacheMisses = new AtomicLong();
-    private final AtomicLong cacheUpdates = new AtomicLong();
-
-    private final Map<ProtocolVersion, String> viaHeaders = new HashMap<ProtocolVersion, String>(4);
-
-    private final HttpAsyncClient backend;
-    private final HttpCache responseCache;
-    private final CacheValidityPolicy validityPolicy;
-    private final ResponseCachingPolicy responseCachingPolicy;
-    private final CachedHttpResponseGenerator responseGenerator;
-    private final CacheableRequestPolicy cacheableRequestPolicy;
-    private final CachedResponseSuitabilityChecker suitabilityChecker;
-
-    private final ConditionalRequestBuilder conditionalRequestBuilder;
-
-    private final long maxObjectSizeBytes;
-    private final boolean sharedCache;
-
-    private final ResponseProtocolCompliance responseCompliance;
-    private final RequestProtocolCompliance requestCompliance;
-
-    private final AsynchronousAsyncValidator asynchAsyncRevalidator;
-
-    private final Log log = LogFactory.getLog(getClass());
-
-    CachingHttpAsyncClient(
-            final HttpAsyncClient client,
-            final HttpCache cache,
-            final CacheConfig config) {
-        super();
-        Args.notNull(client, "HttpClient");
-        Args.notNull(cache, "HttpCache");
-        Args.notNull(config, "CacheConfig");
-        this.maxObjectSizeBytes = config.getMaxObjectSize();
-        this.sharedCache = config.isSharedCache();
-        this.backend = client;
-        this.responseCache = cache;
-        this.validityPolicy = new CacheValidityPolicy();
-        this.responseCachingPolicy = new ResponseCachingPolicy(this.maxObjectSizeBytes, this.sharedCache, false, config.is303CachingEnabled());
-        this.responseGenerator = new CachedHttpResponseGenerator(this.validityPolicy);
-        this.cacheableRequestPolicy = new CacheableRequestPolicy();
-        this.suitabilityChecker = new CachedResponseSuitabilityChecker(this.validityPolicy, config);
-        this.conditionalRequestBuilder = new ConditionalRequestBuilder();
-
-        this.responseCompliance = new ResponseProtocolCompliance();
-        this.requestCompliance = new RequestProtocolCompliance(config.isWeakETagOnPutDeleteAllowed());
-
-        this.asynchAsyncRevalidator = makeAsynchronousValidator(config);
-    }
-
-    public CachingHttpAsyncClient() throws IOReactorException {
-        this(HttpAsyncClients.createDefault(),
-                new BasicHttpCache(),
-                CacheConfig.DEFAULT);
-    }
-
-    public CachingHttpAsyncClient(final CacheConfig config) throws IOReactorException {
-        this(HttpAsyncClients.createDefault(),
-                new BasicHttpCache(config),
-                config);
-    }
-
-    public CachingHttpAsyncClient(final HttpAsyncClient client) {
-        this(client,
-                new BasicHttpCache(),
-                CacheConfig.DEFAULT);
-    }
-
-    public CachingHttpAsyncClient(final HttpAsyncClient client, final CacheConfig config) {
-        this(client,
-                new BasicHttpCache(config),
-                config);
-    }
-
-    public CachingHttpAsyncClient(
-            final HttpAsyncClient client,
-            final ResourceFactory resourceFactory,
-            final HttpCacheStorage storage,
-            final CacheConfig config) {
-        this(client,
-                new BasicHttpCache(resourceFactory, storage, config),
-                config);
-    }
-
-    public CachingHttpAsyncClient(
-            final HttpAsyncClient client,
-            final HttpCacheStorage storage,
-            final CacheConfig config) {
-        this(client,
-                new BasicHttpCache(new HeapResourceFactory(), storage, config),
-                config);
-    }
-
-    CachingHttpAsyncClient(
-            final HttpAsyncClient backend,
-            final CacheValidityPolicy validityPolicy,
-            final ResponseCachingPolicy responseCachingPolicy,
-            final HttpCache responseCache,
-            final CachedHttpResponseGenerator responseGenerator,
-            final CacheableRequestPolicy cacheableRequestPolicy,
-            final CachedResponseSuitabilityChecker suitabilityChecker,
-            final ConditionalRequestBuilder conditionalRequestBuilder,
-            final ResponseProtocolCompliance responseCompliance,
-            final RequestProtocolCompliance requestCompliance) {
-        final CacheConfig config = CacheConfig.DEFAULT;
-        this.maxObjectSizeBytes = config.getMaxObjectSize();
-        this.sharedCache = config.isSharedCache();
-        this.backend = backend;
-        this.validityPolicy = validityPolicy;
-        this.responseCachingPolicy = responseCachingPolicy;
-        this.responseCache = responseCache;
-        this.responseGenerator = responseGenerator;
-        this.cacheableRequestPolicy = cacheableRequestPolicy;
-        this.suitabilityChecker = suitabilityChecker;
-        this.conditionalRequestBuilder = conditionalRequestBuilder;
-        this.responseCompliance = responseCompliance;
-        this.requestCompliance = requestCompliance;
-        this.asynchAsyncRevalidator = makeAsynchronousValidator(config);
-    }
-
-    private AsynchronousAsyncValidator makeAsynchronousValidator(
-            final CacheConfig config) {
-        if (config.getAsynchronousWorkersMax() > 0) {
-            return new AsynchronousAsyncValidator(this, config);
-        }
-        return null;
-    }
-
-    /**
-     * Reports the number of times that the cache successfully responded
-     * to an {@link HttpRequest} without contacting the origin server.
-     * @return the number of cache hits
-     */
-    public long getCacheHits() {
-        return this.cacheHits.get();
-    }
-
-    /**
-     * Reports the number of times that the cache contacted the origin
-     * server because it had no appropriate response cached.
-     * @return the number of cache misses
-     */
-    public long getCacheMisses() {
-        return this.cacheMisses.get();
-    }
-
-    /**
-     * Reports the number of times that the cache was able to satisfy
-     * a response by revalidating an existing but stale cache entry.
-     * @return the number of cache revalidations
-     */
-    public long getCacheUpdates() {
-        return this.cacheUpdates.get();
-    }
-
-    @Override
-    public Future<HttpResponse> execute(
-            final HttpHost target,
-            final HttpRequest request,
-            final FutureCallback<HttpResponse> callback) {
-        return execute(target, request, null, callback);
-    }
-
-    @Override
-    public <T> Future<T> execute(
-            final HttpAsyncRequestProducer requestProducer,
-            final HttpAsyncResponseConsumer<T> responseConsumer,
-            final FutureCallback<T> callback) {
-        return execute(requestProducer, responseConsumer, null, callback);
-    }
-
-    @Override
-    public <T> Future<T> execute(
-            final HttpAsyncRequestProducer requestProducer,
-            final HttpAsyncResponseConsumer<T> responseConsumer,
-            final HttpContext context,
-            final FutureCallback<T> callback) {
-        this.log.warn("CachingHttpAsyncClient does not support caching for streaming HTTP exchanges");
-        return this.backend.execute(requestProducer, responseConsumer, context, callback);
-    }
-
-    @Override
-    public Future<HttpResponse> execute(
-            final HttpUriRequest request,
-            final FutureCallback<HttpResponse> callback) {
-        return execute(request, null, callback);
-    }
-
-    @Override
-    public Future<HttpResponse> execute(
-            final HttpUriRequest request,
-            final HttpContext context,
-            final FutureCallback<HttpResponse> callback) {
-        final URI uri = request.getURI();
-        final HttpHost httpHost = new HttpHost(uri.getHost(), uri.getPort(), uri.getScheme());
-        return execute(httpHost, request, context, callback);
-    }
-
-    @Override
-    public Future<HttpResponse> execute(
-            final HttpHost target,
-            final HttpRequest originalRequest,
-            final HttpContext context,
-            final FutureCallback<HttpResponse> futureCallback) {
-        final BasicFuture<HttpResponse> future = new BasicFuture<HttpResponse>(futureCallback);
-        final HttpRequestWrapper request = HttpRequestWrapper.wrap(originalRequest);
-        final HttpCacheContext clientContext = HttpCacheContext.adapt(context);
-        // default response context
-        setResponseStatus(clientContext, CacheResponseStatus.CACHE_MISS);
-
-        final String via = generateViaHeader(request);
-
-        if (clientRequestsOurOptions(request)) {
-            setResponseStatus(clientContext, CacheResponseStatus.CACHE_MODULE_RESPONSE);
-            future.completed(new OptionsHttp11Response());
-            return future;
-        }
-
-        final HttpResponse fatalErrorResponse = getFatallyNoncompliantResponse(
-                request, clientContext);
-        if (fatalErrorResponse != null) {
-            future.completed(fatalErrorResponse);
-            return future;
-        }
-
-        try {
-            this.requestCompliance.makeRequestCompliant(request);
-        } catch (final ClientProtocolException e) {
-            future.failed(e);
-            return future;
-        }
-        request.addHeader(HeaderConstants.VIA,via);
-
-        flushEntriesInvalidatedByRequest(target, request);
-
-        if (!this.cacheableRequestPolicy.isServableFromCache(request)) {
-            log.debug("Request is not servable from cache");
-            callBackend(future, target, request, clientContext);
-            return future;
-        }
-
-        final HttpCacheEntry entry = satisfyFromCache(target, request);
-        if (entry == null) {
-            log.debug("Cache miss");
-            handleCacheMiss(future, target, request, clientContext);
-        } else {
-            try {
-                handleCacheHit(future, target, request, clientContext, entry);
-            } catch (final IOException e) {
-                future.failed(e);
-            }
-        }
-        return future;
-    }
-
-    private void handleCacheHit(
-            final BasicFuture<HttpResponse> future,
-            final HttpHost target,
-            final HttpRequestWrapper request,
-            final HttpCacheContext clientContext,
-            final HttpCacheEntry entry) throws IOException {
-        recordCacheHit(target, request);
-        final HttpResponse out;
-        final Date now = getCurrentDate();
-        if (this.suitabilityChecker.canCachedResponseBeUsed(target, request, entry, now)) {
-            log.debug("Cache hit");
-            out = generateCachedResponse(request, clientContext, entry, now);
-        } else if (!mayCallBackend(request)) {
-            log.debug("Cache entry not suitable but only-if-cached requested");
-            out = generateGatewayTimeout(clientContext);
-        } else if (validityPolicy.isRevalidatable(entry)
-                && !(entry.getStatusCode() == HttpStatus.SC_NOT_MODIFIED
-                && !suitabilityChecker.isConditional(request))) {
-            log.debug("Revalidating cache entry");
-            revalidateCacheEntry(future, target, request, clientContext, entry, now);
-            return;
-        } else {
-            log.debug("Cache entry not usable; calling backend");
-            callBackend(future, target, request, clientContext);
-            return;
-        }
-        clientContext.setAttribute(HttpClientContext.HTTP_ROUTE, new HttpRoute(target));
-        clientContext.setAttribute(HttpCoreContext.HTTP_TARGET_HOST, target);
-        clientContext.setAttribute(HttpCoreContext.HTTP_REQUEST, request);
-        clientContext.setAttribute(HttpCoreContext.HTTP_RESPONSE, out);
-        clientContext.setAttribute(HttpCoreContext.HTTP_REQ_SENT, Boolean.TRUE);
-        future.completed(out);
-    }
-
-    private void revalidateCacheEntry(
-            final BasicFuture<HttpResponse> future,
-            final HttpHost target,
-            final HttpRequestWrapper request,
-            final HttpCacheContext clientContext,
-            final HttpCacheEntry entry,
-            final Date now) throws ClientProtocolException {
-
-        try {
-            if (this.asynchAsyncRevalidator != null
-                && !staleResponseNotAllowed(request, entry, now)
-                && this.validityPolicy.mayReturnStaleWhileRevalidating(entry, now)) {
-                this.log.debug("Serving stale with asynchronous revalidation");
-                final HttpResponse resp = this.responseGenerator.generateResponse(request, entry);
-                resp.addHeader(HeaderConstants.WARNING, "110 localhost \"Response is stale\"");
-
-                this.asynchAsyncRevalidator.revalidateCacheEntry(target, request, clientContext, entry);
-
-                future.completed(resp);
-                return;
-            }
-
-            final ChainedFutureCallback<HttpResponse> chainedFutureCallback = new ChainedFutureCallback<HttpResponse>(future) {
-
-                @Override
-                public void failed(final Exception ex) {
-                    if(ex instanceof IOException) {
-                        super.completed(handleRevalidationFailure(request, clientContext, entry, now));
-                    } else {
-                        super.failed(ex);
-                    }
-                }
-
-            };
-
-            final BasicFuture<HttpResponse> compositeFuture = new BasicFuture<HttpResponse>(chainedFutureCallback);
-            revalidateCacheEntry(compositeFuture, target, request, clientContext, entry);
-        } catch (final ProtocolException e) {
-            throw new ClientProtocolException(e);
-        }
-    }
-
-    private void handleCacheMiss(
-            final BasicFuture<HttpResponse> future,
-            final HttpHost target,
-            final HttpRequestWrapper request,
-            final HttpCacheContext clientContext) {
-        recordCacheMiss(target, request);
-
-        if (!mayCallBackend(request)) {
-            future.completed(new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_GATEWAY_TIMEOUT, "Gateway Timeout"));
-            return;
-        }
-
-        final Map<String, Variant> variants = getExistingCacheVariants(target, request);
-        if (variants != null && variants.size() > 0) {
-            negotiateResponseFromVariants(future, target, request, clientContext, variants);
-            return;
-        }
-
-        callBackend(future, target, request, clientContext);
-    }
-
-    private HttpCacheEntry satisfyFromCache(
-            final HttpHost target,
-            final HttpRequest request) {
-        HttpCacheEntry entry = null;
-        try {
-            entry = this.responseCache.getCacheEntry(target, request);
-        } catch (final IOException ioe) {
-            this.log.warn("Unable to retrieve entries from cache", ioe);
-        }
-        return entry;
-    }
-
-    private HttpResponse getFatallyNoncompliantResponse(
-            final HttpRequest request,
-            final HttpCacheContext clientContext) {
-        HttpResponse fatalErrorResponse = null;
-        final List<RequestProtocolError> fatalError = this.requestCompliance.requestIsFatallyNonCompliant(request);
-
-        for (final RequestProtocolError error : fatalError) {
-            setResponseStatus(clientContext, CacheResponseStatus.CACHE_MODULE_RESPONSE);
-            fatalErrorResponse = this.requestCompliance.getErrorForRequest(error);
-        }
-        return fatalErrorResponse;
-    }
-
-    private Map<String, Variant> getExistingCacheVariants(
-            final HttpHost target,
-            final HttpRequest request) {
-        Map<String,Variant> variants = null;
-        try {
-            variants = this.responseCache.getVariantCacheEntriesWithEtags(target, request);
-        } catch (final IOException ioe) {
-            this.log.warn("Unable to retrieve variant entries from cache", ioe);
-        }
-        return variants;
-    }
-
-    private void recordCacheMiss(final HttpHost target, final HttpRequest request) {
-        this.cacheMisses.getAndIncrement();
-        if (this.log.isDebugEnabled()) {
-            final RequestLine rl = request.getRequestLine();
-            this.log.debug("Cache miss [host: " + target + "; uri: " + rl.getUri() + "]");
-        }
-    }
-
-    private void recordCacheHit(final HttpHost target, final HttpRequest request) {
-        this.cacheHits.getAndIncrement();
-        if (this.log.isDebugEnabled()) {
-            final RequestLine rl = request.getRequestLine();
-            this.log.debug("Cache hit [host: " + target + "; uri: " + rl.getUri() + "]");
-        }
-    }
-
-    private void recordCacheUpdate(final HttpCacheContext clientContext) {
-        this.cacheUpdates.getAndIncrement();
-        setResponseStatus(clientContext, CacheResponseStatus.VALIDATED);
-    }
-
-    private void flushEntriesInvalidatedByRequest(final HttpHost target,
-            final HttpRequest request) {
-        try {
-            this.responseCache.flushInvalidatedCacheEntriesFor(target, request);
-        } catch (final IOException ioe) {
-            this.log.warn("Unable to flush invalidated entries from cache", ioe);
-        }
-    }
-
-    private HttpResponse generateCachedResponse(
-            final HttpRequestWrapper request,
-            final HttpCacheContext clientContext,
-            final HttpCacheEntry entry,
-            final Date now) {
-        final HttpResponse cachedResponse;
-        if (request.containsHeader(HeaderConstants.IF_NONE_MATCH)
-                || request.containsHeader(HeaderConstants.IF_MODIFIED_SINCE)) {
-            cachedResponse = this.responseGenerator.generateNotModifiedResponse(entry);
-        } else {
-            cachedResponse = this.responseGenerator.generateResponse(request, entry);
-        }
-        setResponseStatus(clientContext, CacheResponseStatus.CACHE_HIT);
-        if (this.validityPolicy.getStalenessSecs(entry, now) > 0L) {
-            cachedResponse.addHeader("Warning","110 localhost \"Response is stale\"");
-        }
-        return cachedResponse;
-    }
-
-    private HttpResponse handleRevalidationFailure(
-            final HttpRequestWrapper request,
-            final HttpCacheContext clientContext,
-            final HttpCacheEntry entry,
-            final Date now) {
-        if (staleResponseNotAllowed(request, entry, now)) {
-            return generateGatewayTimeout(clientContext);
-        }
-        return unvalidatedCacheHit(clientContext, request, entry);
-    }
-
-    private HttpResponse generateGatewayTimeout(final HttpCacheContext clientContext) {
-        setResponseStatus(clientContext, CacheResponseStatus.CACHE_MODULE_RESPONSE);
-        return new BasicHttpResponse(HttpVersion.HTTP_1_1,
-                HttpStatus.SC_GATEWAY_TIMEOUT, "Gateway Timeout");
-    }
-
-    private HttpResponse unvalidatedCacheHit(
-            final HttpCacheContext clientContext,
-            final HttpRequestWrapper request,
-            final HttpCacheEntry entry) {
-        final HttpResponse cachedResponse = this.responseGenerator.generateResponse(request, entry);
-        setResponseStatus(clientContext, CacheResponseStatus.CACHE_HIT);
-        cachedResponse.addHeader(HeaderConstants.WARNING, "111 localhost \"Revalidation failed\"");
-        return cachedResponse;
-    }
-
-    private boolean staleResponseNotAllowed(
-            final HttpRequest request,
-            final HttpCacheEntry entry,
-            final Date now) {
-        return this.validityPolicy.mustRevalidate(entry)
-            || (isSharedCache() && this.validityPolicy.proxyRevalidate(entry))
-            || explicitFreshnessRequest(request, entry, now);
-    }
-
-    private boolean mayCallBackend(final HttpRequest request) {
-        for (final Header h: request.getHeaders(HeaderConstants.CACHE_CONTROL)) {
-            for (final HeaderElement elt : h.getElements()) {
-                if ("only-if-cached".equals(elt.getName())) {
-                    this.log.debug("Request marked only-if-cached");
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
-    private boolean explicitFreshnessRequest(
-            final HttpRequest request,
-            final HttpCacheEntry entry,
-            final Date now) {
-        for(final Header h : request.getHeaders(HeaderConstants.CACHE_CONTROL)) {
-            for(final HeaderElement elt : h.getElements()) {
-                if (HeaderConstants.CACHE_CONTROL_MAX_STALE.equals(elt.getName())) {
-                    try {
-                        final int maxstale = Integer.parseInt(elt.getValue());
-                        final long age = this.validityPolicy.getCurrentAgeSecs(entry, now);
-                        final long lifetime = this.validityPolicy.getFreshnessLifetimeSecs(entry);
-                        if (age - lifetime > maxstale) {
-                            return true;
-                        }
-                    } catch (final NumberFormatException nfe) {
-                        return true;
-                    }
-                } else if (HeaderConstants.CACHE_CONTROL_MIN_FRESH.equals(elt.getName())
-                            || HeaderConstants.CACHE_CONTROL_MAX_AGE.equals(elt.getName())) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    private String generateViaHeader(final HttpMessage msg) {
-
-        final ProtocolVersion pv = msg.getProtocolVersion();
-        final String existingEntry = viaHeaders.get(pv);
-        if (existingEntry != null) {
-            return existingEntry;
-        }
-
-        final VersionInfo vi = VersionInfo.loadVersionInfo("org.apache.http.client", getClass().getClassLoader());
-        final String release = (vi != null) ? vi.getRelease() : VersionInfo.UNAVAILABLE;
-
-        final String value;
-        if ("http".equalsIgnoreCase(pv.getProtocol())) {
-            value = String.format("%d.%d localhost (Apache-HttpClient/%s (cache))", pv.getMajor(), pv.getMinor(),
-                    release);
-        } else {
-            value = String.format("%s/%d.%d localhost (Apache-HttpClient/%s (cache))", pv.getProtocol(), pv.getMajor(),
-                    pv.getMinor(), release);
-        }
-        viaHeaders.put(pv, value);
-
-        return value;
-    }
-
-    private void setResponseStatus(final HttpCacheContext clientContext, final CacheResponseStatus value) {
-        if (clientContext != null) {
-            clientContext.setAttribute(HttpCacheContext.CACHE_RESPONSE_STATUS, value);
-        }
-    }
-
-    /**
-     * Reports whether this {@code CachingHttpClient} implementation
-     * supports byte-range requests as specified by the {@code Range}
-     * and {@code Content-Range} headers.
-     * @return {@code true} if byte-range requests are supported
-     */
-    public boolean supportsRangeAndContentRangeHeaders() {
-        return SUPPORTS_RANGE_AND_CONTENT_RANGE_HEADERS;
-    }
-
-    /**
-     * Reports whether this {@code CachingHttpClient} is configured as
-     * a shared (public) or non-shared (private) cache. See {@link
-     * CacheConfig#setSharedCache(boolean)}.
-     * @return {@code true} if we are behaving as a shared (public)
-     *   cache
-     */
-    public boolean isSharedCache() {
-        return this.sharedCache;
-    }
-
-    Date getCurrentDate() {
-        return new Date();
-    }
-
-    boolean clientRequestsOurOptions(final HttpRequest request) {
-        final RequestLine line = request.getRequestLine();
-
-        if (!HeaderConstants.OPTIONS_METHOD.equals(line.getMethod())) {
-            return false;
-        }
-
-        if (!"*".equals(line.getUri())) {
-            return false;
-        }
-        return "0".equals(request.getFirstHeader(HeaderConstants.MAX_FORWARDS).getValue());
-    }
-
-    void callBackend(
-            final BasicFuture<HttpResponse> future,
-            final HttpHost target,
-            final HttpRequestWrapper request,
-            final HttpCacheContext clientContext) {
-        final Date requestDate = getCurrentDate();
-        this.log.trace("Calling the backend");
-
-        final ChainedFutureCallback<HttpResponse> chainedFutureCallback = new ChainedFutureCallback<HttpResponse>(future) {
-
-            @Override
-            public void completed(final HttpResponse httpResponse) {
-                httpResponse.addHeader(HeaderConstants.VIA, generateViaHeader(httpResponse));
-                try {
-                    final CloseableHttpResponse backendResponse = handleBackendResponse(
-                            target, request, requestDate, getCurrentDate(),
-                            Proxies.enhanceResponse(httpResponse));
-                    super.completed(backendResponse);
-                } catch (final IOException e) {
-                    super.failed(e);
-                }
-
-            }
-
-        };
-        this.backend.execute(target, request, clientContext, chainedFutureCallback);
-    }
-
-    private boolean revalidationResponseIsTooOld(
-            final HttpResponse backendResponse,
-            final HttpCacheEntry cacheEntry) {
-        final Header entryDateHeader = cacheEntry.getFirstHeader(HTTP.DATE_HEADER);
-        final Header responseDateHeader = backendResponse.getFirstHeader(HTTP.DATE_HEADER);
-        if (entryDateHeader != null && responseDateHeader != null) {
-            final Date entryDate = DateUtils.parseDate(entryDateHeader.getValue());
-            final Date respDate = DateUtils.parseDate(responseDateHeader.getValue());
-            if (respDate != null && respDate.before(entryDate)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    void negotiateResponseFromVariants(
-            final BasicFuture<HttpResponse> future,
-            final HttpHost target,
-            final HttpRequestWrapper request,
-            final HttpCacheContext clientContext,
-            final Map<String, Variant> variants) {
-        final HttpRequest conditionalRequest = this.conditionalRequestBuilder.buildConditionalRequestFromVariants(request, variants);
-
-        final Date requestDate = getCurrentDate();
-
-        final ChainedFutureCallback<HttpResponse> chainedFutureCallback = new ChainedFutureCallback<HttpResponse>(future) {
-
-            @Override
-            public void completed(final HttpResponse httpResponse) {
-                final Date responseDate = getCurrentDate();
-
-                httpResponse.addHeader(HeaderConstants.VIA, generateViaHeader(httpResponse));
-
-                if (httpResponse.getStatusLine().getStatusCode() != HttpStatus.SC_NOT_MODIFIED) {
-                    try {
-                        future.completed(handleBackendResponse(
-                                target, request, requestDate, responseDate,
-                                Proxies.enhanceResponse(httpResponse)));
-                        return;
-                    } catch (final IOException e) {
-                        future.failed(e);
-                        return;
-                    }
-                }
-
-                final Header resultEtagHeader = httpResponse.getFirstHeader(HeaderConstants.ETAG);
-                if (resultEtagHeader == null) {
-                    CachingHttpAsyncClient.this.log.warn("304 response did not contain ETag");
-                    callBackend(future, target, request, clientContext);
-                    return;
-                }
-
-                final String resultEtag = resultEtagHeader.getValue();
-                final Variant matchingVariant = variants.get(resultEtag);
-                if (matchingVariant == null) {
-                    CachingHttpAsyncClient.this.log.debug("304 response did not contain ETag matching one sent in If-None-Match");
-                    callBackend(future, target, request, clientContext);
-                }
-
-                final HttpCacheEntry matchedEntry = matchingVariant.getEntry();
-
-                if (revalidationResponseIsTooOld(httpResponse, matchedEntry)) {
-                    EntityUtils.consumeQuietly(httpResponse.getEntity());
-                    retryRequestUnconditionally(future, target, request, clientContext, matchedEntry);
-                    return;
-                }
-
-                recordCacheUpdate(clientContext);
-
-                final HttpCacheEntry responseEntry = getUpdatedVariantEntry(target,
-                        conditionalRequest, requestDate, responseDate, httpResponse,
-                        matchingVariant, matchedEntry);
-
-                final HttpResponse resp = CachingHttpAsyncClient.this.responseGenerator.generateResponse(request, responseEntry);
-                tryToUpdateVariantMap(target, request, matchingVariant);
-
-                if (shouldSendNotModifiedResponse(request, responseEntry)) {
-                    future.completed(CachingHttpAsyncClient.this.responseGenerator.generateNotModifiedResponse(responseEntry));
-                    return;
-                }
-
-                future.completed(resp);
-            }
-
-        };
-
-        this.backend.execute(target, conditionalRequest, clientContext, chainedFutureCallback);
-    }
-
-    private void retryRequestUnconditionally(
-            final BasicFuture<HttpResponse> future,
-            final HttpHost target,
-            final HttpRequestWrapper request,
-            final HttpCacheContext clientContext,
-            final HttpCacheEntry matchedEntry) {
-        final HttpRequestWrapper unconditional = this.conditionalRequestBuilder
-            .buildUnconditionalRequest(request, matchedEntry);
-        callBackend(future, target, unconditional, clientContext);
-    }
-
-    private HttpCacheEntry getUpdatedVariantEntry(
-            final HttpHost target,
-            final HttpRequest conditionalRequest,
-            final Date requestDate,
-            final Date responseDate,
-            final HttpResponse backendResponse,
-            final Variant matchingVariant,
-            final HttpCacheEntry matchedEntry) {
-        HttpCacheEntry responseEntry = matchedEntry;
-        try {
-            responseEntry = this.responseCache.updateVariantCacheEntry(target, conditionalRequest,
-                    matchedEntry, backendResponse, requestDate, responseDate, matchingVariant.getCacheKey());
-        } catch (final IOException ioe) {
-            this.log.warn("Could not update cache entry", ioe);
-        }
-        return responseEntry;
-    }
-
-    private void tryToUpdateVariantMap(
-            final HttpHost target,
-            final HttpRequest request,
-            final Variant matchingVariant) {
-        try {
-            this.responseCache.reuseVariantEntryFor(target, request, matchingVariant);
-        } catch (final IOException ioe) {
-            this.log.warn("Could not update cache entry to reuse variant", ioe);
-        }
-    }
-
-    private boolean shouldSendNotModifiedResponse(
-            final HttpRequest request,
-            final HttpCacheEntry responseEntry) {
-        return (this.suitabilityChecker.isConditional(request)
-                && this.suitabilityChecker.allConditionalsMatch(request, responseEntry, new Date()));
-    }
-
-    void revalidateCacheEntry(
-            final BasicFuture<HttpResponse> future,
-            final HttpHost target,
-            final HttpRequestWrapper request,
-            final HttpCacheContext clientContext,
-            final HttpCacheEntry cacheEntry) throws ProtocolException {
-
-        final HttpRequestWrapper conditionalRequest = this.conditionalRequestBuilder.buildConditionalRequest(request, cacheEntry);
-        final Date requestDate = getCurrentDate();
-
-        final ChainedFutureCallback<HttpResponse> chainedFutureCallback = new ChainedFutureCallback<HttpResponse>(future) {
-
-            @Override
-            public void completed(final HttpResponse httpResponse) {
-                final Date responseDate = getCurrentDate();
-
-                if (revalidationResponseIsTooOld(httpResponse, cacheEntry)) {
-                    final HttpRequest unconditional = CachingHttpAsyncClient.this.conditionalRequestBuilder.buildUnconditionalRequest(request, cacheEntry);
-                    final Date innerRequestDate = getCurrentDate();
-
-                    final ChainedFutureCallback<HttpResponse> chainedFutureCallback2 = new ChainedFutureCallback<HttpResponse>(future) {
-
-                        @Override
-                        public void completed(final HttpResponse innerHttpResponse) {
-                            final Date innerResponseDate = getCurrentDate();
-                            revalidateCacheEntryCompleted(future,
-                                    target, request, clientContext, cacheEntry,
-                                    conditionalRequest, innerRequestDate,
-                                    innerHttpResponse, innerResponseDate);
-                        }
-
-                    };
-                    CachingHttpAsyncClient.this.backend.execute(
-                            target, unconditional, clientContext, chainedFutureCallback2);
-                }
-
-                revalidateCacheEntryCompleted(future,
-                        target, request, clientContext, cacheEntry,
-                        conditionalRequest, requestDate,
-                        httpResponse, responseDate);
-            }
-
-        };
-
-        this.backend.execute(target, conditionalRequest, clientContext, chainedFutureCallback);
-    }
-
-    private void revalidateCacheEntryCompleted(
-            final BasicFuture<HttpResponse> future,
-            final HttpHost target,
-            final HttpRequestWrapper request,
-            final HttpCacheContext clientContext,
-            final HttpCacheEntry cacheEntry,
-            final HttpRequestWrapper conditionalRequest,
-            final Date requestDate,
-            final HttpResponse httpResponse,
-            final Date responseDate) {
-
-        httpResponse.addHeader(HeaderConstants.VIA, generateViaHeader(httpResponse));
-
-        final int statusCode = httpResponse.getStatusLine().getStatusCode();
-        if (statusCode == HttpStatus.SC_NOT_MODIFIED || statusCode == HttpStatus.SC_OK) {
-            recordCacheUpdate(clientContext);
-        }
-
-        if (statusCode == HttpStatus.SC_NOT_MODIFIED) {
-            final HttpCacheEntry updatedEntry;
-            try {
-                updatedEntry = CachingHttpAsyncClient.this.responseCache.updateCacheEntry(target, request, cacheEntry,
-                        httpResponse, requestDate, responseDate);
-            } catch (final IOException e) {
-                future.failed(e);
-                return;
-            }
-            if (CachingHttpAsyncClient.this.suitabilityChecker.isConditional(request)
-                    && CachingHttpAsyncClient.this.suitabilityChecker.allConditionalsMatch(request, updatedEntry, new Date())) {
-                future.completed(CachingHttpAsyncClient.this.responseGenerator.generateNotModifiedResponse(updatedEntry));
-                return;
-            }
-            future.completed(CachingHttpAsyncClient.this.responseGenerator.generateResponse(request, updatedEntry));
-            return;
-        }
-
-        if (staleIfErrorAppliesTo(statusCode)
-            && !staleResponseNotAllowed(request, cacheEntry, getCurrentDate())
-            && CachingHttpAsyncClient.this.validityPolicy.mayReturnStaleIfError(request, cacheEntry, responseDate)) {
-            final HttpResponse cachedResponse = CachingHttpAsyncClient.this.responseGenerator.generateResponse(request, cacheEntry);
-            cachedResponse.addHeader(HeaderConstants.WARNING, "110 localhost \"Response is stale\"");
-            future.completed(cachedResponse);
-            return;
-        }
-
-        try {
-            final CloseableHttpResponse backendResponse = handleBackendResponse(
-                    target, conditionalRequest, requestDate, responseDate,
-                    Proxies.enhanceResponse(httpResponse));
-            future.completed(backendResponse);
-        } catch (final IOException e) {
-            future.failed(e);
-        }
-    }
-
-    private boolean staleIfErrorAppliesTo(final int statusCode) {
-        return statusCode == HttpStatus.SC_INTERNAL_SERVER_ERROR
-                || statusCode == HttpStatus.SC_BAD_GATEWAY
-                || statusCode == HttpStatus.SC_SERVICE_UNAVAILABLE
-                || statusCode == HttpStatus.SC_GATEWAY_TIMEOUT;
-    }
-
-    CloseableHttpResponse handleBackendResponse(
-            final HttpHost target,
-            final HttpRequestWrapper request,
-            final Date requestDate,
-            final Date responseDate,
-            final CloseableHttpResponse backendResponse) throws IOException {
-
-        this.log.debug("Handling Backend response");
-        this.responseCompliance.ensureProtocolCompliance(request, backendResponse);
-
-        final boolean cacheable = this.responseCachingPolicy.isResponseCacheable(request, backendResponse);
-        this.responseCache.flushInvalidatedCacheEntriesFor(target, request, backendResponse);
-        if (cacheable &&
-            !alreadyHaveNewerCacheEntry(target, request, backendResponse)) {
-            storeRequestIfModifiedSinceFor304Response(request, backendResponse);
-            return this.responseCache.cacheAndReturnResponse(target, request, backendResponse, requestDate,
-                    responseDate);
-        }
-        if (!cacheable) {
-            try {
-                this.responseCache.flushCacheEntriesFor(target, request);
-            } catch (final IOException ioe) {
-                this.log.warn("Unable to flush invalid cache entries", ioe);
-            }
-        }
-        return backendResponse;
-    }
-
-    /**
-     * For 304 Not modified responses, adds a "Last-Modified" header with the
-     * value of the "If-Modified-Since" header passed in the request. This
-     * header is required to be able to reuse match the cache entry for
-     * subsequent requests but as defined in http specifications it is not
-     * included in 304 responses by backend servers. This header will not be
-     * included in the resulting response.
-     */
-    private void storeRequestIfModifiedSinceFor304Response(
-            final HttpRequest request,
-            final HttpResponse backendResponse) {
-        if (backendResponse.getStatusLine().getStatusCode() == HttpStatus.SC_NOT_MODIFIED) {
-            final Header h = request.getFirstHeader("If-Modified-Since");
-            if (h != null) {
-                backendResponse.addHeader("Last-Modified", h.getValue());
-            }
-        }
-    }
-
-    private boolean alreadyHaveNewerCacheEntry(
-            final HttpHost target,
-            final HttpRequest request,
-            final HttpResponse backendResponse) {
-        HttpCacheEntry existing = null;
-        try {
-            existing = this.responseCache.getCacheEntry(target, request);
-        } catch (final IOException ioe) {
-            // nop
-        }
-        if (existing == null) {
-            return false;
-        }
-        final Header entryDateHeader = existing.getFirstHeader(HTTP.DATE_HEADER);
-        if (entryDateHeader == null) {
-            return false;
-        }
-        final Header responseDateHeader = backendResponse.getFirstHeader(HTTP.DATE_HEADER);
-        if (responseDateHeader == null) {
-            return false;
-        }
-        final Date entryDate = DateUtils.parseDate(entryDateHeader.getValue());
-        final Date responseDate = DateUtils.parseDate(responseDateHeader.getValue());
-        return responseDate != null && responseDate.before(entryDate);
-    }
-
-}
diff --git a/httpasyncclient-cache/src/main/java/org/apache/http/impl/client/cache/ChainedFutureCallback.java b/httpasyncclient-cache/src/main/java/org/apache/http/impl/client/cache/ChainedFutureCallback.java
deleted file mode 100644
index b813b11..0000000
--- a/httpasyncclient-cache/src/main/java/org/apache/http/impl/client/cache/ChainedFutureCallback.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.client.cache;
-
-import org.apache.http.concurrent.BasicFuture;
-import org.apache.http.concurrent.FutureCallback;
-
-class ChainedFutureCallback<T> implements FutureCallback<T> {
-
-    private final BasicFuture<T> wrapped;
-
-    public ChainedFutureCallback(final BasicFuture<T> delegate) {
-        this.wrapped = delegate;
-    }
-
-    @Override
-    public void completed(final T result) {
-        this.wrapped.completed(result);
-    }
-
-    @Override
-    public void failed(final Exception ex) {
-        this.wrapped.failed(ex);
-    }
-
-    @Override
-    public void cancelled() {
-        this.wrapped.cancel();
-    }
-
-}
diff --git a/httpasyncclient-cache/src/main/java/org/apache/http/impl/client/cache/package-info.java b/httpasyncclient-cache/src/main/java/org/apache/http/impl/client/cache/package-info.java
deleted file mode 100644
index 91931ad..0000000
--- a/httpasyncclient-cache/src/main/java/org/apache/http/impl/client/cache/package-info.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-/**
- * HTTP/1.1 client-side caching.
- */
-package org.apache.http.impl.client.cache;
diff --git a/httpasyncclient-cache/src/test/java/org/apache/http/impl/client/cache/CachingHttpAsyncClientExecChain.java b/httpasyncclient-cache/src/test/java/org/apache/http/impl/client/cache/CachingHttpAsyncClientExecChain.java
deleted file mode 100644
index 23000f4..0000000
--- a/httpasyncclient-cache/src/test/java/org/apache/http/impl/client/cache/CachingHttpAsyncClientExecChain.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.client.cache;
-
-import java.io.IOException;
-import java.lang.reflect.UndeclaredThrowableException;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-
-import org.apache.http.HttpException;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpExecutionAware;
-import org.apache.http.client.methods.HttpRequestWrapper;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.impl.execchain.ClientExecChain;
-
-public class CachingHttpAsyncClientExecChain implements ClientExecChain {
-
-    private final CachingHttpAsyncClient client;
-
-    public CachingHttpAsyncClientExecChain(final ClientExecChain backend) {
-        this(backend, new BasicHttpCache(), CacheConfig.DEFAULT);
-    }
-
-    public CachingHttpAsyncClientExecChain(
-            final ClientExecChain backend,
-            final HttpCache cache,
-            final CacheConfig config) {
-        this.client = new CachingHttpAsyncClient(
-                new ClientExecChainAsyncClient(backend), cache, config);
-    }
-
-    CachingHttpAsyncClientExecChain(
-            final ClientExecChain backend, final HttpCache responseCache,
-            final CacheValidityPolicy validityPolicy,
-            final ResponseCachingPolicy responseCachingPolicy,
-            final CachedHttpResponseGenerator responseGenerator,
-            final CacheableRequestPolicy cacheableRequestPolicy,
-            final CachedResponseSuitabilityChecker suitabilityChecker,
-            final ConditionalRequestBuilder conditionalRequestBuilder,
-            final ResponseProtocolCompliance responseCompliance,
-            final RequestProtocolCompliance requestCompliance) {
-        this.client = new CachingHttpAsyncClient(
-                new ClientExecChainAsyncClient(backend), validityPolicy,
-                responseCachingPolicy, responseCache, responseGenerator,
-                cacheableRequestPolicy, suitabilityChecker,
-                conditionalRequestBuilder, responseCompliance,
-                requestCompliance);
-    }
-
-    public boolean supportsRangeAndContentRangeHeaders() {
-        return client.supportsRangeAndContentRangeHeaders();
-    }
-
-    public CloseableHttpResponse execute(
-            final HttpRoute route,
-            final HttpRequestWrapper request) throws IOException, HttpException {
-        return execute(route, request, HttpClientContext.create(), null);
-    }
-
-    public CloseableHttpResponse execute(
-            final HttpRoute route,
-            final HttpRequestWrapper request,
-            final HttpClientContext context) throws IOException, HttpException {
-        return execute(route, request, context, null);
-    }
-
-    @Override
-    public CloseableHttpResponse execute(
-            final HttpRoute route,
-            final HttpRequestWrapper request,
-            final HttpClientContext context,
-            final HttpExecutionAware execAware) throws IOException, HttpException {
-        try {
-            final Future<HttpResponse> future = client.execute(route.getTargetHost(), request, context, null);
-            return Proxies.enhanceResponse(future.get());
-        } catch (final InterruptedException e) {
-            Thread.currentThread().interrupt();
-            return null;
-        } catch (final ExecutionException e) {
-            try {
-                throw e.getCause();
-            } catch (final IOException ex) {
-                throw ex;
-            } catch (final HttpException ex) {
-                throw ex;
-            } catch (final RuntimeException ex) {
-                throw ex;
-            } catch (final Error ex) {
-                throw ex;
-            } catch (final Throwable ex) {
-                throw new UndeclaredThrowableException(ex);
-            }
-        }
-    }
-
-    public long getCacheHits() {
-        return client.getCacheHits();
-    }
-
-    public long getCacheMisses() {
-        return client.getCacheMisses();
-    }
-
-    public long getCacheUpdates() {
-        return client.getCacheUpdates();
-    }
-
-}
diff --git a/httpasyncclient-cache/src/test/java/org/apache/http/impl/client/cache/ClientExecChainAsyncClient.java b/httpasyncclient-cache/src/test/java/org/apache/http/impl/client/cache/ClientExecChainAsyncClient.java
deleted file mode 100644
index 5e6d451..0000000
--- a/httpasyncclient-cache/src/test/java/org/apache/http/impl/client/cache/ClientExecChainAsyncClient.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.client.cache;
-
-import org.apache.http.HttpException;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.HttpRequestWrapper;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.concurrent.BasicFuture;
-import org.apache.http.concurrent.FutureCallback;
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.impl.execchain.ClientExecChain;
-import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
-import org.apache.http.nio.conn.ClientAsyncConnectionManager;
-import org.apache.http.nio.protocol.HttpAsyncRequestProducer;
-import org.apache.http.nio.protocol.HttpAsyncResponseConsumer;
-import org.apache.http.nio.reactor.IOReactorStatus;
-import org.apache.http.params.HttpParams;
-import org.apache.http.protocol.HttpContext;
-
-import java.io.IOException;
-import java.util.concurrent.Future;
-
-public class ClientExecChainAsyncClient extends CloseableHttpAsyncClient {
-
-    private final ClientExecChain backend;
-
-    public ClientExecChainAsyncClient(final ClientExecChain backend) {
-        super();
-        this.backend = backend;
-    }
-
-    @Override
-    public void start() {
-        // no-op
-    }
-
-    @Override
-    public boolean isRunning() {
-        return true;
-    }
-
-    public void shutdown() throws InterruptedException {
-        // no-op
-    }
-
-    public IOReactorStatus getStatus() {
-        return null;
-    }
-
-    @SuppressWarnings("deprecation")
-    public ClientAsyncConnectionManager getConnectionManager() {
-        return null;
-    }
-
-    @SuppressWarnings("deprecation")
-    public HttpParams getParams() {
-        return null;
-    }
-
-    @Override
-    public void close() throws IOException {
-        // no-op
-    }
-
-    @Override
-    public <T> Future<T> execute(
-            final HttpAsyncRequestProducer requestProducer,
-            final HttpAsyncResponseConsumer<T> responseConsumer,
-            final HttpContext context,
-            final FutureCallback<T> callback) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public Future<HttpResponse> execute(
-            final HttpHost target,
-            final HttpRequest request,
-            final HttpContext context,
-            final FutureCallback<HttpResponse> callback) {
-        final BasicFuture<HttpResponse> future = new BasicFuture<HttpResponse>(
-                callback);
-        try {
-            final HttpResponse result = backend.execute(new HttpRoute(target),
-                    HttpRequestWrapper.wrap(request),
-                    HttpClientContext.adapt(context), null);
-            future.completed(result);
-        } catch (final IOException e) {
-            future.failed(e);
-        } catch (final HttpException e) {
-            future.failed(e);
-        }
-        return future;
-    }
-
-}
diff --git a/httpasyncclient-cache/src/test/java/org/apache/http/impl/client/cache/TestAsyncProtocolAllowedBehavior.java b/httpasyncclient-cache/src/test/java/org/apache/http/impl/client/cache/TestAsyncProtocolAllowedBehavior.java
deleted file mode 100644
index dcba732..0000000
--- a/httpasyncclient-cache/src/test/java/org/apache/http/impl/client/cache/TestAsyncProtocolAllowedBehavior.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.client.cache;
-
-import org.apache.http.impl.execchain.ClientExecChain;
-
-/**
- * This class tests behavior that is allowed (MAY) by the HTTP/1.1 protocol specification and for
- * which we have implemented the behavior in the caching HTTP client.
- */
-public class TestAsyncProtocolAllowedBehavior extends TestProtocolAllowedBehavior {
-
-    @Override
-    protected ClientExecChain createCachingExecChain(
-            final ClientExecChain backend,
-            final HttpCache cache,
-            final CacheConfig config) {
-        return new CachingHttpAsyncClientExecChain(backend, cache, config);
-    }
-
-    @Override
-    protected boolean supportsRangeAndContentRangeHeaders(final ClientExecChain impl) {
-        return impl instanceof CachingHttpAsyncClientExecChain
-                && ((CachingHttpAsyncClientExecChain) impl)
-                .supportsRangeAndContentRangeHeaders();
-    }
-
-}
diff --git a/httpasyncclient-cache/src/test/java/org/apache/http/impl/client/cache/TestAsyncProtocolDeviations.java b/httpasyncclient-cache/src/test/java/org/apache/http/impl/client/cache/TestAsyncProtocolDeviations.java
deleted file mode 100644
index 72f22d7..0000000
--- a/httpasyncclient-cache/src/test/java/org/apache/http/impl/client/cache/TestAsyncProtocolDeviations.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.client.cache;
-
-import org.apache.http.impl.execchain.ClientExecChain;
-
-/**
- * We are a conditionally-compliant HTTP/1.1 client with a cache. However, a lot of the rules for
- * proxies apply to us, as far as proper operation of the requests that pass through us. Generally
- * speaking, we want to make sure that any response returned from our HttpClient.execute() methods
- * is conditionally compliant with the rules for an HTTP/1.1 server, and that any requests we pass
- * downstream to the backend HttpClient are are conditionally compliant with the rules for an
- * HTTP/1.1 client.
- * <p>
- * There are some cases where strictly behaving as a compliant caching proxy would result in strange
- * behavior, since we're attached as part of a client and are expected to be a drop-in replacement.
- * The test cases captured here document the places where we differ from the HTTP RFC.
- */
-public class TestAsyncProtocolDeviations extends TestProtocolDeviations {
-
-    @Override
-    protected ClientExecChain createCachingExecChain(
-            final ClientExecChain backend,
-            final HttpCache cache,
-            final CacheConfig config) {
-        return new CachingHttpAsyncClientExecChain(backend, cache, config);
-    }
-}
diff --git a/httpasyncclient-cache/src/test/java/org/apache/http/impl/client/cache/TestAsyncProtocolRequirements.java b/httpasyncclient-cache/src/test/java/org/apache/http/impl/client/cache/TestAsyncProtocolRequirements.java
deleted file mode 100644
index fc814df..0000000
--- a/httpasyncclient-cache/src/test/java/org/apache/http/impl/client/cache/TestAsyncProtocolRequirements.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.client.cache;
-
-import org.apache.http.impl.execchain.ClientExecChain;
-
-/**
- * We are a conditionally-compliant HTTP/1.1 client with a cache. However, a lot of the rules for
- * proxies apply to us, as far as proper operation of the requests that pass through us. Generally
- * speaking, we want to make sure that any response returned from our HttpClient.execute() methods
- * is conditionally compliant with the rules for an HTTP/1.1 server, and that any requests we pass
- * downstream to the backend HttpClient are are conditionally compliant with the rules for an
- * HTTP/1.1 client.
- */
-public class TestAsyncProtocolRequirements extends TestProtocolRequirements {
-
-    @Override
-    protected ClientExecChain createCachingExecChain(
-            final ClientExecChain backend,
-            final HttpCache cache,
-            final CacheConfig config) {
-        return new CachingHttpAsyncClientExecChain(backend, cache, config);
-    }
-
-    @Override
-    protected boolean supportsRangeAndContentRangeHeaders(final ClientExecChain impl) {
-        return impl instanceof CachingHttpAsyncClientExecChain
-                && ((CachingHttpAsyncClientExecChain) impl)
-                .supportsRangeAndContentRangeHeaders();
-    }
-}
diff --git a/httpasyncclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCachingHttpAsyncClient.java b/httpasyncclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCachingHttpAsyncClient.java
deleted file mode 100644
index fda6696..0000000
--- a/httpasyncclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCachingHttpAsyncClient.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.client.cache;
-
-import org.apache.http.impl.execchain.ClientExecChain;
-import org.junit.Ignore;
-import org.junit.Test;
-
-public class TestCachingHttpAsyncClient extends TestCachingExecChain {
-
-    @Override
-    public ClientExecChain createCachingExecChain(
-            final ClientExecChain backend,
-            final HttpCache responseCache,
-            final CacheValidityPolicy validityPolicy,
-            final ResponseCachingPolicy responseCachingPolicy,
-            final CachedHttpResponseGenerator responseGenerator,
-            final CacheableRequestPolicy cacheableRequestPolicy,
-            final CachedResponseSuitabilityChecker suitabilityChecker,
-            final ConditionalRequestBuilder conditionalRequestBuilder,
-            final ResponseProtocolCompliance responseCompliance,
-            final RequestProtocolCompliance requestCompliance,
-            final CacheConfig config,
-            final AsynchronousValidator asynchRevalidator) {
-        return new CachingHttpAsyncClientExecChain(backend, responseCache, validityPolicy,
-                responseCachingPolicy, responseGenerator,
-                cacheableRequestPolicy, suitabilityChecker,
-                conditionalRequestBuilder, responseCompliance,
-                requestCompliance);
-    }
-
-    @Override
-    public ClientExecChain createCachingExecChain(
-            final ClientExecChain backend,
-            final HttpCache cache,
-            final CacheConfig config) {
-        return new CachingHttpAsyncClientExecChain(backend, cache, config);
-    }
-
-    @Override @Test @Ignore // TODO: virtual host support is presently broken
-    public void testUsesVirtualHostForCacheKey() throws Exception {
-        super.testUsesVirtualHostForCacheKey();
-    }
-
-}
diff --git a/httpasyncclient-cache/src/test/java/org/apache/http/impl/client/cache/TestHttpAsyncCacheJiraNumber1147.java b/httpasyncclient-cache/src/test/java/org/apache/http/impl/client/cache/TestHttpAsyncCacheJiraNumber1147.java
deleted file mode 100644
index 98c3ec5..0000000
--- a/httpasyncclient-cache/src/test/java/org/apache/http/impl/client/cache/TestHttpAsyncCacheJiraNumber1147.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.client.cache;
-
-import org.apache.http.impl.execchain.ClientExecChain;
-
-public class TestHttpAsyncCacheJiraNumber1147 extends TestHttpCacheJiraNumber1147 {
-
-    @Override
-    protected ClientExecChain createCachingExecChain(
-            final ClientExecChain backend,
-            final BasicHttpCache cache,
-            final CacheConfig config) {
-        return new CachingHttpAsyncClientExecChain(backend, cache, config);
-    }
-
-}
diff --git a/httpasyncclient-cache/src/test/resources/commons-logging.properties b/httpasyncclient-cache/src/test/resources/commons-logging.properties
deleted file mode 100644
index 2fa1b3b..0000000
--- a/httpasyncclient-cache/src/test/resources/commons-logging.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-# ====================================================================
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-# ====================================================================
-#
-# This software consists of voluntary contributions made by many
-# individuals on behalf of the Apache Software Foundation.  For more
-# information on the Apache Software Foundation, please see
-# <http://www.apache.org/>.
-
-# Disable logging for unit tests
-org.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog
diff --git a/httpasyncclient-osgi/pom.xml b/httpasyncclient-osgi/pom.xml
deleted file mode 100644
index 6ec73b4..0000000
--- a/httpasyncclient-osgi/pom.xml
+++ /dev/null
@@ -1,187 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one
-   or more contributor license agreements.  See the NOTICE file
-   distributed with this work for additional information
-   regarding copyright ownership.  The ASF licenses this file
-   to you under the Apache License, Version 2.0 (the
-   "License"); you may not use this file except in compliance
-   with the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing,
-   software distributed under the License is distributed on an
-   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-   KIND, either express or implied.  See the License for the
-   specific language governing permissions and limitations
-   under the License.
-   ====================================================================
-
-   This software consists of voluntary contributions made by many
-   individuals on behalf of the Apache Software Foundation.  For more
-   information on the Apache Software Foundation, please see
-   <http://www.apache.org />.
- --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.apache.httpcomponents</groupId>
-    <artifactId>httpcomponents-asyncclient</artifactId>
-    <version>4.2-alpha1-SNAPSHOT</version>
-  </parent>
-  <artifactId>httpasyncclient-osgi</artifactId>
-  <name>Apache HttpAsyncClient OSGi bundle</name>
-  <description>
-   Apache HttpComponents AsyncClient (OSGi bundle)
-  </description>
-  <url>http://hc.apache.org/httpcomponents-asyncclient</url>
-  <packaging>bundle</packaging>
-
-  <properties>
-    <httpcore.osgi.import.version>"[4.4.0, 4.5.0)"</httpcore.osgi.import.version>
-    <httpclient.osgi.import.version>"[4.4.0, 4.5.0)"</httpclient.osgi.import.version>
-    <commons-logging.osgi.import.version>"[1.1.0, 1.3.0)"</commons-logging.osgi.import.version>
-  </properties>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpasyncclient</artifactId>
-      <version>${project.version}</version>
-      <scope>compile</scope>
-    </dependency>
-  </dependencies>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <extensions>true</extensions>
-        <configuration>
-          <instructions>
-            <Bundle-Name>Apache ${project.name}</Bundle-Name>
-            <Bundle-SymbolicName>${project.groupId}.httpasyncclient</Bundle-SymbolicName>
-            <_exportcontents>
-            org.apache.http.nio.client.*;version=${project.version},
-            org.apache.http.nio.conn.*;version=${project.version},
-            org.apache.http.impl.nio.client.*;version=${project.version},
-            org.apache.http.impl.nio.conn.*;version=${project.version}
-            </_exportcontents>
-            <Embed-Dependency>*;scope=compile|runtime;inline=true</Embed-Dependency>
-            <Import-Package>
-            javax.crypto,
-            javax.crypto.spec,
-            javax.net.ssl,
-            javax.security.auth.x500,
-            org.ietf.jgss,
-            org.apache.commons.logging;version=${commons-logging.osgi.import.version},
-            org.apache.http;version=${httpcore.osgi.import.version},
-            org.apache.http.entity;version=${httpcore.osgi.import.version},
-            org.apache.http.concurrent;version=${httpcore.osgi.import.version},
-            org.apache.http.config;version=${httpcore.osgi.import.version},
-            org.apache.http.io;version=${httpcore.osgi.import.version},
-            org.apache.http.message;version=${httpcore.osgi.import.version},
-            org.apache.http.params;version=${httpcore.osgi.import.version},
-            org.apache.http.pool;version=${httpcore.osgi.import.version},
-            org.apache.http.protocol;version=${httpcore.osgi.import.version},
-            org.apache.http.util;version=${httpcore.osgi.import.version},
-            org.apache.http.impl;version=${httpcore.osgi.import.version},
-            org.apache.http.nio;version=${httpcore.osgi.import.version},
-            org.apache.http.nio.entity;version=${httpcore.osgi.import.version},
-            org.apache.http.nio.params;version=${httpcore.osgi.import.version},
-            org.apache.http.nio.pool;version=${httpcore.osgi.import.version},
-            org.apache.http.nio.protocol;version=${httpcore.osgi.import.version},
-            org.apache.http.nio.reactor;version=${httpcore.osgi.import.version},
-            org.apache.http.nio.reactor.ssl;version=${httpcore.osgi.import.version},
-            org.apache.http.nio.util;version=${httpcore.osgi.import.version},
-            org.apache.http.impl.nio.codecs;version=${httpcore.osgi.import.version},
-            org.apache.http.impl.nio;version=${httpcore.osgi.import.version},
-            org.apache.http.impl.nio.reactor;version=${httpcore.osgi.import.version},
-            org.apache.http.auth;version=${httpclient.osgi.import.version},
-            org.apache.http.cookie;version=${httpclient.osgi.import.version},
-            org.apache.http.conn;version=${httpclient.osgi.import.version},
-            org.apache.http.conn.params;version=${httpclient.osgi.import.version},
-            org.apache.http.conn.routing;version=${httpclient.osgi.import.version},
-            org.apache.http.conn.ssl;version=${httpclient.osgi.import.version},
-            org.apache.http.conn.util;version=${httpclient.osgi.import.version},
-            org.apache.http.client;version=${httpclient.osgi.import.version},
-            org.apache.http.client.config;version=${httpcore.osgi.import.version},
-            org.apache.http.client.methods;version=${httpclient.osgi.import.version},
-            org.apache.http.client.params;version=${httpclient.osgi.import.version},
-            org.apache.http.client.protocol;version=${httpclient.osgi.import.version},
-            org.apache.http.client.utils;version=${httpclient.osgi.import.version},
-            org.apache.http.impl.auth;version=${httpclient.osgi.import.version},
-            org.apache.http.impl.cookie;version=${httpclient.osgi.import.version},
-            org.apache.http.impl.conn;version=${httpclient.osgi.import.version},
-            org.apache.http.impl.client;version=${httpclient.osgi.import.version},
-            org.apache.http.impl.execchain;version=${httpclient.osgi.import.version},
-            org.apache.http.ssl;version=${httpcore.osgi.import.version},
-            *
-            </Import-Package>
-            <Include-Resource />
-            <!-- Stop the JAVA_1_n_HOME variables from being treated as headers by Bnd -->
-            <_removeheaders>JAVA_1_3_HOME,JAVA_1_4_HOME</_removeheaders>
-          </instructions>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>clirr-maven-plugin</artifactId>
-        <configuration>
-          <skip>true</skip>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.rat</groupId>
-        <artifactId>apache-rat-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>verify</phase>
-            <goals>
-              <goal>check</goal>
-            </goals>
-          </execution>
-        </executions>
-        <configuration>
-          <excludes>
-            <exclude>.externalToolBuilders/**</exclude>			
-            <exclude>.pmd</exclude>
-            <exclude>maven-eclipse.xml</exclude>
-          </excludes>
-        </configuration>
-      </plugin>	
-    </plugins>
-    <finalName>org.apache.httpcomponents.httpasyncclient_${project.version}</finalName>
-  </build>
-
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>clirr-maven-plugin</artifactId>
-        <version>${hc.clirr.version}</version>
-        <configuration>
-          <skip>true</skip>
-        </configuration>
-      </plugin>
-      <plugin>
-        <artifactId>maven-project-info-reports-plugin</artifactId>
-        <version>${hc.project-info.version}</version>
-        <inherited>false</inherited>
-        <reportSets>
-          <reportSet>
-            <reports>
-              <report>dependencies</report>
-              <report>dependency-info</report>
-              <report>summary</report>
-            </reports>
-          </reportSet>
-        </reportSets>
-      </plugin>
-
-    </plugins>
-  </reporting>
-
-</project>
diff --git a/httpasyncclient/pom.xml b/httpasyncclient/pom.xml
deleted file mode 100644
index deaf219..0000000
--- a/httpasyncclient/pom.xml
+++ /dev/null
@@ -1,181 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one
-   or more contributor license agreements.  See the NOTICE file
-   distributed with this work for additional information
-   regarding copyright ownership.  The ASF licenses this file
-   to you under the Apache License, Version 2.0 (the
-   "License"); you may not use this file except in compliance
-   with the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing,
-   software distributed under the License is distributed on an
-   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-   KIND, either express or implied.  See the License for the
-   specific language governing permissions and limitations
-   under the License.
-   ====================================================================
-
-   This software consists of voluntary contributions made by many
-   individuals on behalf of the Apache Software Foundation.  For more
-   information on the Apache Software Foundation, please see
-   <http://www.apache.org />.
- --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.apache.httpcomponents</groupId>
-    <artifactId>httpcomponents-asyncclient</artifactId>
-    <version>4.2-alpha1-SNAPSHOT</version>
-  </parent>
-  <artifactId>httpasyncclient</artifactId>
-  <name>Apache HttpAsyncClient</name>
-  <description>
-   Apache HttpComponents AsyncClient
-  </description>
-  <url>http://hc.apache.org/httpcomponents-asyncclient</url>
-  <packaging>jar</packaging>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpcore</artifactId>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpcore-nio</artifactId>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpclient</artifactId>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>commons-logging</groupId>
-      <artifactId>commons-logging</artifactId>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>commons-io</groupId>
-      <artifactId>commons-io</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-core</artifactId>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-
-  <build>
-    <resources>
-      <resource>
-        <directory>src/main/resources</directory>
-        <filtering>true</filtering>
-        <includes>
-            <include>**/*.properties</include>
-        </includes>
-      </resource>
-    </resources>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.rat</groupId>
-        <artifactId>apache-rat-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>verify</phase>
-            <goals>
-              <goal>check</goal>
-            </goals>
-          </execution>
-        </executions>
-        <configuration>
-          <excludes>
-            <exclude>.externalToolBuilders/**</exclude>			
-            <exclude>maven-eclipse.xml</exclude>
-          </excludes>
-        </configuration>
-      </plugin>	
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>build-helper-maven-plugin</artifactId>
-        <version>1.8</version>
-        <executions>
-          <execution>
-          <id>add-source</id>
-          <phase>generate-sources</phase>
-          <goals>
-            <goal>add-source</goal>
-          </goals>
-          <configuration>
-            <sources>
-              <source>src/main/java-deprecated</source>
-            </sources>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-
-  <reporting>
-    <plugins>
-
-      <plugin>
-        <artifactId>maven-javadoc-plugin</artifactId>
-        <version>${hc.javadoc.version}</version>
-        <configuration>
-          <source>${maven.compiler.source}</source>
-          <links>
-            <link>http://download.oracle.com/javase/1.5.0/docs/api/</link>
-            <link>http://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/</link>
-            <link>http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/</link>
-          </links>
-        </configuration>
-        <reportSets>
-          <reportSet>
-            <reports>
-              <report>javadoc</report>
-            </reports>
-          </reportSet>
-        </reportSets>
-      </plugin>
-
-      <plugin>
-        <artifactId>maven-project-info-reports-plugin</artifactId>
-        <version>${hc.project-info.version}</version>
-        <inherited>false</inherited>
-        <reportSets>
-          <reportSet>
-            <reports>
-              <report>dependencies</report>
-              <report>dependency-info</report>
-              <report>summary</report>
-            </reports>
-          </reportSet>
-        </reportSets>
-      </plugin>
-
-      <plugin>
-        <artifactId>maven-jxr-plugin</artifactId>
-        <version>${hc.jxr.version}</version>
-      </plugin>
-
-      <plugin>
-        <artifactId>maven-surefire-report-plugin</artifactId>
-        <version>${hc.surefire-report.version}</version>
-      </plugin>
-
-    </plugins>
-  </reporting>
-
-</project>
diff --git a/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientAuthentication.java b/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientAuthentication.java
deleted file mode 100644
index f2d82c8..0000000
--- a/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientAuthentication.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.examples.nio.client;
-
-import org.apache.http.HttpResponse;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.UsernamePasswordCredentials;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.client.BasicCredentialsProvider;
-import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
-import org.apache.http.impl.nio.client.HttpAsyncClients;
-
-import java.util.concurrent.Future;
-
-/**
- * A simple example that uses HttpClient to execute an HTTP request against
- * a target site that requires user authentication.
- */
-public class AsyncClientAuthentication {
-
-    public static void main(String[] args) throws Exception {
-        CredentialsProvider credsProvider = new BasicCredentialsProvider();
-        credsProvider.setCredentials(
-                new AuthScope("localhost", 443),
-                new UsernamePasswordCredentials("username", "password"));
-        CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom()
-                .setDefaultCredentialsProvider(credsProvider)
-                .build();
-        try {
-            HttpGet httpget = new HttpGet("http://localhost/");
-
-            System.out.println("Executing request " + httpget.getRequestLine());
-            Future<HttpResponse> future = httpclient.execute(httpget, null);
-            HttpResponse response = future.get();
-            System.out.println("Response: " + response.getStatusLine());
-            System.out.println("Shutting down");
-        } finally {
-            httpclient.close();
-        }
-    }
-}
diff --git a/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientConfiguration.java b/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientConfiguration.java
deleted file mode 100644
index 15f8d34..0000000
--- a/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientConfiguration.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.http.examples.nio.client;
-
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.nio.charset.CodingErrorAction;
-import java.util.Arrays;
-import java.util.concurrent.Future;
-
-import javax.net.ssl.HostnameVerifier;
-import javax.net.ssl.SSLContext;
-
-import org.apache.http.Consts;
-import org.apache.http.Header;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.ParseException;
-import org.apache.http.client.CookieStore;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.client.config.AuthSchemes;
-import org.apache.http.client.config.CookieSpecs;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.config.ConnectionConfig;
-import org.apache.http.config.MessageConstraints;
-import org.apache.http.config.Registry;
-import org.apache.http.config.RegistryBuilder;
-import org.apache.http.conn.DnsResolver;
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.conn.ssl.DefaultHostnameVerifier;
-import org.apache.http.conn.ssl.SSLContexts;
-import org.apache.http.impl.DefaultHttpResponseFactory;
-import org.apache.http.impl.client.BasicCookieStore;
-import org.apache.http.impl.client.BasicCredentialsProvider;
-import org.apache.http.impl.conn.SystemDefaultDnsResolver;
-import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
-import org.apache.http.impl.nio.client.HttpAsyncClients;
-import org.apache.http.impl.nio.codecs.DefaultHttpRequestWriterFactory;
-import org.apache.http.impl.nio.codecs.DefaultHttpResponseParser;
-import org.apache.http.impl.nio.codecs.DefaultHttpResponseParserFactory;
-import org.apache.http.impl.nio.conn.ManagedNHttpClientConnectionFactory;
-import org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager;
-import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor;
-import org.apache.http.impl.nio.reactor.IOReactorConfig;
-import org.apache.http.message.BasicHeader;
-import org.apache.http.message.BasicLineParser;
-import org.apache.http.message.LineParser;
-import org.apache.http.nio.NHttpMessageParser;
-import org.apache.http.nio.NHttpMessageParserFactory;
-import org.apache.http.nio.NHttpMessageWriterFactory;
-import org.apache.http.nio.conn.ManagedNHttpClientConnection;
-import org.apache.http.nio.conn.NHttpConnectionFactory;
-import org.apache.http.nio.conn.NoopIOSessionStrategy;
-import org.apache.http.nio.conn.SchemeIOSessionStrategy;
-import org.apache.http.nio.conn.ssl.SSLIOSessionStrategy;
-import org.apache.http.nio.reactor.ConnectingIOReactor;
-import org.apache.http.nio.reactor.SessionInputBuffer;
-import org.apache.http.nio.util.HeapByteBufferAllocator;
-import org.apache.http.util.CharArrayBuffer;
-
-/**
- * This example demonstrates how to customize and configure the most common aspects
- * of HTTP request execution and connection management.
- */
-public class AsyncClientConfiguration {
-
-    public final static void main(String[] args) throws Exception {
-
-        // Use custom message parser / writer to customize the way HTTP
-        // messages are parsed from and written out to the data stream.
-        NHttpMessageParserFactory<HttpResponse> responseParserFactory = new DefaultHttpResponseParserFactory() {
-
-            @Override
-            public NHttpMessageParser<HttpResponse> create(
-                    final SessionInputBuffer buffer,
-                    final MessageConstraints constraints) {
-                LineParser lineParser = new BasicLineParser() {
-
-                    @Override
-                    public Header parseHeader(final CharArrayBuffer buffer) {
-                        try {
-                            return super.parseHeader(buffer);
-                        } catch (ParseException ex) {
-                            return new BasicHeader(buffer.toString(), null);
-                        }
-                    }
-
-                };
-                return new DefaultHttpResponseParser(
-                        buffer, lineParser, DefaultHttpResponseFactory.INSTANCE, constraints);
-            }
-
-        };
-        NHttpMessageWriterFactory<HttpRequest> requestWriterFactory = new DefaultHttpRequestWriterFactory();
-
-        // Use a custom connection factory to customize the process of
-        // initialization of outgoing HTTP connections. Beside standard connection
-        // configuration parameters HTTP connection factory can define message
-        // parser / writer routines to be employed by individual connections.
-        NHttpConnectionFactory<ManagedNHttpClientConnection> connFactory = new ManagedNHttpClientConnectionFactory(
-                requestWriterFactory, responseParserFactory, HeapByteBufferAllocator.INSTANCE);
-
-        // Client HTTP connection objects when fully initialized can be bound to
-        // an arbitrary network socket. The process of network socket initialization,
-        // its connection to a remote address and binding to a local one is controlled
-        // by a connection socket factory.
-
-        // SSL context for secure connections can be created either based on
-        // system or application specific properties.
-        SSLContext sslcontext = SSLContexts.createSystemDefault();
-        // Use custom hostname verifier to customize SSL hostname verification.
-        HostnameVerifier hostnameVerifier = new DefaultHostnameVerifier();
-
-        // Create a registry of custom connection session strategies for supported
-        // protocol schemes.
-        Registry<SchemeIOSessionStrategy> sessionStrategyRegistry = RegistryBuilder.<SchemeIOSessionStrategy>create()
-            .register("http", NoopIOSessionStrategy.INSTANCE)
-            .register("https", new SSLIOSessionStrategy(sslcontext, hostnameVerifier))
-            .build();
-
-        // Use custom DNS resolver to override the system DNS resolution.
-        DnsResolver dnsResolver = new SystemDefaultDnsResolver() {
-
-            @Override
-            public InetAddress[] resolve(final String host) throws UnknownHostException {
-                if (host.equalsIgnoreCase("myhost")) {
-                    return new InetAddress[] { InetAddress.getByAddress(new byte[] {127, 0, 0, 1}) };
-                } else {
-                    return super.resolve(host);
-                }
-            }
-
-        };
-
-        // Create I/O reactor configuration
-        IOReactorConfig ioReactorConfig = IOReactorConfig.custom()
-                .setIoThreadCount(Runtime.getRuntime().availableProcessors())
-                .setConnectTimeout(30000)
-                .setSoTimeout(30000)
-                .build();
-
-        // Create a custom I/O reactort
-        ConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(ioReactorConfig);
-
-        // Create a connection manager with custom configuration.
-        PoolingNHttpClientConnectionManager connManager = new PoolingNHttpClientConnectionManager(
-                ioReactor, connFactory, sessionStrategyRegistry, dnsResolver);
-
-        // Create message constraints
-        MessageConstraints messageConstraints = MessageConstraints.custom()
-            .setMaxHeaderCount(200)
-            .setMaxLineLength(2000)
-            .build();
-        // Create connection configuration
-        ConnectionConfig connectionConfig = ConnectionConfig.custom()
-            .setMalformedInputAction(CodingErrorAction.IGNORE)
-            .setUnmappableInputAction(CodingErrorAction.IGNORE)
-            .setCharset(Consts.UTF_8)
-            .setMessageConstraints(messageConstraints)
-            .build();
-        // Configure the connection manager to use connection configuration either
-        // by default or for a specific host.
-        connManager.setDefaultConnectionConfig(connectionConfig);
-        connManager.setConnectionConfig(new HttpHost("somehost", 80), ConnectionConfig.DEFAULT);
-
-        // Configure total max or per route limits for persistent connections
-        // that can be kept in the pool or leased by the connection manager.
-        connManager.setMaxTotal(100);
-        connManager.setDefaultMaxPerRoute(10);
-        connManager.setMaxPerRoute(new HttpRoute(new HttpHost("somehost", 80)), 20);
-
-        // Use custom cookie store if necessary.
-        CookieStore cookieStore = new BasicCookieStore();
-        // Use custom credentials provider if necessary.
-        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
-        // Create global request configuration
-        RequestConfig defaultRequestConfig = RequestConfig.custom()
-            .setCookieSpec(CookieSpecs.DEFAULT)
-            .setExpectContinueEnabled(true)
-            .setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM, AuthSchemes.DIGEST))
-            .setProxyPreferredAuthSchemes(Arrays.asList(AuthSchemes.BASIC))
-            .build();
-
-        // Create an HttpClient with the given custom dependencies and configuration.
-        CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom()
-            .setConnectionManager(connManager)
-            .setDefaultCookieStore(cookieStore)
-            .setDefaultCredentialsProvider(credentialsProvider)
-            .setProxy(new HttpHost("myproxy", 8080))
-            .setDefaultRequestConfig(defaultRequestConfig)
-            .build();
-
-        try {
-            HttpGet httpget = new HttpGet("http://localhost/");
-            // Request configuration can be overridden at the request level.
-            // They will take precedence over the one set at the client level.
-            RequestConfig requestConfig = RequestConfig.copy(defaultRequestConfig)
-                .setSocketTimeout(5000)
-                .setConnectTimeout(5000)
-                .setConnectionRequestTimeout(5000)
-                .setProxy(new HttpHost("myotherproxy", 8080))
-                .build();
-            httpget.setConfig(requestConfig);
-
-            // Execution context can be customized locally.
-            HttpClientContext localContext = HttpClientContext.create();
-            // Contextual attributes set the local context level will take
-            // precedence over those set at the client level.
-            localContext.setCookieStore(cookieStore);
-            localContext.setCredentialsProvider(credentialsProvider);
-
-            System.out.println("Executing request " + httpget.getRequestLine());
-
-            httpclient.start();
-
-            // Pass local context as a parameter
-            Future<HttpResponse> future = httpclient.execute(httpget, localContext, null);
-
-            // Please note that it may be unsafe to access HttpContext instance
-            // while the request is still being executed
-
-            HttpResponse response = future.get();
-            System.out.println("Response: " + response.getStatusLine());
-
-            // Once the request has been executed the local context can
-            // be used to examine updated state and various objects affected
-            // by the request execution.
-
-            // Last executed request
-            localContext.getRequest();
-            // Execution route
-            localContext.getHttpRoute();
-            // Target auth state
-            localContext.getTargetAuthState();
-            // Proxy auth state
-            localContext.getTargetAuthState();
-            // Cookie origin
-            localContext.getCookieOrigin();
-            // Cookie spec used
-            localContext.getCookieSpec();
-            // User security token
-            localContext.getUserToken();
-        } finally {
-            httpclient.close();
-        }
-    }
-
-}
-
diff --git a/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientCustomContext.java b/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientCustomContext.java
deleted file mode 100644
index 0e9e36a..0000000
--- a/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientCustomContext.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.http.examples.nio.client;
-
-import org.apache.http.HttpResponse;
-import org.apache.http.client.CookieStore;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.cookie.Cookie;
-import org.apache.http.impl.client.BasicCookieStore;
-import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
-import org.apache.http.impl.nio.client.HttpAsyncClients;
-
-import java.util.List;
-import java.util.concurrent.Future;
-
-/**
- * This example demonstrates the use of a local HTTP context populated with
- * custom attributes.
- */
-public class AsyncClientCustomContext {
-
-    public final static void main(String[] args) throws Exception {
-        CloseableHttpAsyncClient httpclient = HttpAsyncClients.createDefault();
-        try {
-            // Create a local instance of cookie store
-            CookieStore cookieStore = new BasicCookieStore();
-
-            // Create local HTTP context
-            HttpClientContext localContext = HttpClientContext.create();
-            // Bind custom cookie store to the local context
-            localContext.setCookieStore(cookieStore);
-
-            HttpGet httpget = new HttpGet("http://localhost/");
-            System.out.println("Executing request " + httpget.getRequestLine());
-
-            httpclient.start();
-
-            // Pass local context as a parameter
-            Future<HttpResponse> future = httpclient.execute(httpget, localContext, null);
-
-            // Please note that it may be unsafe to access HttpContext instance
-            // while the request is still being executed
-
-            HttpResponse response = future.get();
-            System.out.println("Response: " + response.getStatusLine());
-            List<Cookie> cookies = cookieStore.getCookies();
-            for (int i = 0; i < cookies.size(); i++) {
-                System.out.println("Local cookie: " + cookies.get(i));
-            }
-            System.out.println("Shutting down");
-        } finally {
-            httpclient.close();
-        }
-    }
-
-}
-
diff --git a/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientCustomSSL.java b/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientCustomSSL.java
deleted file mode 100644
index 200a330..0000000
--- a/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientCustomSSL.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.examples.nio.client;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.security.KeyStore;
-import java.util.concurrent.Future;
-
-import javax.net.ssl.SSLContext;
-
-import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
-import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
-import org.apache.http.impl.nio.client.HttpAsyncClients;
-import org.apache.http.nio.conn.ssl.SSLIOSessionStrategy;
-import org.apache.http.ssl.SSLContexts;
-
-/**
- * This example demonstrates how to create secure connections with a custom SSL
- * context.
- */
-public class AsyncClientCustomSSL {
-
-    public final static void main(String[] args) throws Exception {
-        KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());
-        FileInputStream instream = new FileInputStream(new File("my.keystore"));
-        try {
-            trustStore.load(instream, "nopassword".toCharArray());
-        } finally {
-            instream.close();
-        }
-        // Trust own CA and all self-signed certs
-        SSLContext sslcontext = SSLContexts.custom()
-                .loadTrustMaterial(trustStore, new TrustSelfSignedStrategy())
-                .build();
-        // Allow TLSv1 protocol only
-        SSLIOSessionStrategy sslSessionStrategy = new SSLIOSessionStrategy(
-                sslcontext,
-                new String[] { "TLSv1" },
-                null,
-                SSLIOSessionStrategy.getDefaultHostnameVerifier());
-        CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom()
-                .setSSLStrategy(sslSessionStrategy)
-                .build();
-        try {
-            httpclient.start();
-            HttpGet request = new HttpGet("https://issues.apache.org/");
-            Future<HttpResponse> future = httpclient.execute(request, null);
-            HttpResponse response = future.get();
-            System.out.println("Response: " + response.getStatusLine());
-            System.out.println("Shutting down");
-        } finally {
-            httpclient.close();
-        }
-        System.out.println("Done");
-    }
-
-}
diff --git a/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientEvictExpiredConnections.java b/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientEvictExpiredConnections.java
deleted file mode 100644
index 95adf13..0000000
--- a/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientEvictExpiredConnections.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.examples.nio.client;
-
-import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.concurrent.FutureCallback;
-import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
-import org.apache.http.impl.nio.client.HttpAsyncClients;
-import org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager;
-import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor;
-import org.apache.http.nio.conn.NHttpClientConnectionManager;
-import org.apache.http.nio.reactor.ConnectingIOReactor;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Example demonstrating how to evict expired and idle connections
- * from the connection pool.
- */
-public class AsyncClientEvictExpiredConnections {
-
-    public static void main(String[] args) throws Exception {
-        ConnectingIOReactor ioReactor = new DefaultConnectingIOReactor();
-        PoolingNHttpClientConnectionManager cm = new PoolingNHttpClientConnectionManager(ioReactor);
-        cm.setMaxTotal(100);
-        CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom()
-                .setConnectionManager(cm)
-                .build();
-        try {
-            httpclient.start();
-
-            // create an array of URIs to perform GETs on
-            String[] urisToGet = {
-                "http://hc.apache.org/",
-                "http://hc.apache.org/httpcomponents-core-ga/",
-                "http://hc.apache.org/httpcomponents-client-ga/",
-            };
-
-            IdleConnectionEvictor connEvictor = new IdleConnectionEvictor(cm);
-            connEvictor.start();
-
-            final CountDownLatch latch = new CountDownLatch(urisToGet.length);
-            for (final String uri: urisToGet) {
-                final HttpGet httpget = new HttpGet(uri);
-                httpclient.execute(httpget, new FutureCallback<HttpResponse>() {
-
-                    @Override
-                    public void completed(final HttpResponse response) {
-                        latch.countDown();
-                        System.out.println(httpget.getRequestLine() + "->" + response.getStatusLine());
-                    }
-
-                    @Override
-                    public void failed(final Exception ex) {
-                        latch.countDown();
-                        System.out.println(httpget.getRequestLine() + "->" + ex);
-                    }
-
-                    @Override
-                    public void cancelled() {
-                        latch.countDown();
-                        System.out.println(httpget.getRequestLine() + " cancelled");
-                    }
-
-                });
-            }
-            latch.await();
-
-            // Sleep 10 sec and let the connection evictor do its job
-            Thread.sleep(20000);
-
-            // Shut down the evictor thread
-            connEvictor.shutdown();
-            connEvictor.join();
-
-        } finally {
-            httpclient.close();
-        }
-    }
-
-    public static class IdleConnectionEvictor extends Thread {
-
-        private final NHttpClientConnectionManager connMgr;
-
-        private volatile boolean shutdown;
-
-        public IdleConnectionEvictor(NHttpClientConnectionManager connMgr) {
-            super();
-            this.connMgr = connMgr;
-        }
-
-        @Override
-        public void run() {
-            try {
-                while (!shutdown) {
-                    synchronized (this) {
-                        wait(5000);
-                        // Close expired connections
-                        connMgr.closeExpiredConnections();
-                        // Optionally, close connections
-                        // that have been idle longer than 5 sec
-                        connMgr.closeIdleConnections(5, TimeUnit.SECONDS);
-                    }
-                }
-            } catch (InterruptedException ex) {
-                // terminate
-            }
-        }
-
-        public void shutdown() {
-            shutdown = true;
-            synchronized (this) {
-                notifyAll();
-            }
-        }
-
-    }
-
-}
diff --git a/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientExecuteProxy.java b/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientExecuteProxy.java
deleted file mode 100644
index b525e91..0000000
--- a/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientExecuteProxy.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.http.examples.nio.client;
-
-import java.util.concurrent.Future;
-
-import org.apache.http.HttpHost;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
-import org.apache.http.impl.nio.client.HttpAsyncClients;
-
-/**
- * This example demonstrates a basic asynchronous HTTP request / response exchange
- * via an HTTP proxy.
- */
-public class AsyncClientExecuteProxy {
-
-    public static void main(String[] args)throws Exception {
-        CloseableHttpAsyncClient httpclient = HttpAsyncClients.createDefault();
-        try {
-            httpclient.start();
-            HttpHost proxy = new HttpHost("someproxy", 8080);
-            RequestConfig config = RequestConfig.custom()
-                    .setProxy(proxy)
-                    .build();
-            HttpGet request = new HttpGet("https://issues.apache.org/");
-            request.setConfig(config);
-            Future<HttpResponse> future = httpclient.execute(request, null);
-            HttpResponse response = future.get();
-            System.out.println("Response: " + response.getStatusLine());
-            System.out.println("Shutting down");
-        } finally {
-            httpclient.close();
-        }
-    }
-
-}
diff --git a/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientHttpExchange.java b/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientHttpExchange.java
deleted file mode 100644
index ded5d79..0000000
--- a/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientHttpExchange.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.examples.nio.client;
-
-import java.util.concurrent.Future;
-
-import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
-import org.apache.http.impl.nio.client.HttpAsyncClients;
-
-/**
- * This example demonstrates a basic asynchronous HTTP request / response exchange.
- * Response content is buffered in memory for simplicity.
- */
-public class AsyncClientHttpExchange {
-
-    public static void main(final String[] args) throws Exception {
-        CloseableHttpAsyncClient httpclient = HttpAsyncClients.createDefault();
-        try {
-            httpclient.start();
-            HttpGet request = new HttpGet("http://www.apache.org/");
-            Future<HttpResponse> future = httpclient.execute(request, null);
-            HttpResponse response = future.get();
-            System.out.println("Response: " + response.getStatusLine());
-            System.out.println("Shutting down");
-        } finally {
-            httpclient.close();
-        }
-        System.out.println("Done");
-    }
-
-}
diff --git a/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientHttpExchangeFutureCallback.java b/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientHttpExchangeFutureCallback.java
deleted file mode 100644
index 2693608..0000000
--- a/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientHttpExchangeFutureCallback.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.examples.nio.client;
-
-import java.util.concurrent.CountDownLatch;
-
-import org.apache.http.HttpResponse;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.concurrent.FutureCallback;
-import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
-import org.apache.http.impl.nio.client.HttpAsyncClients;
-
-/**
- * This example demonstrates a fully asynchronous execution of multiple HTTP exchanges
- * where the result of an individual operation is reported using a callback interface.
- */
-public class AsyncClientHttpExchangeFutureCallback {
-
-    public static void main(final String[] args) throws Exception {
-        RequestConfig requestConfig = RequestConfig.custom()
-            .setSocketTimeout(3000)
-            .setConnectTimeout(3000).build();
-        CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom()
-            .setDefaultRequestConfig(requestConfig)
-            .build();
-        try {
-            httpclient.start();
-            final HttpGet[] requests = new HttpGet[] {
-                    new HttpGet("http://www.apache.org/"),
-                    new HttpGet("https://www.verisign.com/"),
-                    new HttpGet("http://www.google.com/")
-            };
-            final CountDownLatch latch = new CountDownLatch(requests.length);
-            for (final HttpGet request: requests) {
-                httpclient.execute(request, new FutureCallback<HttpResponse>() {
-
-                    @Override
-                    public void completed(final HttpResponse response) {
-                        latch.countDown();
-                        System.out.println(request.getRequestLine() + "->" + response.getStatusLine());
-                    }
-
-                    @Override
-                    public void failed(final Exception ex) {
-                        latch.countDown();
-                        System.out.println(request.getRequestLine() + "->" + ex);
-                    }
-
-                    @Override
-                    public void cancelled() {
-                        latch.countDown();
-                        System.out.println(request.getRequestLine() + " cancelled");
-                    }
-
-                });
-            }
-            latch.await();
-            System.out.println("Shutting down");
-        } finally {
-            httpclient.close();
-        }
-        System.out.println("Done");
-    }
-
-}
diff --git a/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientHttpExchangeStreaming.java b/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientHttpExchangeStreaming.java
deleted file mode 100644
index 6173f81..0000000
--- a/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientHttpExchangeStreaming.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.examples.nio.client;
-
-import java.io.IOException;
-import java.nio.CharBuffer;
-import java.util.concurrent.Future;
-
-import org.apache.http.HttpResponse;
-import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
-import org.apache.http.impl.nio.client.HttpAsyncClients;
-import org.apache.http.nio.IOControl;
-import org.apache.http.nio.client.methods.AsyncCharConsumer;
-import org.apache.http.nio.client.methods.HttpAsyncMethods;
-import org.apache.http.protocol.HttpContext;
-
-/**
- * This example demonstrates an asynchronous HTTP request / response exchange with
- * a full content streaming.
- */
-public class AsyncClientHttpExchangeStreaming {
-
-    public static void main(final String[] args) throws Exception {
-        CloseableHttpAsyncClient httpclient = HttpAsyncClients.createDefault();
-        try {
-            httpclient.start();
-            Future<Boolean> future = httpclient.execute(
-                    HttpAsyncMethods.createGet("http://localhost:8080/"),
-                    new MyResponseConsumer(), null);
-            Boolean result = future.get();
-            if (result != null && result.booleanValue()) {
-                System.out.println("Request successfully executed");
-            } else {
-                System.out.println("Request failed");
-            }
-            System.out.println("Shutting down");
-        } finally {
-            httpclient.close();
-        }
-        System.out.println("Done");
-    }
-
-    static class MyResponseConsumer extends AsyncCharConsumer<Boolean> {
-
-        @Override
-        protected void onResponseReceived(final HttpResponse response) {
-        }
-
-        @Override
-        protected void onCharReceived(final CharBuffer buf, final IOControl ioctrl) throws IOException {
-            while (buf.hasRemaining()) {
-                System.out.print(buf.get());
-            }
-        }
-
-        @Override
-        protected void releaseResources() {
-        }
-
-        @Override
-        protected Boolean buildResult(final HttpContext context) {
-            return Boolean.TRUE;
-        }
-
-    }
-
-}
diff --git a/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientPipelined.java b/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientPipelined.java
deleted file mode 100644
index def5f45..0000000
--- a/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientPipelined.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.examples.nio.client;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.concurrent.Future;
-
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.nio.client.CloseableHttpPipeliningClient;
-import org.apache.http.impl.nio.client.HttpAsyncClients;
-
-/**
- * This example demonstrates a pipelinfed execution of multiple HTTP request / response exchanges
- * Response content is buffered in memory for simplicity.
- */
-public class AsyncClientPipelined {
-
-    public static void main(final String[] args) throws Exception {
-        CloseableHttpPipeliningClient httpclient = HttpAsyncClients.createPipelining();
-        try {
-            httpclient.start();
-
-            HttpHost targetHost = new HttpHost("localhost", 8080);
-            HttpGet[] resquests = {
-                    new HttpGet("/docs/index.html"),
-                    new HttpGet("/docs/introduction.html"),
-                    new HttpGet("/docs/setup.html"),
-                    new HttpGet("/docs/config/index.html")
-            };
-
-            Future<List<HttpResponse>> future = httpclient.execute(targetHost,
-                    Arrays.<HttpRequest>asList(resquests), null);
-            List<HttpResponse> responses = future.get();
-            System.out.println(responses);
-
-            System.out.println("Shutting down");
-        } finally {
-            httpclient.close();
-        }
-        System.out.println("Done");
-    }
-
-}
diff --git a/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientPipelinedStreaming.java b/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientPipelinedStreaming.java
deleted file mode 100644
index 087bf47..0000000
--- a/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientPipelinedStreaming.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.examples.nio.client;
-
-import java.io.IOException;
-import java.nio.CharBuffer;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.Future;
-
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.nio.client.CloseableHttpPipeliningClient;
-import org.apache.http.impl.nio.client.HttpAsyncClients;
-import org.apache.http.nio.IOControl;
-import org.apache.http.nio.client.methods.AsyncCharConsumer;
-import org.apache.http.nio.protocol.BasicAsyncRequestProducer;
-import org.apache.http.protocol.HttpContext;
-
-/**
- * This example demonstrates a pipelinfed execution of multiple HTTP request / response exchanges
- * with a full content streaming.
- */
-public class AsyncClientPipelinedStreaming {
-
-    public static void main(final String[] args) throws Exception {
-        CloseableHttpPipeliningClient httpclient = HttpAsyncClients.createPipelining();
-        try {
-            httpclient.start();
-
-            HttpHost targetHost = new HttpHost("localhost", 8080);
-            HttpGet[] resquests = {
-                    new HttpGet("/docs/index.html"),
-                    new HttpGet("/docs/introduction.html"),
-                    new HttpGet("/docs/setup.html"),
-                    new HttpGet("/docs/config/index.html")
-            };
-
-            List<MyRequestProducer> requestProducers = new ArrayList<MyRequestProducer>();
-            List<MyResponseConsumer> responseConsumers = new ArrayList<MyResponseConsumer>();
-            for (HttpGet request: resquests) {
-                requestProducers.add(new MyRequestProducer(targetHost, request));
-                responseConsumers.add(new MyResponseConsumer(request));
-            }
-
-            Future<List<Boolean>> future = httpclient.execute(
-                    targetHost, requestProducers, responseConsumers, null);
-            future.get();
-            System.out.println("Shutting down");
-        } finally {
-            httpclient.close();
-        }
-        System.out.println("Done");
-    }
-
-    static class MyRequestProducer extends BasicAsyncRequestProducer {
-
-        private final HttpRequest request;
-
-        MyRequestProducer(final HttpHost target, final HttpRequest request) {
-            super(target, request);
-            this.request = request;
-        }
-
-        @Override
-        public void requestCompleted(final HttpContext context) {
-            super.requestCompleted(context);
-            System.out.println();
-            System.out.println("Request sent: " + this.request.getRequestLine());
-            System.out.println("=================================================");
-        }
-    }
-
-    static class MyResponseConsumer extends AsyncCharConsumer<Boolean> {
-
-        private final HttpRequest request;
-
-        MyResponseConsumer(final HttpRequest request) {
-            this.request = request;
-        }
-
-        @Override
-        protected void onResponseReceived(final HttpResponse response) {
-            System.out.println();
-            System.out.println("Response received: " + response.getStatusLine() + " -> " + this.request.getRequestLine());
-            System.out.println("=================================================");
-        }
-
-        @Override
-        protected void onCharReceived(final CharBuffer buf, final IOControl ioctrl) throws IOException {
-            while (buf.hasRemaining()) {
-                System.out.print(buf.get());
-            }
-        }
-
-        @Override
-        protected void releaseResources() {
-        }
-
-        @Override
-        protected Boolean buildResult(final HttpContext context) {
-            System.out.println();
-            System.out.println("=================================================");
-            System.out.println();
-            return Boolean.TRUE;
-        }
-
-    }
-
-}
diff --git a/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientProxyAuthentication.java b/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientProxyAuthentication.java
deleted file mode 100644
index d0d3ae9..0000000
--- a/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientProxyAuthentication.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.http.examples.nio.client;
-
-import org.apache.http.HttpHost;
-import org.apache.http.HttpResponse;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.UsernamePasswordCredentials;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.client.BasicCredentialsProvider;
-import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
-import org.apache.http.impl.nio.client.HttpAsyncClients;
-
-import java.util.concurrent.Future;
-
-/**
- * This example demonstrates a basic asynchronous HTTP request / response exchange
- * over a secure connection tunneled through an authenticating proxy.
- */
-public class AsyncClientProxyAuthentication {
-
-    public static void main(String[] args)throws Exception {
-        CredentialsProvider credsProvider = new BasicCredentialsProvider();
-        credsProvider.setCredentials(
-                new AuthScope("someproxy", 8080),
-                new UsernamePasswordCredentials("username", "password"));
-        CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom()
-                .setDefaultCredentialsProvider(credsProvider)
-                .build();
-        try {
-            httpclient.start();
-            HttpHost proxy = new HttpHost("someproxy", 8080);
-            RequestConfig config = RequestConfig.custom()
-                    .setProxy(proxy)
-                    .build();
-            HttpGet httpget = new HttpGet("https://issues.apache.org/");
-            httpget.setConfig(config);
-            Future<HttpResponse> future = httpclient.execute(httpget, null);
-            HttpResponse response = future.get();
-            System.out.println("Response: " + response.getStatusLine());
-            System.out.println("Shutting down");
-        } finally {
-            httpclient.close();
-        }
-    }
-
-}
diff --git a/httpasyncclient/src/examples/org/apache/http/examples/nio/client/QuickStart.java b/httpasyncclient/src/examples/org/apache/http/examples/nio/client/QuickStart.java
deleted file mode 100644
index 73a8771..0000000
--- a/httpasyncclient/src/examples/org/apache/http/examples/nio/client/QuickStart.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.examples.nio.client;
-
-import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.concurrent.FutureCallback;
-import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
-import org.apache.http.impl.nio.client.HttpAsyncClients;
-import org.apache.http.nio.IOControl;
-import org.apache.http.nio.client.methods.AsyncCharConsumer;
-import org.apache.http.nio.client.methods.HttpAsyncMethods;
-import org.apache.http.nio.protocol.HttpAsyncRequestProducer;
-import org.apache.http.protocol.HttpContext;
-
-import java.io.IOException;
-import java.nio.CharBuffer;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.Future;
-
-public class QuickStart {
-
-    public static void main(String[] args) throws Exception {
-        CloseableHttpAsyncClient httpclient = HttpAsyncClients.createDefault();
-        try {
-            // Start the client
-            httpclient.start();
-
-            // Execute request
-            final HttpGet request1 = new HttpGet("http://www.apache.org/");
-            Future<HttpResponse> future = httpclient.execute(request1, null);
-            // and wait until response is received
-            HttpResponse response1 = future.get();
-            System.out.println(request1.getRequestLine() + "->" + response1.getStatusLine());
-
-            // One most likely would want to use a callback for operation result
-            final CountDownLatch latch1 = new CountDownLatch(1);
-            final HttpGet request2 = new HttpGet("http://www.apache.org/");
-            httpclient.execute(request2, new FutureCallback<HttpResponse>() {
-
-                @Override
-                public void completed(final HttpResponse response2) {
-                    latch1.countDown();
-                    System.out.println(request2.getRequestLine() + "->" + response2.getStatusLine());
-                }
-
-                @Override
-                public void failed(final Exception ex) {
-                    latch1.countDown();
-                    System.out.println(request2.getRequestLine() + "->" + ex);
-                }
-
-                @Override
-                public void cancelled() {
-                    latch1.countDown();
-                    System.out.println(request2.getRequestLine() + " cancelled");
-                }
-
-            });
-            latch1.await();
-
-            // In real world one most likely would want also want to stream
-            // request and response body content
-            final CountDownLatch latch2 = new CountDownLatch(1);
-            final HttpGet request3 = new HttpGet("http://www.apache.org/");
-            HttpAsyncRequestProducer producer3 = HttpAsyncMethods.create(request3);
-            AsyncCharConsumer<HttpResponse> consumer3 = new AsyncCharConsumer<HttpResponse>() {
-
-                HttpResponse response;
-
-                @Override
-                protected void onResponseReceived(final HttpResponse response) {
-                    this.response = response;
-                }
-
-                @Override
-                protected void onCharReceived(final CharBuffer buf, final IOControl ioctrl) throws IOException {
-                    // Do something useful
-                }
-
-                @Override
-                protected void releaseResources() {
-                }
-
-                @Override
-                protected HttpResponse buildResult(final HttpContext context) {
-                    return this.response;
-                }
-
-            };
-            httpclient.execute(producer3, consumer3, new FutureCallback<HttpResponse>() {
-
-                @Override
-                public void completed(final HttpResponse response3) {
-                    latch2.countDown();
-                    System.out.println(request2.getRequestLine() + "->" + response3.getStatusLine());
-                }
-
-                @Override
-                public void failed(final Exception ex) {
-                    latch2.countDown();
-                    System.out.println(request2.getRequestLine() + "->" + ex);
-                }
-
-                @Override
-                public void cancelled() {
-                    latch2.countDown();
-                    System.out.println(request2.getRequestLine() + " cancelled");
-                }
-
-            });
-            latch2.await();
-
-        } finally {
-            httpclient.close();
-        }
-    }
-
-}
diff --git a/httpasyncclient/src/examples/org/apache/http/examples/nio/client/ZeroCopyHttpExchange.java b/httpasyncclient/src/examples/org/apache/http/examples/nio/client/ZeroCopyHttpExchange.java
deleted file mode 100644
index 045805e..0000000
--- a/httpasyncclient/src/examples/org/apache/http/examples/nio/client/ZeroCopyHttpExchange.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.examples.nio.client;
-
-import java.io.File;
-import java.util.concurrent.Future;
-
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.ClientProtocolException;
-import org.apache.http.entity.ContentType;
-import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
-import org.apache.http.impl.nio.client.HttpAsyncClients;
-import org.apache.http.nio.client.methods.ZeroCopyConsumer;
-import org.apache.http.nio.client.methods.ZeroCopyPost;
-
-/**
- * This example demonstrates how HttpAsyncClient can be used to upload or download files
- * without creating an intermediate content buffer in memory (zero copy file transfer).
- */
-public class ZeroCopyHttpExchange {
-
-    public static void main(final String[] args) throws Exception {
-        CloseableHttpAsyncClient httpclient = HttpAsyncClients.createDefault();
-        try {
-            httpclient.start();
-            File upload = new File(args[0]);
-            File download = new File(args[1]);
-            ZeroCopyPost httpost = new ZeroCopyPost("http://localhost:8080/", upload,
-                    ContentType.create("text/plain"));
-            ZeroCopyConsumer<File> consumer = new ZeroCopyConsumer<File>(download) {
-
-                @Override
-                protected File process(
-                        final HttpResponse response,
-                        final File file,
-                        final ContentType contentType) throws Exception {
-                    if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
-                        throw new ClientProtocolException("Upload failed: " + response.getStatusLine());
-                    }
-                    return file;
-                }
-
-            };
-            Future<File> future = httpclient.execute(httpost, consumer, null);
-            File result = future.get();
-            System.out.println("Response file length: " + result.length());
-            System.out.println("Shutting down");
-        } finally {
-            httpclient.close();
-        }
-        System.out.println("Done");
-    }
-
-}
diff --git a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/client/AbstractHttpAsyncClient.java b/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/client/AbstractHttpAsyncClient.java
deleted file mode 100644
index 78aee8b..0000000
--- a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/client/AbstractHttpAsyncClient.java
+++ /dev/null
@@ -1,611 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.client;
-
-import java.io.IOException;
-import java.net.URI;
-import java.util.Queue;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.Future;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.http.ConnectionReuseStrategy;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpRequestInterceptor;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpResponseInterceptor;
-import org.apache.http.auth.AuthSchemeRegistry;
-import org.apache.http.client.AuthenticationStrategy;
-import org.apache.http.client.ClientProtocolException;
-import org.apache.http.client.CookieStore;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.client.RedirectStrategy;
-import org.apache.http.client.UserTokenHandler;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.client.params.AuthPolicy;
-import org.apache.http.client.params.CookiePolicy;
-import org.apache.http.client.protocol.ClientContext;
-import org.apache.http.client.utils.URIUtils;
-import org.apache.http.concurrent.BasicFuture;
-import org.apache.http.concurrent.FutureCallback;
-import org.apache.http.conn.ConnectionKeepAliveStrategy;
-import org.apache.http.conn.routing.HttpRoutePlanner;
-import org.apache.http.cookie.CookieSpecRegistry;
-import org.apache.http.impl.DefaultConnectionReuseStrategy;
-import org.apache.http.impl.auth.BasicSchemeFactory;
-import org.apache.http.impl.auth.DigestSchemeFactory;
-import org.apache.http.impl.auth.KerberosSchemeFactory;
-import org.apache.http.impl.auth.NTLMSchemeFactory;
-import org.apache.http.impl.auth.SPNegoSchemeFactory;
-import org.apache.http.impl.client.BasicCookieStore;
-import org.apache.http.impl.client.BasicCredentialsProvider;
-import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy;
-import org.apache.http.impl.client.DefaultRedirectStrategy;
-import org.apache.http.impl.client.DefaultUserTokenHandler;
-import org.apache.http.impl.client.ProxyAuthenticationStrategy;
-import org.apache.http.impl.client.TargetAuthenticationStrategy;
-import org.apache.http.impl.cookie.BestMatchSpecFactory;
-import org.apache.http.impl.cookie.BrowserCompatSpecFactory;
-import org.apache.http.impl.cookie.IgnoreSpecFactory;
-import org.apache.http.impl.cookie.NetscapeDraftSpecFactory;
-import org.apache.http.impl.cookie.RFC2109SpecFactory;
-import org.apache.http.impl.cookie.RFC2965SpecFactory;
-import org.apache.http.impl.nio.DefaultHttpClientIODispatch;
-import org.apache.http.impl.nio.conn.DefaultHttpAsyncRoutePlanner;
-import org.apache.http.impl.nio.conn.PoolingClientAsyncConnectionManager;
-import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor;
-import org.apache.http.impl.nio.reactor.IOReactorConfig;
-import org.apache.http.nio.client.HttpAsyncClient;
-import org.apache.http.nio.client.methods.HttpAsyncMethods;
-import org.apache.http.nio.conn.ClientAsyncConnectionManager;
-import org.apache.http.nio.protocol.HttpAsyncRequestExecutionHandler;
-import org.apache.http.nio.protocol.HttpAsyncRequestExecutor;
-import org.apache.http.nio.protocol.HttpAsyncRequestProducer;
-import org.apache.http.nio.protocol.HttpAsyncResponseConsumer;
-import org.apache.http.nio.reactor.IOEventDispatch;
-import org.apache.http.nio.reactor.IOReactorException;
-import org.apache.http.nio.reactor.IOReactorStatus;
-import org.apache.http.params.HttpParams;
-import org.apache.http.protocol.BasicHttpContext;
-import org.apache.http.protocol.BasicHttpProcessor;
-import org.apache.http.protocol.DefaultedHttpContext;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.protocol.HttpProcessor;
-import org.apache.http.protocol.ImmutableHttpProcessor;
-
-@Deprecated
-public abstract class AbstractHttpAsyncClient implements HttpAsyncClient {
-
-    private final Log log = LogFactory.getLog(getClass());
-    private final ClientAsyncConnectionManager connmgr;
-    private final Queue<HttpAsyncRequestExecutionHandler<?>> queue;
-
-    private Thread reactorThread;
-    private BasicHttpProcessor mutableProcessor;
-    private ImmutableHttpProcessor protocolProcessor;
-    private ConnectionReuseStrategy reuseStrategy;
-    private ConnectionKeepAliveStrategy keepAliveStrategy;
-    private RedirectStrategy redirectStrategy;
-    private CookieSpecRegistry supportedCookieSpecs;
-    private CookieStore cookieStore;
-    private AuthSchemeRegistry supportedAuthSchemes;
-    private AuthenticationStrategy targetAuthStrategy;
-    private AuthenticationStrategy proxyAuthStrategy;
-    private CredentialsProvider credsProvider;
-    private HttpRoutePlanner routePlanner;
-    private UserTokenHandler userTokenHandler;
-    private HttpParams params;
-
-    private volatile boolean terminated;
-
-    protected AbstractHttpAsyncClient(final ClientAsyncConnectionManager connmgr) {
-        super();
-        this.connmgr = connmgr;
-        this.queue = new ConcurrentLinkedQueue<HttpAsyncRequestExecutionHandler<?>>();
-    }
-
-    protected AbstractHttpAsyncClient(final IOReactorConfig config) throws IOReactorException {
-        super();
-        final DefaultConnectingIOReactor defaultioreactor = new DefaultConnectingIOReactor(config);
-        defaultioreactor.setExceptionHandler(new InternalIOReactorExceptionHandler(this.log));
-        this.connmgr = new PoolingClientAsyncConnectionManager(defaultioreactor);
-        this.queue = new ConcurrentLinkedQueue<HttpAsyncRequestExecutionHandler<?>>();
-    }
-
-    protected abstract HttpParams createHttpParams();
-
-    protected abstract BasicHttpProcessor createHttpProcessor();
-
-    protected HttpContext createHttpContext() {
-        final HttpContext context = new BasicHttpContext();
-        context.setAttribute(
-                ClientContext.SCHEME_REGISTRY,
-                getConnectionManager().getSchemeRegistry());
-        context.setAttribute(
-                ClientContext.AUTHSCHEME_REGISTRY,
-                getAuthSchemes());
-        context.setAttribute(
-                ClientContext.COOKIESPEC_REGISTRY,
-                getCookieSpecs());
-        context.setAttribute(
-                ClientContext.COOKIE_STORE,
-                getCookieStore());
-        context.setAttribute(
-                ClientContext.CREDS_PROVIDER,
-                getCredentialsProvider());
-        return context;
-    }
-
-    protected ConnectionReuseStrategy createConnectionReuseStrategy() {
-        return new DefaultConnectionReuseStrategy();
-    }
-
-    protected ConnectionKeepAliveStrategy createConnectionKeepAliveStrategy() {
-        return new DefaultConnectionKeepAliveStrategy();
-    }
-
-    protected AuthSchemeRegistry createAuthSchemeRegistry() {
-        final AuthSchemeRegistry registry = new AuthSchemeRegistry();
-        registry.register(
-                AuthPolicy.BASIC,
-                new BasicSchemeFactory());
-        registry.register(
-                AuthPolicy.DIGEST,
-                new DigestSchemeFactory());
-        registry.register(
-                AuthPolicy.NTLM,
-                new NTLMSchemeFactory());
-        registry.register(
-                AuthPolicy.SPNEGO,
-                new SPNegoSchemeFactory());
-        registry.register(
-                AuthPolicy.KERBEROS,
-                new KerberosSchemeFactory());
-        return registry;
-    }
-
-    protected CookieSpecRegistry createCookieSpecRegistry() {
-        final CookieSpecRegistry registry = new CookieSpecRegistry();
-        registry.register(
-                CookiePolicy.BEST_MATCH,
-                new BestMatchSpecFactory());
-        registry.register(
-                CookiePolicy.BROWSER_COMPATIBILITY,
-                new BrowserCompatSpecFactory());
-        registry.register(
-                CookiePolicy.NETSCAPE,
-                new NetscapeDraftSpecFactory());
-        registry.register(
-                CookiePolicy.RFC_2109,
-                new RFC2109SpecFactory());
-        registry.register(
-                CookiePolicy.RFC_2965,
-                new RFC2965SpecFactory());
-        registry.register(
-                CookiePolicy.IGNORE_COOKIES,
-                new IgnoreSpecFactory());
-        return registry;
-    }
-
-    protected AuthenticationStrategy createTargetAuthenticationStrategy() {
-        return new TargetAuthenticationStrategy();
-    }
-
-    protected AuthenticationStrategy createProxyAuthenticationStrategy() {
-        return new ProxyAuthenticationStrategy();
-    }
-
-    protected CookieStore createCookieStore() {
-        return new BasicCookieStore();
-    }
-
-    protected CredentialsProvider createCredentialsProvider() {
-        return new BasicCredentialsProvider();
-    }
-
-    protected HttpRoutePlanner createHttpRoutePlanner() {
-        return new DefaultHttpAsyncRoutePlanner(getConnectionManager().getSchemeRegistry());
-    }
-
-    protected UserTokenHandler createUserTokenHandler() {
-        return new DefaultUserTokenHandler();
-    }
-
-    public synchronized final HttpParams getParams() {
-        if (this.params == null) {
-            this.params = createHttpParams();
-        }
-        return this.params;
-    }
-
-    public synchronized void setParams(final HttpParams params) {
-        this.params = params;
-    }
-
-    public synchronized ClientAsyncConnectionManager getConnectionManager() {
-        return this.connmgr;
-    }
-
-    public synchronized final ConnectionReuseStrategy getConnectionReuseStrategy() {
-        if (this.reuseStrategy == null) {
-            this.reuseStrategy = createConnectionReuseStrategy();
-        }
-        return this.reuseStrategy;
-    }
-
-    public synchronized void setReuseStrategy(final ConnectionReuseStrategy reuseStrategy) {
-        this.reuseStrategy = reuseStrategy;
-    }
-
-    public synchronized final ConnectionKeepAliveStrategy getConnectionKeepAliveStrategy() {
-        if (this.keepAliveStrategy == null) {
-            this.keepAliveStrategy = createConnectionKeepAliveStrategy();
-        }
-        return this.keepAliveStrategy;
-    }
-
-    public synchronized void setKeepAliveStrategy(final ConnectionKeepAliveStrategy keepAliveStrategy) {
-        this.keepAliveStrategy = keepAliveStrategy;
-    }
-
-    public synchronized final RedirectStrategy getRedirectStrategy() {
-        if (this.redirectStrategy == null) {
-            this.redirectStrategy = new DefaultRedirectStrategy();
-        }
-        return this.redirectStrategy;
-    }
-
-    public synchronized void setRedirectStrategy(final RedirectStrategy redirectStrategy) {
-        this.redirectStrategy = redirectStrategy;
-    }
-
-    public synchronized final AuthSchemeRegistry getAuthSchemes() {
-        if (this.supportedAuthSchemes == null) {
-            this.supportedAuthSchemes = createAuthSchemeRegistry();
-        }
-        return this.supportedAuthSchemes;
-    }
-
-    public synchronized void setAuthSchemes(final AuthSchemeRegistry authSchemeRegistry) {
-        this.supportedAuthSchemes = authSchemeRegistry;
-    }
-
-    public synchronized final CookieSpecRegistry getCookieSpecs() {
-        if (this.supportedCookieSpecs == null) {
-            this.supportedCookieSpecs = createCookieSpecRegistry();
-        }
-        return this.supportedCookieSpecs;
-    }
-
-    public synchronized void setCookieSpecs(final CookieSpecRegistry cookieSpecRegistry) {
-        this.supportedCookieSpecs = cookieSpecRegistry;
-    }
-
-    public synchronized final AuthenticationStrategy getTargetAuthenticationStrategy() {
-        if (this.targetAuthStrategy == null) {
-            this.targetAuthStrategy = createTargetAuthenticationStrategy();
-        }
-        return this.targetAuthStrategy;
-    }
-
-    public synchronized void setTargetAuthenticationStrategy(
-            final AuthenticationStrategy targetAuthStrategy) {
-        this.targetAuthStrategy = targetAuthStrategy;
-    }
-
-    public synchronized final AuthenticationStrategy getProxyAuthenticationStrategy() {
-        if (this.proxyAuthStrategy == null) {
-            this.proxyAuthStrategy = createProxyAuthenticationStrategy();
-        }
-        return this.proxyAuthStrategy;
-    }
-
-    public synchronized void setProxyAuthenticationStrategy(
-            final AuthenticationStrategy proxyAuthStrategy) {
-        this.proxyAuthStrategy = proxyAuthStrategy;
-    }
-
-    public synchronized final CookieStore getCookieStore() {
-        if (this.cookieStore == null) {
-            this.cookieStore = createCookieStore();
-        }
-        return this.cookieStore;
-    }
-
-    public synchronized void setCookieStore(final CookieStore cookieStore) {
-        this.cookieStore = cookieStore;
-    }
-
-    public synchronized final CredentialsProvider getCredentialsProvider() {
-        if (this.credsProvider == null) {
-            this.credsProvider = createCredentialsProvider();
-        }
-        return this.credsProvider;
-    }
-
-    public synchronized void setCredentialsProvider(final CredentialsProvider credsProvider) {
-        this.credsProvider = credsProvider;
-    }
-
-    public synchronized final HttpRoutePlanner getRoutePlanner() {
-        if (this.routePlanner == null) {
-            this.routePlanner = createHttpRoutePlanner();
-        }
-        return this.routePlanner;
-    }
-
-    public synchronized void setRoutePlanner(final HttpRoutePlanner routePlanner) {
-        this.routePlanner = routePlanner;
-    }
-
-    public synchronized final UserTokenHandler getUserTokenHandler() {
-        if (this.userTokenHandler == null) {
-            this.userTokenHandler = createUserTokenHandler();
-        }
-        return this.userTokenHandler;
-    }
-
-
-    public synchronized void setUserTokenHandler(final UserTokenHandler userTokenHandler) {
-        this.userTokenHandler = userTokenHandler;
-    }
-
-    protected synchronized final BasicHttpProcessor getHttpProcessor() {
-        if (this.mutableProcessor == null) {
-            this.mutableProcessor = createHttpProcessor();
-        }
-        return this.mutableProcessor;
-    }
-
-    private synchronized final HttpProcessor getProtocolProcessor() {
-        if (this.protocolProcessor == null) {
-            // Get mutable HTTP processor
-            final BasicHttpProcessor proc = getHttpProcessor();
-            // and upgrade an immutable copy of it
-            final int reqc = proc.getRequestInterceptorCount();
-            final HttpRequestInterceptor[] reqinterceptors = new HttpRequestInterceptor[reqc];
-            for (int i = 0; i < reqc; i++) {
-                reqinterceptors[i] = proc.getRequestInterceptor(i);
-            }
-            final int resc = proc.getResponseInterceptorCount();
-            final HttpResponseInterceptor[] resinterceptors = new HttpResponseInterceptor[resc];
-            for (int i = 0; i < resc; i++) {
-                resinterceptors[i] = proc.getResponseInterceptor(i);
-            }
-            this.protocolProcessor = new ImmutableHttpProcessor(reqinterceptors, resinterceptors);
-        }
-        return this.protocolProcessor;
-    }
-
-    public synchronized int getResponseInterceptorCount() {
-        return getHttpProcessor().getResponseInterceptorCount();
-    }
-
-    public synchronized HttpResponseInterceptor getResponseInterceptor(final int index) {
-        return getHttpProcessor().getResponseInterceptor(index);
-    }
-
-    public synchronized HttpRequestInterceptor getRequestInterceptor(final int index) {
-        return getHttpProcessor().getRequestInterceptor(index);
-    }
-
-    public synchronized int getRequestInterceptorCount() {
-        return getHttpProcessor().getRequestInterceptorCount();
-    }
-
-    public synchronized void addResponseInterceptor(final HttpResponseInterceptor itcp) {
-        getHttpProcessor().addInterceptor(itcp);
-        this.protocolProcessor = null;
-    }
-
-    public synchronized void addResponseInterceptor(final HttpResponseInterceptor itcp, final int index) {
-        getHttpProcessor().addInterceptor(itcp, index);
-        this.protocolProcessor = null;
-    }
-
-    public synchronized void clearResponseInterceptors() {
-        getHttpProcessor().clearResponseInterceptors();
-        this.protocolProcessor = null;
-    }
-
-    public synchronized void removeResponseInterceptorByClass(final Class<? extends HttpResponseInterceptor> clazz) {
-        getHttpProcessor().removeResponseInterceptorByClass(clazz);
-        this.protocolProcessor = null;
-    }
-
-    public synchronized void addRequestInterceptor(final HttpRequestInterceptor itcp) {
-        getHttpProcessor().addInterceptor(itcp);
-        this.protocolProcessor = null;
-    }
-
-    public synchronized void addRequestInterceptor(final HttpRequestInterceptor itcp, final int index) {
-        getHttpProcessor().addInterceptor(itcp, index);
-        this.protocolProcessor = null;
-    }
-
-    public synchronized void clearRequestInterceptors() {
-        getHttpProcessor().clearRequestInterceptors();
-        this.protocolProcessor = null;
-    }
-
-    public synchronized void removeRequestInterceptorByClass(final Class<? extends HttpRequestInterceptor> clazz) {
-        getHttpProcessor().removeRequestInterceptorByClass(clazz);
-        this.protocolProcessor = null;
-    }
-
-    private void doExecute() {
-        final InternalRequestExecutor handler = new InternalRequestExecutor(this.log, new HttpAsyncRequestExecutor());
-        try {
-            final IOEventDispatch ioEventDispatch = new DefaultHttpClientIODispatch(handler, getParams());
-            this.connmgr.execute(ioEventDispatch);
-        } catch (final Exception ex) {
-            this.log.error("I/O reactor terminated abnormally", ex);
-        } finally {
-            this.terminated = true;
-            while (!this.queue.isEmpty()) {
-                final HttpAsyncRequestExecutionHandler<?> exchangeHandler = this.queue.remove();
-                exchangeHandler.cancel();
-            }
-        }
-    }
-
-    public IOReactorStatus getStatus() {
-        return this.connmgr.getStatus();
-    }
-
-    public synchronized void start() {
-        this.reactorThread = new Thread() {
-
-            @Override
-            public void run() {
-                doExecute();
-            }
-
-        };
-        this.reactorThread.start();
-    }
-
-    public void shutdown() throws InterruptedException {
-        try {
-            this.connmgr.shutdown(5000);
-        } catch (final IOException ex) {
-            this.log.error("I/O error shutting down", ex);
-        }
-        if (this.reactorThread != null) {
-            this.reactorThread.join();
-        }
-    }
-
-    @Override
-    public <T> Future<T> execute(
-            final HttpAsyncRequestProducer requestProducer,
-            final HttpAsyncResponseConsumer<T> responseConsumer,
-            final HttpContext context,
-            final FutureCallback<T> callback) {
-        if (this.terminated) {
-            throw new IllegalStateException("Client has been shut down");
-        }
-        final BasicFuture<T> future = new BasicFuture<T>(callback);
-        final ResultCallback<T> resultCallback = new DefaultResultCallback<T>(future, this.queue);
-        DefaultAsyncRequestDirector<T> httpexchange;
-        synchronized (this) {
-            final HttpContext defaultContext = createHttpContext();
-            HttpContext execContext;
-            if (context == null) {
-                execContext = defaultContext;
-            } else {
-                execContext = new DefaultedHttpContext(context, defaultContext);
-            }
-            httpexchange = new DefaultAsyncRequestDirector<T>(
-                    this.log,
-                    requestProducer,
-                    responseConsumer,
-                    execContext,
-                    resultCallback,
-                    this.connmgr,
-                    getProtocolProcessor(),
-                    getRoutePlanner(),
-                    getConnectionReuseStrategy(),
-                    getConnectionKeepAliveStrategy(),
-                    getRedirectStrategy(),
-                    getTargetAuthenticationStrategy(),
-                    getProxyAuthenticationStrategy(),
-                    getUserTokenHandler(),
-                    getParams());
-        }
-        this.queue.add(httpexchange);
-        httpexchange.start();
-        return future;
-    }
-
-    @Override
-    public <T> Future<T> execute(
-            final HttpAsyncRequestProducer requestProducer,
-            final HttpAsyncResponseConsumer<T> responseConsumer,
-            final FutureCallback<T> callback) {
-        return execute(requestProducer, responseConsumer, new BasicHttpContext(), callback);
-    }
-
-    @Override
-    public Future<HttpResponse> execute(
-            final HttpHost target, final HttpRequest request, final HttpContext context,
-            final FutureCallback<HttpResponse> callback) {
-        return execute(
-                HttpAsyncMethods.create(target, request),
-                HttpAsyncMethods.createConsumer(),
-                context, callback);
-    }
-
-    @Override
-    public Future<HttpResponse> execute(
-            final HttpHost target, final HttpRequest request,
-            final FutureCallback<HttpResponse> callback) {
-        return execute(target, request, new BasicHttpContext(), callback);
-    }
-
-    @Override
-    public Future<HttpResponse> execute(
-            final HttpUriRequest request,
-            final FutureCallback<HttpResponse> callback) {
-        return execute(request, new BasicHttpContext(), callback);
-    }
-
-    @Override
-    public Future<HttpResponse> execute(
-            final HttpUriRequest request,
-            final HttpContext context,
-            final FutureCallback<HttpResponse> callback) {
-        HttpHost target;
-        try {
-            target = determineTarget(request);
-        } catch (final ClientProtocolException ex) {
-            final BasicFuture<HttpResponse> future = new BasicFuture<HttpResponse>(callback);
-            future.failed(ex);
-            return future;
-        }
-        return execute(target, request, context, callback);
-    }
-
-    private HttpHost determineTarget(final HttpUriRequest request) throws ClientProtocolException {
-        // A null target may be acceptable if there is a default target.
-        // Otherwise, the null target is detected in the director.
-        HttpHost target = null;
-
-        final URI requestURI = request.getURI();
-        if (requestURI.isAbsolute()) {
-            target = URIUtils.extractHost(requestURI);
-            if (target == null) {
-                throw new ClientProtocolException(
-                        "URI does not specify a valid host name: " + requestURI);
-            }
-        }
-        return target;
-    }
-
-}
diff --git a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/client/DefaultAsyncRequestDirector.java b/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/client/DefaultAsyncRequestDirector.java
deleted file mode 100644
index c153bd4..0000000
--- a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/client/DefaultAsyncRequestDirector.java
+++ /dev/null
@@ -1,893 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.client;
-
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.nio.ByteBuffer;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
-
-import org.apache.commons.logging.Log;
-import org.apache.http.ConnectionClosedException;
-import org.apache.http.ConnectionReuseStrategy;
-import org.apache.http.HttpEntityEnclosingRequest;
-import org.apache.http.HttpException;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.ProtocolException;
-import org.apache.http.ProtocolVersion;
-import org.apache.http.auth.AuthProtocolState;
-import org.apache.http.auth.AuthScheme;
-import org.apache.http.auth.AuthState;
-import org.apache.http.auth.UsernamePasswordCredentials;
-import org.apache.http.client.AuthenticationStrategy;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.client.NonRepeatableRequestException;
-import org.apache.http.client.RedirectException;
-import org.apache.http.client.RedirectStrategy;
-import org.apache.http.client.UserTokenHandler;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.methods.AbortableHttpRequest;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.client.params.ClientPNames;
-import org.apache.http.client.params.HttpClientParams;
-import org.apache.http.client.protocol.ClientContext;
-import org.apache.http.client.utils.URIUtils;
-import org.apache.http.concurrent.FutureCallback;
-import org.apache.http.conn.ConnectionKeepAliveStrategy;
-import org.apache.http.conn.ConnectionReleaseTrigger;
-import org.apache.http.conn.routing.BasicRouteDirector;
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.conn.routing.HttpRouteDirector;
-import org.apache.http.conn.routing.HttpRoutePlanner;
-import org.apache.http.impl.auth.BasicScheme;
-import org.apache.http.impl.client.ClientParamsStack;
-import org.apache.http.impl.client.EntityEnclosingRequestWrapper;
-import org.apache.http.impl.client.HttpAuthenticator;
-import org.apache.http.impl.client.RequestWrapper;
-import org.apache.http.impl.client.RoutedRequest;
-import org.apache.http.message.BasicHttpRequest;
-import org.apache.http.nio.ContentDecoder;
-import org.apache.http.nio.ContentEncoder;
-import org.apache.http.nio.IOControl;
-import org.apache.http.nio.conn.ClientAsyncConnectionManager;
-import org.apache.http.nio.conn.ManagedClientAsyncConnection;
-import org.apache.http.nio.conn.scheme.AsyncScheme;
-import org.apache.http.nio.conn.scheme.AsyncSchemeRegistry;
-import org.apache.http.nio.protocol.HttpAsyncRequestExecutionHandler;
-import org.apache.http.nio.protocol.HttpAsyncRequestExecutor;
-import org.apache.http.nio.protocol.HttpAsyncRequestProducer;
-import org.apache.http.nio.protocol.HttpAsyncResponseConsumer;
-import org.apache.http.params.HttpConnectionParams;
-import org.apache.http.params.HttpParams;
-import org.apache.http.params.HttpProtocolParams;
-import org.apache.http.protocol.ExecutionContext;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.protocol.HttpProcessor;
-
-@Deprecated
-class DefaultAsyncRequestDirector<T> implements HttpAsyncRequestExecutionHandler<T> {
-
-    private static final AtomicLong COUNTER = new AtomicLong(1);
-
-    private final Log log;
-
-    private final HttpAsyncRequestProducer requestProducer;
-    private final HttpAsyncResponseConsumer<T> responseConsumer;
-    private final HttpContext localContext;
-    private final ResultCallback<T> resultCallback;
-    private final ClientAsyncConnectionManager connmgr;
-    private final HttpProcessor httppocessor;
-    private final HttpRoutePlanner routePlanner;
-    private final HttpRouteDirector routeDirector;
-    private final ConnectionReuseStrategy reuseStrategy;
-    private final ConnectionKeepAliveStrategy keepaliveStrategy;
-    private final RedirectStrategy redirectStrategy;
-    private final AuthenticationStrategy targetAuthStrategy;
-    private final AuthenticationStrategy proxyAuthStrategy;
-    private final UserTokenHandler userTokenHandler;
-    private final AuthState targetAuthState;
-    private final AuthState proxyAuthState;
-    private final HttpAuthenticator authenticator;
-    private final HttpParams clientParams;
-    private final long id;
-
-    private volatile boolean closed;
-    private volatile InternalFutureCallback connRequestCallback;
-    private volatile ManagedClientAsyncConnection managedConn;
-
-    private RoutedRequest mainRequest;
-    private RoutedRequest followup;
-    private HttpResponse finalResponse;
-
-    private ClientParamsStack params;
-    private RequestWrapper currentRequest;
-    private HttpResponse currentResponse;
-    private boolean routeEstablished;
-    private int redirectCount;
-    private ByteBuffer tmpbuf;
-    private boolean requestContentProduced;
-    private boolean requestSent;
-    private int execCount;
-
-    public DefaultAsyncRequestDirector(
-            final Log log,
-            final HttpAsyncRequestProducer requestProducer,
-            final HttpAsyncResponseConsumer<T> responseConsumer,
-            final HttpContext localContext,
-            final ResultCallback<T> callback,
-            final ClientAsyncConnectionManager connmgr,
-            final HttpProcessor httppocessor,
-            final HttpRoutePlanner routePlanner,
-            final ConnectionReuseStrategy reuseStrategy,
-            final ConnectionKeepAliveStrategy keepaliveStrategy,
-            final RedirectStrategy redirectStrategy,
-            final AuthenticationStrategy targetAuthStrategy,
-            final AuthenticationStrategy proxyAuthStrategy,
-            final UserTokenHandler userTokenHandler,
-            final HttpParams clientParams) {
-        super();
-        this.log = log;
-        this.requestProducer = requestProducer;
-        this.responseConsumer = responseConsumer;
-        this.localContext = localContext;
-        this.resultCallback = callback;
-        this.connmgr = connmgr;
-        this.httppocessor = httppocessor;
-        this.routePlanner = routePlanner;
-        this.reuseStrategy = reuseStrategy;
-        this.keepaliveStrategy = keepaliveStrategy;
-        this.redirectStrategy = redirectStrategy;
-        this.routeDirector = new BasicRouteDirector();
-        this.targetAuthStrategy = targetAuthStrategy;
-        this.proxyAuthStrategy = proxyAuthStrategy;
-        this.userTokenHandler = userTokenHandler;
-        this.targetAuthState = new AuthState();
-        this.proxyAuthState = new AuthState();
-        this.authenticator     = new HttpAuthenticator(log);
-        this.clientParams = clientParams;
-        this.id = COUNTER.getAndIncrement();
-    }
-
-    @Override
-    public void close() {
-        if (this.closed) {
-            return;
-        }
-        this.closed = true;
-        final ManagedClientAsyncConnection localConn = this.managedConn;
-        if (localConn != null) {
-            if (this.log.isDebugEnabled()) {
-                this.log.debug("[exchange: " + this.id + "] aborting connection " + localConn);
-            }
-            try {
-                localConn.abortConnection();
-            } catch (final IOException ioex) {
-                this.log.debug("I/O error releasing connection", ioex);
-            }
-        }
-        try {
-            this.requestProducer.close();
-        } catch (final IOException ex) {
-            this.log.debug("I/O error closing request producer", ex);
-        }
-        try {
-            this.responseConsumer.close();
-        } catch (final IOException ex) {
-            this.log.debug("I/O error closing response consumer", ex);
-        }
-    }
-
-    public synchronized void start() {
-        try {
-            if (this.log.isDebugEnabled()) {
-                this.log.debug("[exchange: " + this.id + "] start execution");
-            }
-            this.localContext.setAttribute(ClientContext.TARGET_AUTH_STATE, this.targetAuthState);
-            this.localContext.setAttribute(ClientContext.PROXY_AUTH_STATE, this.proxyAuthState);
-
-            final HttpHost target = this.requestProducer.getTarget();
-            final HttpRequest request = this.requestProducer.generateRequest();
-            if (request instanceof AbortableHttpRequest) {
-                ((AbortableHttpRequest) request).setReleaseTrigger(new ConnectionReleaseTrigger() {
-
-                    @Override
-                    public void releaseConnection() throws IOException {
-                    }
-
-                    @Override
-                    public void abortConnection() throws IOException {
-                        cancel();
-                    }
-
-                });
-            }
-            this.params = new ClientParamsStack(null, this.clientParams, request.getParams(), null);
-            final RequestWrapper wrapper = wrapRequest(request);
-            wrapper.setParams(this.params);
-            final HttpRoute route = determineRoute(target, wrapper, this.localContext);
-            this.mainRequest = new RoutedRequest(wrapper, route);
-            final RequestConfig config = ParamConfig.getRequestConfig(params);
-            this.localContext.setAttribute(ClientContext.REQUEST_CONFIG, config);
-            this.requestContentProduced = false;
-            requestConnection();
-        } catch (final Exception ex) {
-            failed(ex);
-        }
-    }
-
-    @Override
-    public HttpHost getTarget() {
-        return this.requestProducer.getTarget();
-    }
-
-    @Override
-    public synchronized HttpRequest generateRequest() throws IOException, HttpException {
-        final HttpRoute route = this.mainRequest.getRoute();
-        if (!this.routeEstablished) {
-            int step;
-            do {
-                final HttpRoute fact = this.managedConn.getRoute();
-                step = this.routeDirector.nextStep(route, fact);
-                switch (step) {
-                case HttpRouteDirector.CONNECT_TARGET:
-                case HttpRouteDirector.CONNECT_PROXY:
-                    break;
-                case HttpRouteDirector.TUNNEL_TARGET:
-                    if (this.log.isDebugEnabled()) {
-                        this.log.debug("[exchange: " + this.id + "] Tunnel required");
-                    }
-                    final HttpRequest connect = createConnectRequest(route);
-                    this.currentRequest = wrapRequest(connect);
-                    this.currentRequest.setParams(this.params);
-                    break;
-                case HttpRouteDirector.TUNNEL_PROXY:
-                    throw new HttpException("Proxy chains are not supported");
-                case HttpRouteDirector.LAYER_PROTOCOL:
-                    managedConn.layerProtocol(this.localContext, this.params);
-                    break;
-                case HttpRouteDirector.UNREACHABLE:
-                    throw new HttpException("Unable to establish route: " +
-                            "planned = " + route + "; current = " + fact);
-                case HttpRouteDirector.COMPLETE:
-                    this.routeEstablished = true;
-                    break;
-                default:
-                    throw new IllegalStateException("Unknown step indicator "
-                            + step + " from RouteDirector.");
-                }
-            } while (step > HttpRouteDirector.COMPLETE && this.currentRequest == null);
-        }
-
-        HttpHost target = (HttpHost) this.params.getParameter(ClientPNames.VIRTUAL_HOST);
-        if (target == null) {
-            target = route.getTargetHost();
-        }
-        final HttpHost proxy = route.getProxyHost();
-        this.localContext.setAttribute(ExecutionContext.HTTP_TARGET_HOST, target);
-        this.localContext.setAttribute(ExecutionContext.HTTP_PROXY_HOST, proxy);
-        this.localContext.setAttribute(ExecutionContext.HTTP_CONNECTION, this.managedConn);
-        this.localContext.setAttribute(ClientContext.ROUTE, route);
-
-        if (this.currentRequest == null) {
-            this.currentRequest = this.mainRequest.getRequest();
-
-            final String userinfo = this.currentRequest.getURI().getUserInfo();
-            if (userinfo != null) {
-                this.targetAuthState.update(
-                        new BasicScheme(), new UsernamePasswordCredentials(userinfo));
-            }
-
-            // Re-write request URI if needed
-            rewriteRequestURI(this.currentRequest, route);
-        }
-        // Reset headers on the request wrapper
-        this.currentRequest.resetHeaders();
-
-        this.currentRequest.incrementExecCount();
-        if (this.currentRequest.getExecCount() > 1
-                && !this.requestProducer.isRepeatable()
-                && this.requestContentProduced) {
-            throw new NonRepeatableRequestException("Cannot retry request " +
-                "with a non-repeatable request entity.");
-        }
-        this.execCount++;
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + this.id + "] Attempt " + this.execCount + " to execute request");
-        }
-        return this.currentRequest;
-    }
-
-    @Override
-    public synchronized void produceContent(
-            final ContentEncoder encoder, final IOControl ioctrl) throws IOException {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + this.id + "] produce content");
-        }
-        this.requestContentProduced = true;
-        this.requestProducer.produceContent(encoder, ioctrl);
-        if (encoder.isCompleted()) {
-            this.requestProducer.resetRequest();
-        }
-    }
-
-    @Override
-    public void requestCompleted(final HttpContext context) {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + this.id + "] Request completed");
-        }
-        this.requestSent = true;
-        this.requestProducer.requestCompleted(context);
-    }
-
-    @Override
-    public boolean isRepeatable() {
-        return this.requestProducer.isRepeatable();
-    }
-
-    @Override
-    public void resetRequest() throws IOException {
-        this.requestSent = false;
-        this.requestProducer.resetRequest();
-    }
-
-    @Override
-    public synchronized void responseReceived(
-            final HttpResponse response) throws IOException, HttpException {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + this.id + "] Response received " + response.getStatusLine());
-        }
-        this.currentResponse = response;
-        this.currentResponse.setParams(this.params);
-
-        final int status = this.currentResponse.getStatusLine().getStatusCode();
-
-        if (!this.routeEstablished) {
-            final String method = this.currentRequest.getMethod();
-            if (method.equalsIgnoreCase("CONNECT") && status == HttpStatus.SC_OK) {
-                this.managedConn.tunnelTarget(this.params);
-            } else {
-                this.followup = handleConnectResponse();
-                if (this.followup == null) {
-                    this.finalResponse = response;
-                }
-            }
-        } else {
-            this.followup = handleResponse();
-            if (this.followup == null) {
-                this.finalResponse = response;
-            }
-
-            Object userToken = this.localContext.getAttribute(ClientContext.USER_TOKEN);
-            if (managedConn != null) {
-                if (userToken == null) {
-                    userToken = userTokenHandler.getUserToken(this.localContext);
-                    this.localContext.setAttribute(ClientContext.USER_TOKEN, userToken);
-                }
-                if (userToken != null) {
-                    managedConn.setState(userToken);
-                }
-            }
-        }
-        if (this.finalResponse != null) {
-            this.responseConsumer.responseReceived(response);
-        }
-    }
-
-    @Override
-    public synchronized void consumeContent(
-            final ContentDecoder decoder, final IOControl ioctrl) throws IOException {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + this.id + "] Consume content");
-        }
-        if (this.finalResponse != null) {
-            this.responseConsumer.consumeContent(decoder, ioctrl);
-        } else {
-            if (this.tmpbuf == null) {
-                this.tmpbuf = ByteBuffer.allocate(2048);
-            }
-            this.tmpbuf.clear();
-            decoder.read(this.tmpbuf);
-        }
-    }
-
-    private void releaseConnection() {
-        if (this.managedConn != null) {
-            if (this.log.isDebugEnabled()) {
-                this.log.debug("[exchange: " + this.id + "] releasing connection " + this.managedConn);
-            }
-            try {
-                this.managedConn.getContext().removeAttribute(HttpAsyncRequestExecutor.HTTP_HANDLER);
-                this.managedConn.releaseConnection();
-            } catch (final IOException ioex) {
-                this.log.debug("I/O error releasing connection", ioex);
-            }
-            this.managedConn = null;
-        }
-    }
-
-    @Override
-    public synchronized void failed(final Exception ex) {
-        try {
-            if (!this.requestSent) {
-                this.requestProducer.failed(ex);
-            }
-            this.responseConsumer.failed(ex);
-        } finally {
-            try {
-                this.resultCallback.failed(ex, this);
-            } finally {
-                close();
-            }
-        }
-    }
-
-    @Override
-    public synchronized void responseCompleted(final HttpContext context) {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + this.id + "] Response fully read");
-        }
-        try {
-            if (this.resultCallback.isDone()) {
-                return;
-            }
-            if (this.managedConn.isOpen()) {
-                final long duration = this.keepaliveStrategy.getKeepAliveDuration(
-                        this.currentResponse, this.localContext);
-                if (this.log.isDebugEnabled()) {
-                    final String s;
-                    if (duration > 0) {
-                        s = "for " + duration + " " + TimeUnit.MILLISECONDS;
-                    } else {
-                        s = "indefinitely";
-                    }
-                    this.log.debug("[exchange: " + this.id + "] Connection can be kept alive " + s);
-                }
-                this.managedConn.setIdleDuration(duration, TimeUnit.MILLISECONDS);
-            } else {
-                if (this.log.isDebugEnabled()) {
-                    this.log.debug("[exchange: " + this.id + "] Connection cannot be kept alive");
-                }
-                this.managedConn.unmarkReusable();
-                if (this.proxyAuthState.getState() == AuthProtocolState.SUCCESS
-                        && this.proxyAuthState.getAuthScheme() != null
-                        && this.proxyAuthState.getAuthScheme().isConnectionBased()) {
-                    if (this.log.isDebugEnabled()) {
-                        this.log.debug("[exchange: " + this.id + "] Resetting proxy auth state");
-                    }
-                    this.proxyAuthState.reset();
-                }
-                if (this.targetAuthState.getState() == AuthProtocolState.SUCCESS
-                        && this.targetAuthState.getAuthScheme() != null
-                        && this.targetAuthState.getAuthScheme().isConnectionBased()) {
-                    if (this.log.isDebugEnabled()) {
-                        this.log.debug("[exchange: " + this.id + "] Resetting target auth state");
-                    }
-                    this.targetAuthState.reset();
-                }
-            }
-
-            if (this.finalResponse != null) {
-                this.responseConsumer.responseCompleted(this.localContext);
-                if (this.log.isDebugEnabled()) {
-                    this.log.debug("[exchange: " + this.id + "] Response processed");
-                }
-                releaseConnection();
-                final T result = this.responseConsumer.getResult();
-                final Exception ex = this.responseConsumer.getException();
-                if (ex == null) {
-                    this.resultCallback.completed(result, this);
-                } else {
-                    this.resultCallback.failed(ex, this);
-                }
-            } else {
-                if (this.followup != null) {
-                    final HttpRoute actualRoute = this.mainRequest.getRoute();
-                    final HttpRoute newRoute = this.followup.getRoute();
-                    if (!actualRoute.equals(newRoute)) {
-                        releaseConnection();
-                    }
-                    this.mainRequest = this.followup;
-                }
-                if (this.managedConn != null && !this.managedConn.isOpen()) {
-                    releaseConnection();
-                }
-                if (this.managedConn != null) {
-                    this.managedConn.requestOutput();
-                } else {
-                    requestConnection();
-                }
-            }
-            this.followup = null;
-            this.currentRequest = null;
-            this.currentResponse = null;
-        } catch (final RuntimeException runex) {
-            failed(runex);
-            throw runex;
-        }
-    }
-
-    @Override
-    public synchronized boolean cancel() {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + this.id + "] Cancelled");
-        }
-        try {
-            final boolean cancelled = this.responseConsumer.cancel();
-
-            final T result = this.responseConsumer.getResult();
-            final Exception ex = this.responseConsumer.getException();
-            if (ex != null) {
-                this.resultCallback.failed(ex, this);
-            } else if (result != null) {
-                this.resultCallback.completed(result, this);
-            } else {
-                this.resultCallback.cancelled(this);
-            }
-            return cancelled;
-        } catch (final RuntimeException runex) {
-            this.resultCallback.failed(runex, this);
-            throw runex;
-        } finally {
-            close();
-        }
-    }
-
-    @Override
-    public boolean isDone() {
-        return this.resultCallback.isDone();
-    }
-
-    @Override
-    public T getResult() {
-        return this.responseConsumer.getResult();
-    }
-
-    @Override
-    public Exception getException() {
-        return this.responseConsumer.getException();
-    }
-
-    private synchronized void connectionRequestCompleted(final ManagedClientAsyncConnection conn) {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + this.id + "] Connection allocated: " + conn);
-        }
-        this.connRequestCallback = null;
-        try {
-            this.managedConn = conn;
-            if (this.closed) {
-                conn.releaseConnection();
-                return;
-            }
-            final HttpRoute route = this.mainRequest.getRoute();
-            if (!conn.isOpen()) {
-                conn.open(route, this.localContext, this.params);
-            }
-            conn.getContext().setAttribute(HttpAsyncRequestExecutor.HTTP_HANDLER, this);
-            conn.requestOutput();
-            this.routeEstablished = route.equals(conn.getRoute());
-            if (!conn.isOpen()) {
-                throw new ConnectionClosedException("Connection closed");
-            }
-        } catch (final IOException ex) {
-            failed(ex);
-        } catch (final RuntimeException runex) {
-            failed(runex);
-            throw runex;
-        }
-    }
-
-    private synchronized void connectionRequestFailed(final Exception ex) {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + this.id + "] connection request failed");
-        }
-        this.connRequestCallback = null;
-        try {
-            this.resultCallback.failed(ex, this);
-        } finally {
-            close();
-        }
-    }
-
-    private synchronized void connectionRequestCancelled() {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + this.id + "] Connection request cancelled");
-        }
-        this.connRequestCallback = null;
-        try {
-            this.resultCallback.cancelled(this);
-        } finally {
-            close();
-        }
-    }
-
-    class InternalFutureCallback implements FutureCallback<ManagedClientAsyncConnection> {
-
-        @Override
-        public void completed(final ManagedClientAsyncConnection session) {
-            connectionRequestCompleted(session);
-        }
-
-        @Override
-        public void failed(final Exception ex) {
-            connectionRequestFailed(ex);
-        }
-
-        @Override
-        public void cancelled() {
-            connectionRequestCancelled();
-        }
-
-    }
-
-    private void requestConnection() {
-        final HttpRoute route = this.mainRequest.getRoute();
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + this.id + "] Request connection for " + route);
-        }
-        final long connectTimeout = HttpConnectionParams.getConnectionTimeout(this.params);
-        final Object userToken = this.localContext.getAttribute(ClientContext.USER_TOKEN);
-        this.connRequestCallback = new InternalFutureCallback();
-        this.connmgr.leaseConnection(
-                route, userToken,
-                connectTimeout, TimeUnit.MILLISECONDS,
-                this.connRequestCallback);
-    }
-
-    public synchronized void endOfStream() {
-        if (this.managedConn != null) {
-            if (this.log.isDebugEnabled()) {
-                this.log.debug("[exchange: " + this.id + "] Unexpected end of data stream");
-            }
-            releaseConnection();
-            if (this.connRequestCallback == null) {
-                requestConnection();
-            }
-        }
-    }
-
-    protected HttpRoute determineRoute(
-            final HttpHost target,
-            final HttpRequest request,
-            final HttpContext context) throws HttpException {
-        final HttpHost t = target != null ? target :
-                (HttpHost) request.getParams().getParameter(ClientPNames.DEFAULT_HOST);
-        if (t == null) {
-            throw new IllegalStateException("Target host could not be resolved");
-        }
-        return this.routePlanner.determineRoute(t, request, context);
-    }
-
-    private RequestWrapper wrapRequest(final HttpRequest request) throws ProtocolException {
-        if (request instanceof HttpEntityEnclosingRequest) {
-            return new EntityEnclosingRequestWrapper((HttpEntityEnclosingRequest) request);
-        }
-        return new RequestWrapper(request);
-    }
-
-    protected void rewriteRequestURI(
-            final RequestWrapper request, final HttpRoute route) throws ProtocolException {
-        try {
-            URI uri = request.getURI();
-            if (route.getProxyHost() != null && !route.isTunnelled()) {
-                // Make sure the request URI is absolute
-                if (!uri.isAbsolute()) {
-                    final HttpHost target = route.getTargetHost();
-                    uri = URIUtils.rewriteURI(uri, target);
-                    request.setURI(uri);
-                }
-            } else {
-                // Make sure the request URI is relative
-                if (uri.isAbsolute()) {
-                    uri = URIUtils.rewriteURI(uri, null);
-                    request.setURI(uri);
-                }
-            }
-        } catch (final URISyntaxException ex) {
-            throw new ProtocolException("Invalid URI: " + request.getRequestLine().getUri(), ex);
-        }
-    }
-
-    private AsyncSchemeRegistry getSchemeRegistry(final HttpContext context) {
-        AsyncSchemeRegistry reg = (AsyncSchemeRegistry) context.getAttribute(
-                ClientContext.SCHEME_REGISTRY);
-        if (reg == null) {
-            reg = this.connmgr.getSchemeRegistry();
-        }
-        return reg;
-    }
-
-    private HttpRequest createConnectRequest(final HttpRoute route) {
-        // see RFC 2817, section 5.2 and
-        // INTERNET-DRAFT: Tunneling TCP based protocols through
-        // Web proxy servers
-        final HttpHost target = route.getTargetHost();
-        final String host = target.getHostName();
-        int port = target.getPort();
-        if (port < 0) {
-            final AsyncSchemeRegistry registry = getSchemeRegistry(this.localContext);
-            final AsyncScheme scheme = registry.getScheme(target.getSchemeName());
-            port = scheme.getDefaultPort();
-        }
-        final StringBuilder buffer = new StringBuilder(host.length() + 6);
-        buffer.append(host);
-        buffer.append(':');
-        buffer.append(Integer.toString(port));
-        final ProtocolVersion ver = HttpProtocolParams.getVersion(this.params);
-        final HttpRequest req = new BasicHttpRequest("CONNECT", buffer.toString(), ver);
-        return req;
-    }
-
-    private RoutedRequest handleResponse() throws HttpException {
-        RoutedRequest followup = null;
-        if (HttpClientParams.isAuthenticating(this.params)) {
-            final CredentialsProvider credsProvider = (CredentialsProvider) this.localContext.getAttribute(
-                    ClientContext.CREDS_PROVIDER);
-            if (credsProvider != null) {
-                followup = handleTargetChallenge(credsProvider);
-                if (followup != null) {
-                    return followup;
-                }
-                followup = handleProxyChallenge(credsProvider);
-                if (followup != null) {
-                    return followup;
-                }
-            }
-        }
-        if (HttpClientParams.isRedirecting(this.params)) {
-            followup = handleRedirect();
-            if (followup != null) {
-                return followup;
-            }
-        }
-        return null;
-    }
-
-    private RoutedRequest handleConnectResponse() throws HttpException {
-        RoutedRequest followup = null;
-        if (HttpClientParams.isAuthenticating(this.params)) {
-            final CredentialsProvider credsProvider = (CredentialsProvider) this.localContext.getAttribute(
-                    ClientContext.CREDS_PROVIDER);
-            if (credsProvider != null) {
-                followup = handleProxyChallenge(credsProvider);
-                if (followup != null) {
-                    return followup;
-                }
-            }
-        }
-        return null;
-    }
-
-    private RoutedRequest handleRedirect() throws HttpException {
-        if (this.redirectStrategy.isRedirected(
-                this.currentRequest, this.currentResponse, this.localContext)) {
-
-            final HttpRoute route = this.mainRequest.getRoute();
-            final RequestWrapper request = this.mainRequest.getRequest();
-
-            final int maxRedirects = this.params.getIntParameter(ClientPNames.MAX_REDIRECTS, 100);
-            if (this.redirectCount >= maxRedirects) {
-                throw new RedirectException("Maximum redirects ("
-                        + maxRedirects + ") exceeded");
-            }
-            this.redirectCount++;
-
-            final HttpUriRequest redirect = this.redirectStrategy.getRedirect(
-                    this.currentRequest, this.currentResponse, this.localContext);
-            final HttpRequest orig = request.getOriginal();
-            redirect.setHeaders(orig.getAllHeaders());
-
-            final URI uri = redirect.getURI();
-            if (uri.getHost() == null) {
-                throw new ProtocolException("Redirect URI does not specify a valid host name: " + uri);
-            }
-            final HttpHost newTarget = new HttpHost(uri.getHost(), uri.getPort(), uri.getScheme());
-
-            // Reset auth states if redirecting to another host
-            if (!route.getTargetHost().equals(newTarget)) {
-                if (this.log.isDebugEnabled()) {
-                    this.log.debug("[exchange: " + this.id + "] Resetting target auth state");
-                }
-                this.targetAuthState.reset();
-                final AuthScheme authScheme = this.proxyAuthState.getAuthScheme();
-                if (authScheme != null && authScheme.isConnectionBased()) {
-                    if (this.log.isDebugEnabled()) {
-                        this.log.debug("[exchange: " + this.id + "] Resetting proxy auth state");
-                    }
-                    this.proxyAuthState.reset();
-                }
-            }
-
-            final RequestWrapper newRequest = wrapRequest(redirect);
-            newRequest.setParams(this.params);
-
-            final HttpRoute newRoute = determineRoute(newTarget, newRequest, this.localContext);
-
-            if (this.log.isDebugEnabled()) {
-                this.log.debug("[exchange: " + this.id + "] Redirecting to '" + uri + "' via " + newRoute);
-            }
-            return new RoutedRequest(newRequest, newRoute);
-        }
-        return null;
-    }
-
-    private RoutedRequest handleTargetChallenge(
-            final CredentialsProvider credsProvider) throws HttpException {
-        final HttpRoute route = this.mainRequest.getRoute();
-        HttpHost target = (HttpHost) this.localContext.getAttribute(
-                ExecutionContext.HTTP_TARGET_HOST);
-        if (target == null) {
-            target = route.getTargetHost();
-        }
-        if (this.authenticator.isAuthenticationRequested(target, this.currentResponse,
-                this.targetAuthStrategy, this.targetAuthState, this.localContext)) {
-            if (this.authenticator.authenticate(target, this.currentResponse,
-                    this.targetAuthStrategy, this.targetAuthState, this.localContext)) {
-                // Re-try the same request via the same route
-                return this.mainRequest;
-            }
-            return null;
-        }
-        return null;
-    }
-
-    private RoutedRequest handleProxyChallenge(
-            final CredentialsProvider credsProvider) throws HttpException {
-        final HttpRoute route = this.mainRequest.getRoute();
-        final HttpHost proxy = route.getProxyHost();
-        if (this.authenticator.isAuthenticationRequested(proxy, this.currentResponse,
-                this.proxyAuthStrategy, this.proxyAuthState, this.localContext)) {
-            if (this.authenticator.authenticate(proxy, this.currentResponse,
-                    this.proxyAuthStrategy, this.proxyAuthState, this.localContext)) {
-                // Re-try the same request via the same route
-                return this.mainRequest;
-            }
-            return null;
-        }
-        return null;
-    }
-
-    @Override
-    public HttpContext getContext() {
-        return this.localContext;
-    }
-
-    @Override
-    public HttpProcessor getHttpProcessor() {
-        return this.httppocessor;
-    }
-
-    @Override
-    public ConnectionReuseStrategy getConnectionReuseStrategy() {
-        return this.reuseStrategy;
-    }
-
-}
diff --git a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/client/DefaultHttpAsyncClient.java b/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/client/DefaultHttpAsyncClient.java
deleted file mode 100644
index 3c9763a..0000000
--- a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/client/DefaultHttpAsyncClient.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.client;
-
-import org.apache.http.HttpVersion;
-import org.apache.http.client.protocol.RequestAddCookies;
-import org.apache.http.client.protocol.RequestAuthCache;
-import org.apache.http.client.protocol.RequestClientConnControl;
-import org.apache.http.client.protocol.RequestDefaultHeaders;
-import org.apache.http.client.protocol.RequestProxyAuthentication;
-import org.apache.http.client.protocol.RequestTargetAuthentication;
-import org.apache.http.client.protocol.ResponseProcessCookies;
-import org.apache.http.impl.nio.reactor.IOReactorConfig;
-import org.apache.http.nio.conn.ClientAsyncConnectionManager;
-import org.apache.http.nio.reactor.IOReactorException;
-import org.apache.http.params.HttpConnectionParams;
-import org.apache.http.params.HttpParams;
-import org.apache.http.params.HttpProtocolParams;
-import org.apache.http.params.SyncBasicHttpParams;
-import org.apache.http.protocol.BasicHttpProcessor;
-import org.apache.http.protocol.HTTP;
-import org.apache.http.protocol.RequestContent;
-import org.apache.http.protocol.RequestExpectContinue;
-import org.apache.http.protocol.RequestTargetHost;
-import org.apache.http.protocol.RequestUserAgent;
-import org.apache.http.util.VersionInfo;
-
-@Deprecated
-public class DefaultHttpAsyncClient extends AbstractHttpAsyncClient {
-
-    public DefaultHttpAsyncClient(final ClientAsyncConnectionManager connmgr) {
-        super(connmgr);
-    }
-
-    public DefaultHttpAsyncClient(final IOReactorConfig config) throws IOReactorException {
-        super(config);
-    }
-
-    public DefaultHttpAsyncClient() throws IOReactorException {
-        super(new IOReactorConfig());
-    }
-
-    @Override
-    protected HttpParams createHttpParams() {
-        final HttpParams params = new SyncBasicHttpParams();
-        setDefaultHttpParams(params);
-        return params;
-    }
-
-    public static void setDefaultHttpParams(final HttpParams params) {
-        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
-        HttpProtocolParams.setContentCharset(params, HTTP.DEF_CONTENT_CHARSET.name());
-        HttpConnectionParams.setTcpNoDelay(params, true);
-        HttpConnectionParams.setSocketBufferSize(params, 8192);
-        HttpProtocolParams.setUserAgent(params, VersionInfo.getUserAgent(
-                "Apache-HttpAsyncClient",
-                "org.apache.http.nio.client", DefaultHttpAsyncClient.class));
-    }
-
-    @Override
-    protected BasicHttpProcessor createHttpProcessor() {
-        final BasicHttpProcessor httpproc = new BasicHttpProcessor();
-        httpproc.addInterceptor(new RequestDefaultHeaders());
-        // Required protocol interceptors
-        httpproc.addInterceptor(new RequestContent());
-        httpproc.addInterceptor(new RequestTargetHost());
-        // Recommended protocol interceptors
-        httpproc.addInterceptor(new RequestClientConnControl());
-        httpproc.addInterceptor(new RequestUserAgent());
-        httpproc.addInterceptor(new RequestExpectContinue());
-        // HTTP state management interceptors
-        httpproc.addInterceptor(new RequestAddCookies());
-        httpproc.addInterceptor(new ResponseProcessCookies());
-        // HTTP authentication interceptors
-        httpproc.addInterceptor(new RequestAuthCache());
-        httpproc.addInterceptor(new RequestTargetAuthentication());
-        httpproc.addInterceptor(new RequestProxyAuthentication());
-        return httpproc;
-    }
-
-}
diff --git a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/client/DefaultResultCallback.java b/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/client/DefaultResultCallback.java
deleted file mode 100644
index ecf0acf..0000000
--- a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/client/DefaultResultCallback.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.client;
-
-import java.util.Queue;
-
-import org.apache.http.concurrent.BasicFuture;
-import org.apache.http.nio.protocol.HttpAsyncRequestExecutionHandler;
-
-@Deprecated
-class DefaultResultCallback<T> implements ResultCallback<T> {
-
-    private final BasicFuture<T> future;
-    private final Queue<HttpAsyncRequestExecutionHandler<?>> queue;
-
-    DefaultResultCallback(
-            final BasicFuture<T> future, final Queue<HttpAsyncRequestExecutionHandler<?>> queue) {
-        super();
-        this.future = future;
-        this.queue = queue;
-    }
-
-    @Override
-    public void completed(final T result, final HttpAsyncRequestExecutionHandler<T> handler) {
-        this.future.completed(result);
-        this.queue.remove(handler);
-    }
-
-    @Override
-    public void failed(final Exception ex, final HttpAsyncRequestExecutionHandler<T> handler) {
-        this.future.failed(ex);
-        this.queue.remove(handler);
-    }
-
-    @Override
-    public void cancelled(final HttpAsyncRequestExecutionHandler<T> handler) {
-        this.future.cancel(true);
-        this.queue.remove(handler);
-    }
-
-    @Override
-    public boolean isDone() {
-        return this.future.isDone();
-    }
-
-}
diff --git a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/client/ParamConfig.java b/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/client/ParamConfig.java
deleted file mode 100644
index 9239c3c..0000000
--- a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/client/ParamConfig.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.client;
-
-import java.util.Collection;
-
-import org.apache.http.auth.params.AuthPNames;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.params.ClientPNames;
-import org.apache.http.client.params.HttpClientParams;
-import org.apache.http.conn.params.ConnRouteParams;
-import org.apache.http.params.HttpConnectionParams;
-import org.apache.http.params.HttpParams;
-import org.apache.http.params.HttpProtocolParams;
-
-@Deprecated
-final class ParamConfig {
-
-    private ParamConfig() {
-    }
-
-    @SuppressWarnings("unchecked")
-    public static RequestConfig getRequestConfig(final HttpParams params) {
-        return RequestConfig.custom()
-                .setAuthenticationEnabled(HttpClientParams.isAuthenticating(params))
-                .setCircularRedirectsAllowed(params.getBooleanParameter(ClientPNames.ALLOW_CIRCULAR_REDIRECTS, false))
-                .setConnectionRequestTimeout((int) HttpClientParams.getConnectionManagerTimeout(params))
-                .setConnectTimeout(HttpConnectionParams.getConnectionTimeout(params))
-                .setCookieSpec(HttpClientParams.getCookiePolicy(params))
-                .setProxy(ConnRouteParams.getDefaultProxy(params))
-                .setExpectContinueEnabled(HttpProtocolParams.useExpectContinue(params))
-                .setLocalAddress(ConnRouteParams.getLocalAddress(params))
-                .setMaxRedirects(params.getIntParameter(ClientPNames.MAX_REDIRECTS, 50))
-                .setProxyPreferredAuthSchemes((Collection<String>) params.getParameter(
-                        AuthPNames.PROXY_AUTH_PREF))
-                .setTargetPreferredAuthSchemes((Collection<String>) params.getParameter(
-                        AuthPNames.TARGET_AUTH_PREF))
-                .setRedirectsEnabled(HttpClientParams.isRedirecting(params))
-                .setRelativeRedirectsAllowed(!params.getBooleanParameter(ClientPNames.REJECT_RELATIVE_REDIRECT, false))
-                .setSocketTimeout(HttpConnectionParams.getSoTimeout(params))
-                .setStaleConnectionCheckEnabled(HttpConnectionParams.isStaleCheckingEnabled(params))
-                .build();
-    }
-
-}
diff --git a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/client/ResultCallback.java b/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/client/ResultCallback.java
deleted file mode 100644
index f53e97c..0000000
--- a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/client/ResultCallback.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.client;
-
-import org.apache.http.nio.protocol.HttpAsyncRequestExecutionHandler;
-
-@Deprecated
-interface ResultCallback<T> {
-
-    void completed(T result, HttpAsyncRequestExecutionHandler<T> handler);
-
-    void failed(Exception ex, HttpAsyncRequestExecutionHandler<T> handler);
-
-    void cancelled(HttpAsyncRequestExecutionHandler<T> handler);
-
-    boolean isDone();
-
-}
diff --git a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/conn/AsyncSchemeRegistryFactory.java b/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/conn/AsyncSchemeRegistryFactory.java
deleted file mode 100644
index 16d86d1..0000000
--- a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/conn/AsyncSchemeRegistryFactory.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.conn;
-
-import org.apache.http.annotation.ThreadSafe;
-import org.apache.http.nio.conn.scheme.AsyncScheme;
-import org.apache.http.nio.conn.scheme.AsyncSchemeRegistry;
-import org.apache.http.nio.conn.ssl.SSLLayeringStrategy;
-
-@Deprecated
-@ThreadSafe
-public final class AsyncSchemeRegistryFactory {
-
-    public static AsyncSchemeRegistry createDefault() {
-        final AsyncSchemeRegistry registry = new AsyncSchemeRegistry();
-        registry.register(
-                new AsyncScheme("http", 80, null));
-        registry.register(
-                new AsyncScheme("https", 443, SSLLayeringStrategy.getDefaultStrategy()));
-        return registry;
-    }
-
-}
-
diff --git a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/conn/DefaultClientAsyncConnection.java b/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/conn/DefaultClientAsyncConnection.java
deleted file mode 100644
index 6dae8d9..0000000
--- a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/conn/DefaultClientAsyncConnection.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.conn;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.http.Header;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpResponseFactory;
-import org.apache.http.impl.nio.DefaultNHttpClientConnection;
-import org.apache.http.nio.conn.ClientAsyncConnection;
-import org.apache.http.nio.reactor.IOSession;
-import org.apache.http.nio.util.ByteBufferAllocator;
-import org.apache.http.params.HttpParams;
-
-@Deprecated
-public class DefaultClientAsyncConnection
-                    extends DefaultNHttpClientConnection implements ClientAsyncConnection {
-
-    private final Log headerlog = LogFactory.getLog("org.apache.http.headers");
-    private final Log wirelog   = LogFactory.getLog("org.apache.http.wire");
-    private final Log log;
-
-    private final String id;
-    private IOSession original;
-
-    public DefaultClientAsyncConnection(
-            final String id,
-            final IOSession iosession,
-            final HttpResponseFactory responseFactory,
-            final ByteBufferAllocator allocator,
-            final HttpParams params) {
-        super(iosession, responseFactory, allocator, params);
-        this.id = id;
-        this.original = iosession;
-        this.log = LogFactory.getLog(iosession.getClass());
-        if (this.log.isDebugEnabled() || this.wirelog.isDebugEnabled()) {
-            bind(new LoggingIOSession(iosession, this.id, this.log, this.wirelog));
-        }
-    }
-
-    @Override
-    public void upgrade(final IOSession iosession) {
-        this.original = iosession;
-        if (this.log.isDebugEnabled() || this.wirelog.isDebugEnabled()) {
-            this.log.debug(this.id + " Upgrade session " + iosession);
-            bind(new LoggingIOSession(iosession, this.id, this.headerlog, this.wirelog));
-        } else {
-            bind(iosession);
-        }
-    }
-
-    @Override
-    public IOSession getIOSession() {
-        return this.original;
-    }
-
-    public String getId() {
-        return this.id;
-    }
-
-    @Override
-    protected void onResponseReceived(final HttpResponse response) {
-        if (response != null && this.headerlog.isDebugEnabled()) {
-            this.headerlog.debug(this.id + " << " + response.getStatusLine().toString());
-            final Header[] headers = response.getAllHeaders();
-            for (final Header header : headers) {
-                this.headerlog.debug(this.id + " << " + header.toString());
-            }
-        }
-    }
-
-    @Override
-    protected void onRequestSubmitted(final HttpRequest request) {
-        if (request != null && this.headerlog.isDebugEnabled()) {
-            this.headerlog.debug(this.id + " >> " + request.getRequestLine().toString());
-            final Header[] headers = request.getAllHeaders();
-            for (final Header header : headers) {
-                this.headerlog.debug(this.id + " >> " + header.toString());
-            }
-        }
-    }
-
-    @Override
-    public String toString() {
-        final StringBuilder buf = new StringBuilder();
-        buf.append(this.id);
-        buf.append(" [");
-        switch (this.status) {
-        case ACTIVE:
-            buf.append("ACTIVE");
-            if (this.inbuf.hasData()) {
-                buf.append("(").append(this.inbuf.length()).append(")");
-            }
-            break;
-        case CLOSING:
-            buf.append("CLOSING");
-            break;
-        case CLOSED:
-            buf.append("CLOSED");
-            break;
-        }
-        buf.append("]");
-        return buf.toString();
-    }
-
-}
diff --git a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/conn/DefaultClientAsyncConnectionFactory.java b/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/conn/DefaultClientAsyncConnectionFactory.java
deleted file mode 100644
index 3c19cab..0000000
--- a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/conn/DefaultClientAsyncConnectionFactory.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.conn;
-
-import java.nio.charset.Charset;
-import java.nio.charset.CharsetDecoder;
-import java.nio.charset.CharsetEncoder;
-import java.nio.charset.CodingErrorAction;
-import java.util.concurrent.atomic.AtomicLong;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpResponseFactory;
-import org.apache.http.config.ConnectionConfig;
-import org.apache.http.impl.DefaultHttpResponseFactory;
-import org.apache.http.impl.nio.codecs.DefaultHttpResponseParserFactory;
-import org.apache.http.message.BasicLineParser;
-import org.apache.http.nio.NHttpMessageParserFactory;
-import org.apache.http.nio.conn.ClientAsyncConnection;
-import org.apache.http.nio.conn.ClientAsyncConnectionFactory;
-import org.apache.http.nio.conn.ManagedNHttpClientConnection;
-import org.apache.http.nio.conn.NHttpConnectionFactory;
-import org.apache.http.nio.reactor.IOEventDispatch;
-import org.apache.http.nio.reactor.IOSession;
-import org.apache.http.nio.util.ByteBufferAllocator;
-import org.apache.http.nio.util.HeapByteBufferAllocator;
-import org.apache.http.params.HttpParams;
-
-@Deprecated
-public class DefaultClientAsyncConnectionFactory
-    implements ClientAsyncConnectionFactory, NHttpConnectionFactory<ManagedNHttpClientConnection> {
-
-    private final Log headerlog = LogFactory.getLog("org.apache.http.headers");
-    private final Log wirelog = LogFactory.getLog("org.apache.http.wire");
-    private final Log log = LogFactory.getLog(ManagedNHttpClientConnectionImpl.class);
-
-    public static final DefaultClientAsyncConnectionFactory INSTANCE = new DefaultClientAsyncConnectionFactory(null, null);
-
-    private static AtomicLong COUNTER = new AtomicLong();
-
-    private final HttpResponseFactory responseFactory;
-    private final NHttpMessageParserFactory<HttpResponse> responseParserFactory;
-    private final ByteBufferAllocator allocator;
-
-    public DefaultClientAsyncConnectionFactory(
-            final NHttpMessageParserFactory<HttpResponse> responseParserFactory,
-            final ByteBufferAllocator allocator) {
-        super();
-        this.responseFactory = createHttpResponseFactory();
-        this.responseParserFactory = responseParserFactory != null ? responseParserFactory :
-            DefaultHttpResponseParserFactory.INSTANCE;
-        this.allocator = allocator != null ? allocator : HeapByteBufferAllocator.INSTANCE;
-    }
-
-    public DefaultClientAsyncConnectionFactory() {
-        super();
-        this.responseFactory = createHttpResponseFactory();
-        this.responseParserFactory = new DefaultHttpResponseParserFactory(
-            BasicLineParser.INSTANCE, this.responseFactory);
-        this.allocator = createByteBufferAllocator();
-    }
-
-    @Override
-    @Deprecated
-    public ClientAsyncConnection create(
-            final String id,
-            final IOSession iosession,
-            final HttpParams params) {
-        return new DefaultClientAsyncConnection(
-                id, iosession, this.responseFactory, this.allocator, params);
-    }
-
-    @Deprecated
-    protected ByteBufferAllocator createByteBufferAllocator() {
-        return HeapByteBufferAllocator.INSTANCE;
-    }
-
-    @Deprecated
-    protected HttpResponseFactory createHttpResponseFactory() {
-        return DefaultHttpResponseFactory.INSTANCE;
-    }
-
-    @Override
-    public ManagedNHttpClientConnection create(
-            final IOSession iosession, final ConnectionConfig config) {
-        final String id = "http-outgoing-" + Long.toString(COUNTER.getAndIncrement());
-        CharsetDecoder chardecoder = null;
-        CharsetEncoder charencoder = null;
-        final Charset charset = config.getCharset();
-        final CodingErrorAction malformedInputAction = config.getMalformedInputAction() != null ?
-                config.getMalformedInputAction() : CodingErrorAction.REPORT;
-        final CodingErrorAction unmappableInputAction = config.getUnmappableInputAction() != null ?
-                config.getUnmappableInputAction() : CodingErrorAction.REPORT;
-        if (charset != null) {
-            chardecoder = charset.newDecoder();
-            chardecoder.onMalformedInput(malformedInputAction);
-            chardecoder.onUnmappableCharacter(unmappableInputAction);
-            charencoder = charset.newEncoder();
-            charencoder.onMalformedInput(malformedInputAction);
-            charencoder.onUnmappableCharacter(unmappableInputAction);
-        }
-        final ManagedNHttpClientConnection conn = new ManagedNHttpClientConnectionImpl(
-                id,
-                this.log,
-                this.headerlog,
-                this.wirelog,
-                iosession,
-                config.getBufferSize(),
-                config.getFragmentSizeHint(),
-                this.allocator,
-                chardecoder, charencoder, config.getMessageConstraints(),
-                null, null, null,
-                this.responseParserFactory);
-        iosession.setAttribute(IOEventDispatch.CONNECTION_KEY, conn);
-        return conn;
-    }
-
-}
diff --git a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/conn/DefaultHttpAsyncRoutePlanner.java b/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/conn/DefaultHttpAsyncRoutePlanner.java
deleted file mode 100644
index d2bd306..0000000
--- a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/conn/DefaultHttpAsyncRoutePlanner.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.http.impl.nio.conn;
-
-import java.net.InetAddress;
-
-import org.apache.http.HttpException;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.client.protocol.ClientContext;
-import org.apache.http.conn.params.ConnRouteParams;
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.conn.routing.HttpRoutePlanner;
-import org.apache.http.nio.conn.scheme.AsyncScheme;
-import org.apache.http.nio.conn.scheme.AsyncSchemeRegistry;
-import org.apache.http.nio.conn.scheme.LayeringStrategy;
-import org.apache.http.protocol.HttpContext;
-
-@Deprecated
-public class DefaultHttpAsyncRoutePlanner implements HttpRoutePlanner {
-
-    private final AsyncSchemeRegistry schemeRegistry;
-
-    public DefaultHttpAsyncRoutePlanner(final AsyncSchemeRegistry schemeRegistry) {
-        super();
-        this.schemeRegistry = schemeRegistry;
-    }
-
-    private AsyncSchemeRegistry getSchemeRegistry(final HttpContext context) {
-        AsyncSchemeRegistry reg = (AsyncSchemeRegistry) context.getAttribute(
-                ClientContext.SCHEME_REGISTRY);
-        if (reg == null) {
-            reg = this.schemeRegistry;
-        }
-        return reg;
-    }
-
-    @Override
-    public HttpRoute determineRoute(
-            final HttpHost target,
-            final HttpRequest request,
-            final HttpContext context) throws HttpException {
-        if (request == null) {
-            throw new IllegalStateException("Request may not be null");
-        }
-        HttpRoute route = ConnRouteParams.getForcedRoute(request.getParams());
-        if (route != null) {
-            return route;
-        }
-        if (target == null) {
-            throw new IllegalStateException("Target host may be null");
-        }
-        final InetAddress local = ConnRouteParams.getLocalAddress(request.getParams());
-        final HttpHost proxy = ConnRouteParams.getDefaultProxy(request.getParams());
-        AsyncScheme scheme;
-        try {
-            final AsyncSchemeRegistry registry = getSchemeRegistry(context);
-            scheme = registry.getScheme(target);
-        } catch (final IllegalStateException ex) {
-            throw new HttpException(ex.getMessage());
-        }
-        final LayeringStrategy layeringStrategy = scheme.getLayeringStrategy();
-        final boolean secure = layeringStrategy != null && layeringStrategy.isSecure();
-        if (proxy == null) {
-            route = new HttpRoute(target, local, secure);
-        } else {
-            route = new HttpRoute(target, local, proxy, secure);
-        }
-        return route;
-    }
-
-}
diff --git a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/conn/HttpNIOConnPool.java b/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/conn/HttpNIOConnPool.java
deleted file mode 100644
index 385edca..0000000
--- a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/conn/HttpNIOConnPool.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.conn;
-
-import java.net.InetSocketAddress;
-import java.net.SocketAddress;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
-
-import org.apache.commons.logging.Log;
-import org.apache.http.HttpHost;
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.nio.conn.scheme.AsyncScheme;
-import org.apache.http.nio.conn.scheme.AsyncSchemeRegistry;
-import org.apache.http.nio.pool.AbstractNIOConnPool;
-import org.apache.http.nio.reactor.ConnectingIOReactor;
-import org.apache.http.nio.reactor.IOSession;
-
-@Deprecated
-class HttpNIOConnPool extends AbstractNIOConnPool<HttpRoute, IOSession, HttpPoolEntry> {
-
-    private static final AtomicLong COUNTER = new AtomicLong(1);
-
-    private final Log log;
-    private final AsyncSchemeRegistry schemeRegistry;
-    private final long connTimeToLive;
-    private final TimeUnit tunit;
-
-    HttpNIOConnPool(
-            final Log log,
-            final ConnectingIOReactor ioreactor,
-            final AsyncSchemeRegistry schemeRegistry,
-            final long connTimeToLive, final TimeUnit tunit) {
-        super(ioreactor, new HttpNIOConnPoolFactory(), 2, 20);
-        this.log = log;
-        this.schemeRegistry = schemeRegistry;
-        this.connTimeToLive = connTimeToLive;
-        this.tunit = tunit;
-    }
-
-    @Override
-    protected SocketAddress resolveLocalAddress(final HttpRoute route) {
-        return new InetSocketAddress(route.getLocalAddress(), 0);
-    }
-
-    @Override
-    protected SocketAddress resolveRemoteAddress(final HttpRoute route) {
-        HttpHost firsthop = route.getProxyHost();
-        if (firsthop == null) {
-            firsthop = route.getTargetHost();
-        }
-        final String hostname = firsthop.getHostName();
-        int port = firsthop.getPort();
-        if (port < 0) {
-            final AsyncScheme scheme = this.schemeRegistry.getScheme(firsthop);
-            port = scheme.resolvePort(port);
-        }
-        return new InetSocketAddress(hostname, port);
-    }
-
-    @Override
-    protected HttpPoolEntry createEntry(final HttpRoute route, final IOSession session) {
-        final String id = Long.toString(COUNTER.getAndIncrement());
-        return new HttpPoolEntry(this.log, id, route, session, this.connTimeToLive, this.tunit);
-    }
-
-}
diff --git a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/conn/HttpNIOConnPoolFactory.java b/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/conn/HttpNIOConnPoolFactory.java
deleted file mode 100644
index 9ef747d..0000000
--- a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/conn/HttpNIOConnPoolFactory.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.conn;
-
-import java.io.IOException;
-
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.nio.pool.NIOConnFactory;
-import org.apache.http.nio.reactor.IOSession;
-
-@Deprecated
-class HttpNIOConnPoolFactory implements NIOConnFactory<HttpRoute, IOSession> {
-
-    @Override
-    public IOSession create(final HttpRoute route, final IOSession session) throws IOException {
-        return session;
-    }
-
-}
diff --git a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/conn/HttpPoolEntry.java b/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/conn/HttpPoolEntry.java
deleted file mode 100644
index bacf08d..0000000
--- a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/conn/HttpPoolEntry.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.conn;
-
-import java.io.IOException;
-import java.util.Date;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.commons.logging.Log;
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.conn.routing.RouteTracker;
-import org.apache.http.nio.conn.ClientAsyncConnection;
-import org.apache.http.nio.reactor.IOEventDispatch;
-import org.apache.http.nio.reactor.IOSession;
-import org.apache.http.pool.PoolEntry;
-
-@Deprecated
-class HttpPoolEntry extends PoolEntry<HttpRoute, IOSession> {
-
-    private final Log log;
-    private final RouteTracker tracker;
-
-    HttpPoolEntry(final Log log, final String id, final HttpRoute route, final IOSession session,
-            final long timeToLive, final TimeUnit tunit) {
-        super(id, route, session, timeToLive, tunit);
-        this.log = log;
-        this.tracker = new RouteTracker(route);
-    }
-
-    @Override
-    public boolean isExpired(final long now) {
-        final boolean expired = super.isExpired(now);
-        if (expired && this.log.isDebugEnabled()) {
-            this.log.debug("Connection " + this + " expired @ " + new Date(getExpiry()));
-        }
-        return expired;
-    }
-
-    public ClientAsyncConnection getOperatedClientConnection() {
-        final IOSession session = getConnection();
-        return (ClientAsyncConnection) session.getAttribute(IOEventDispatch.CONNECTION_KEY);
-    }
-
-    @Override
-    public void close() {
-        try {
-            getOperatedClientConnection().shutdown();
-        } catch (final IOException ex) {
-            if (this.log.isDebugEnabled()) {
-                this.log.debug("I/O error shutting down connection", ex);
-            }
-        }
-    }
-
-    @Override
-    public boolean isClosed() {
-        final IOSession session = getConnection();
-        return session.isClosed();
-    }
-
-    HttpRoute getPlannedRoute() {
-        return super.getRoute();
-    }
-
-    RouteTracker getTracker() {
-        return this.tracker;
-    }
-
-    HttpRoute getEffectiveRoute() {
-        return this.tracker.toRoute();
-    }
-
-}
diff --git a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/conn/ManagedClientAsyncConnectionImpl.java b/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/conn/ManagedClientAsyncConnectionImpl.java
deleted file mode 100644
index 621b3fc..0000000
--- a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/conn/ManagedClientAsyncConnectionImpl.java
+++ /dev/null
@@ -1,452 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.conn;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.util.concurrent.TimeUnit;
-
-import javax.net.ssl.SSLSession;
-
-import org.apache.http.HttpConnectionMetrics;
-import org.apache.http.HttpException;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.protocol.ClientContext;
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.conn.routing.RouteTracker;
-import org.apache.http.impl.conn.ConnectionShutdownException;
-import org.apache.http.nio.conn.ClientAsyncConnection;
-import org.apache.http.nio.conn.ClientAsyncConnectionFactory;
-import org.apache.http.nio.conn.ClientAsyncConnectionManager;
-import org.apache.http.nio.conn.ManagedClientAsyncConnection;
-import org.apache.http.nio.conn.scheme.AsyncScheme;
-import org.apache.http.nio.conn.scheme.AsyncSchemeRegistry;
-import org.apache.http.nio.conn.scheme.LayeringStrategy;
-import org.apache.http.nio.reactor.IOEventDispatch;
-import org.apache.http.nio.reactor.IOSession;
-import org.apache.http.nio.reactor.ssl.SSLIOSession;
-import org.apache.http.params.HttpParams;
-import org.apache.http.protocol.HttpContext;
-
-@Deprecated
-class ManagedClientAsyncConnectionImpl implements ManagedClientAsyncConnection {
-
-    private final ClientAsyncConnectionManager manager;
-    private final ClientAsyncConnectionFactory connFactory;
-    private volatile HttpPoolEntry poolEntry;
-    private volatile boolean reusable;
-    private volatile long duration;
-
-    ManagedClientAsyncConnectionImpl(
-            final ClientAsyncConnectionManager manager,
-            final ClientAsyncConnectionFactory connFactory,
-            final HttpPoolEntry poolEntry) {
-        super();
-        this.manager = manager;
-        this.connFactory = connFactory;
-        this.poolEntry = poolEntry;
-        this.reusable = true;
-        this.duration = Long.MAX_VALUE;
-    }
-
-    HttpPoolEntry getPoolEntry() {
-        return this.poolEntry;
-    }
-
-    HttpPoolEntry detach() {
-        final HttpPoolEntry local = this.poolEntry;
-        this.poolEntry = null;
-        return local;
-    }
-
-    public ClientAsyncConnectionManager getManager() {
-        return this.manager;
-    }
-
-    private ClientAsyncConnection getConnection() {
-        final HttpPoolEntry local = this.poolEntry;
-        if (local == null) {
-            return null;
-        }
-        final IOSession session = local.getConnection();
-        return (ClientAsyncConnection) session.getAttribute(IOEventDispatch.CONNECTION_KEY);
-    }
-
-    private ClientAsyncConnection ensureConnection() {
-        final HttpPoolEntry local = this.poolEntry;
-        if (local == null) {
-            throw new ConnectionShutdownException();
-        }
-        final IOSession session = local.getConnection();
-        return (ClientAsyncConnection) session.getAttribute(IOEventDispatch.CONNECTION_KEY);
-    }
-
-    private HttpPoolEntry ensurePoolEntry() {
-        final HttpPoolEntry local = this.poolEntry;
-        if (local == null) {
-            throw new ConnectionShutdownException();
-        }
-        return local;
-    }
-
-    @Override
-    public void close() throws IOException {
-        final ClientAsyncConnection conn = getConnection();
-        if (conn != null) {
-            conn.close();
-        }
-    }
-
-    @Override
-    public void shutdown() throws IOException {
-        final ClientAsyncConnection conn = getConnection();
-        if (conn != null) {
-            conn.shutdown();
-        }
-    }
-
-    @Override
-    public boolean isOpen() {
-        final ClientAsyncConnection conn = getConnection();
-        if (conn != null) {
-            return conn.isOpen();
-        }
-        return false;
-    }
-
-    @Override
-    public boolean isStale() {
-        return isOpen();
-    }
-
-    @Override
-    public void setSocketTimeout(final int timeout) {
-        final ClientAsyncConnection conn = ensureConnection();
-        conn.setSocketTimeout(timeout);
-    }
-
-    @Override
-    public int getSocketTimeout() {
-        final ClientAsyncConnection conn = ensureConnection();
-        return conn.getSocketTimeout();
-    }
-
-    @Override
-    public HttpConnectionMetrics getMetrics() {
-        final ClientAsyncConnection conn = ensureConnection();
-        return conn.getMetrics();
-    }
-
-    @Override
-    public InetAddress getLocalAddress() {
-        final ClientAsyncConnection conn = ensureConnection();
-        return conn.getLocalAddress();
-    }
-
-    @Override
-    public int getLocalPort() {
-        final ClientAsyncConnection conn = ensureConnection();
-        return conn.getLocalPort();
-    }
-
-    @Override
-    public InetAddress getRemoteAddress() {
-        final ClientAsyncConnection conn = ensureConnection();
-        return conn.getRemoteAddress();
-    }
-
-    @Override
-    public int getRemotePort() {
-        final ClientAsyncConnection conn = ensureConnection();
-        return conn.getRemotePort();
-    }
-
-    @Override
-    public int getStatus() {
-        final ClientAsyncConnection conn = ensureConnection();
-        return conn.getStatus();
-    }
-
-    @Override
-    public HttpRequest getHttpRequest() {
-        final ClientAsyncConnection conn = ensureConnection();
-        return conn.getHttpRequest();
-    }
-
-    @Override
-    public HttpResponse getHttpResponse() {
-        final ClientAsyncConnection conn = ensureConnection();
-        return conn.getHttpResponse();
-    }
-
-    @Override
-    public HttpContext getContext() {
-        final ClientAsyncConnection conn = ensureConnection();
-        return conn.getContext();
-    }
-
-    @Override
-    public void requestInput() {
-        final ClientAsyncConnection conn = ensureConnection();
-        conn.requestInput();
-    }
-
-    @Override
-    public void suspendInput() {
-        final ClientAsyncConnection conn = ensureConnection();
-        conn.suspendInput();
-    }
-
-    @Override
-    public void requestOutput() {
-        final ClientAsyncConnection conn = ensureConnection();
-        conn.requestOutput();
-    }
-
-    @Override
-    public void suspendOutput() {
-        final ClientAsyncConnection conn = ensureConnection();
-        conn.suspendOutput();
-    }
-
-    @Override
-    public void submitRequest(final HttpRequest request) throws IOException, HttpException {
-        final ClientAsyncConnection conn = ensureConnection();
-        conn.submitRequest(request);
-    }
-
-    @Override
-    public boolean isRequestSubmitted() {
-        final ClientAsyncConnection conn = ensureConnection();
-        return conn.isRequestSubmitted();
-    }
-
-    @Override
-    public void resetOutput() {
-        final ClientAsyncConnection conn = ensureConnection();
-        conn.resetOutput();
-    }
-
-    @Override
-    public void resetInput() {
-        final ClientAsyncConnection conn = ensureConnection();
-        conn.resetInput();
-    }
-
-    @Override
-    public boolean isSecure() {
-        final ClientAsyncConnection conn = ensureConnection();
-        return conn.getIOSession() instanceof SSLIOSession;
-    }
-
-    @Override
-    public HttpRoute getRoute() {
-        final HttpPoolEntry entry = ensurePoolEntry();
-        return entry.getEffectiveRoute();
-    }
-
-    @Override
-    public SSLSession getSSLSession() {
-        final ClientAsyncConnection conn = ensureConnection();
-        final IOSession iosession = conn.getIOSession();
-        if (iosession instanceof SSLIOSession) {
-            return ((SSLIOSession) iosession).getSSLSession();
-        }
-        return null;
-    }
-
-    @Override
-    public Object getState() {
-        final HttpPoolEntry entry = ensurePoolEntry();
-        return entry.getState();
-    }
-
-    @Override
-    public void setState(final Object state) {
-        final HttpPoolEntry entry = ensurePoolEntry();
-        entry.setState(state);
-    }
-
-    @Override
-    public void markReusable() {
-        this.reusable = true;
-    }
-
-    @Override
-    public void unmarkReusable() {
-        this.reusable = false;
-    }
-
-    @Override
-    public boolean isMarkedReusable() {
-        return this.reusable;
-    }
-
-    @Override
-    public void setIdleDuration(final long duration, final TimeUnit unit) {
-        if(duration > 0) {
-            this.duration = unit.toMillis(duration);
-        } else {
-            this.duration = -1;
-        }
-    }
-
-    private AsyncSchemeRegistry getSchemeRegistry(final HttpContext context) {
-        AsyncSchemeRegistry reg = (AsyncSchemeRegistry) context.getAttribute(
-                ClientContext.SCHEME_REGISTRY);
-        if (reg == null) {
-            reg = this.manager.getSchemeRegistry();
-        }
-        return reg;
-    }
-
-    @Override
-    public synchronized void open(
-            final HttpRoute route,
-            final HttpContext context,
-            final HttpParams params) throws IOException {
-        final HttpPoolEntry entry = ensurePoolEntry();
-        final RouteTracker tracker = entry.getTracker();
-        if (tracker.isConnected()) {
-            throw new IllegalStateException("Connection already open");
-        }
-
-        final HttpHost target = route.getTargetHost();
-        final HttpHost proxy = route.getProxyHost();
-        IOSession iosession = entry.getConnection();
-
-        if (proxy == null) {
-            final AsyncScheme scheme = getSchemeRegistry(context).getScheme(target);
-            final LayeringStrategy layeringStrategy = scheme.getLayeringStrategy();
-            if (layeringStrategy != null) {
-                iosession = layeringStrategy.layer(iosession);
-            }
-        }
-
-        final ClientAsyncConnection conn = this.connFactory.create(
-                "http-outgoing-" + entry.getId(),
-                iosession,
-                params);
-        iosession.setAttribute(IOEventDispatch.CONNECTION_KEY, conn);
-
-        if (proxy == null) {
-            tracker.connectTarget(conn.getIOSession() instanceof SSLIOSession);
-        } else {
-            tracker.connectProxy(proxy, false);
-        }
-    }
-
-    @Override
-    public synchronized void tunnelProxy(
-            final HttpHost next, final HttpParams params) throws IOException {
-        final HttpPoolEntry entry = ensurePoolEntry();
-        final RouteTracker tracker = entry.getTracker();
-        if (!tracker.isConnected()) {
-            throw new IllegalStateException("Connection not open");
-        }
-        tracker.tunnelProxy(next, false);
-    }
-
-    @Override
-    public synchronized void tunnelTarget(
-            final HttpParams params) throws IOException {
-        final HttpPoolEntry entry = ensurePoolEntry();
-        final RouteTracker tracker = entry.getTracker();
-        if (!tracker.isConnected()) {
-            throw new IllegalStateException("Connection not open");
-        }
-        if (tracker.isTunnelled()) {
-            throw new IllegalStateException("Connection is already tunnelled");
-        }
-        tracker.tunnelTarget(false);
-    }
-
-    @Override
-    public synchronized void layerProtocol(
-            final HttpContext context, final HttpParams params) throws IOException {
-        final HttpPoolEntry entry = ensurePoolEntry();
-        final RouteTracker tracker = entry.getTracker();
-        if (!tracker.isConnected()) {
-            throw new IllegalStateException("Connection not open");
-        }
-        if (!tracker.isTunnelled()) {
-            throw new IllegalStateException("Protocol layering without a tunnel not supported");
-        }
-        if (tracker.isLayered()) {
-            throw new IllegalStateException("Multiple protocol layering not supported");
-        }
-        final HttpHost target = tracker.getTargetHost();
-        final AsyncScheme scheme = getSchemeRegistry(context).getScheme(target);
-        final LayeringStrategy layeringStrategy = scheme.getLayeringStrategy();
-        if (layeringStrategy == null) {
-            throw new IllegalStateException(scheme.getName() +
-                    " scheme does not provider support for protocol layering");
-        }
-        final IOSession iosession = entry.getConnection();
-        final ClientAsyncConnection conn = (ClientAsyncConnection) iosession.getAttribute(
-                IOEventDispatch.CONNECTION_KEY);
-        conn.upgrade((SSLIOSession) layeringStrategy.layer(iosession));
-        tracker.layerProtocol(layeringStrategy.isSecure());
-    }
-
-    @Override
-    public synchronized void releaseConnection() {
-        if (this.poolEntry == null) {
-            return;
-        }
-        this.manager.releaseConnection(this, this.duration, TimeUnit.MILLISECONDS);
-        this.poolEntry = null;
-    }
-
-    @Override
-    public synchronized void abortConnection() {
-        if (this.poolEntry == null) {
-            return;
-        }
-        this.reusable = false;
-        final IOSession iosession = this.poolEntry.getConnection();
-        final ClientAsyncConnection conn = (ClientAsyncConnection) iosession.getAttribute(
-                IOEventDispatch.CONNECTION_KEY);
-        try {
-            conn.shutdown();
-        } catch (final IOException ignore) {
-        }
-        this.manager.releaseConnection(this, this.duration, TimeUnit.MILLISECONDS);
-        this.poolEntry = null;
-    }
-
-    @Override
-    public synchronized String toString() {
-        if (this.poolEntry != null) {
-            return this.poolEntry.toString();
-        }
-        return "released";
-    }
-
-}
diff --git a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/conn/PoolingClientAsyncConnectionManager.java b/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/conn/PoolingClientAsyncConnectionManager.java
deleted file mode 100644
index 582243e..0000000
--- a/httpasyncclient/src/main/java-deprecated/org/apache/http/impl/nio/conn/PoolingClientAsyncConnectionManager.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.conn;
-
-import java.io.IOException;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.http.concurrent.BasicFuture;
-import org.apache.http.concurrent.FutureCallback;
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.nio.conn.ClientAsyncConnectionFactory;
-import org.apache.http.nio.conn.ClientAsyncConnectionManager;
-import org.apache.http.nio.conn.ManagedClientAsyncConnection;
-import org.apache.http.nio.conn.scheme.AsyncSchemeRegistry;
-import org.apache.http.nio.reactor.ConnectingIOReactor;
-import org.apache.http.nio.reactor.IOEventDispatch;
-import org.apache.http.nio.reactor.IOReactorException;
-import org.apache.http.nio.reactor.IOReactorStatus;
-import org.apache.http.pool.ConnPoolControl;
-import org.apache.http.pool.PoolStats;
-import org.apache.http.util.Args;
-
-@Deprecated
-public class PoolingClientAsyncConnectionManager
-                              implements ClientAsyncConnectionManager, ConnPoolControl<HttpRoute> {
-
-    private final Log log = LogFactory.getLog(getClass());
-
-    private final ConnectingIOReactor ioreactor;
-    private final HttpNIOConnPool pool;
-    private final AsyncSchemeRegistry schemeRegistry;
-    private final ClientAsyncConnectionFactory connFactory;
-
-    public PoolingClientAsyncConnectionManager(
-            final ConnectingIOReactor ioreactor,
-            final AsyncSchemeRegistry schemeRegistry,
-            final long timeToLive, final TimeUnit tunit) {
-        super();
-        Args.notNull(ioreactor, "I/O reactor");
-        Args.notNull(schemeRegistry, "Scheme registory");
-        Args.notNull(tunit, "Time unit");
-        this.ioreactor = ioreactor;
-        this.pool = new HttpNIOConnPool(this.log, ioreactor, schemeRegistry, timeToLive, tunit);
-        this.schemeRegistry = schemeRegistry;
-        this.connFactory = createClientAsyncConnectionFactory();
-    }
-
-    public PoolingClientAsyncConnectionManager(
-            final ConnectingIOReactor ioreactor,
-            final AsyncSchemeRegistry schemeRegistry) throws IOReactorException {
-        this(ioreactor, schemeRegistry, -1, TimeUnit.MILLISECONDS);
-    }
-
-    public PoolingClientAsyncConnectionManager(
-            final ConnectingIOReactor ioreactor) throws IOReactorException {
-        this(ioreactor, AsyncSchemeRegistryFactory.createDefault());
-    }
-
-    @Override
-    protected void finalize() throws Throwable {
-        try {
-            shutdown();
-        } finally {
-            super.finalize();
-        }
-    }
-
-    protected ClientAsyncConnectionFactory createClientAsyncConnectionFactory() {
-        return new DefaultClientAsyncConnectionFactory();
-    }
-
-    @Override
-    public AsyncSchemeRegistry getSchemeRegistry() {
-        return this.schemeRegistry;
-    }
-
-    @Override
-    public void execute(final IOEventDispatch eventDispatch) throws IOException {
-        this.ioreactor.execute(eventDispatch);
-    }
-
-    @Override
-    public IOReactorStatus getStatus() {
-        return this.ioreactor.getStatus();
-    }
-
-    @Override
-    public void shutdown(final long waitMs) throws IOException {
-        this.log.debug("Connection manager is shutting down");
-        this.pool.shutdown(waitMs);
-        this.log.debug("Connection manager shut down");
-    }
-
-    @Override
-    public void shutdown() throws IOException {
-        this.log.debug("Connection manager is shutting down");
-        this.pool.shutdown(2000);
-        this.log.debug("Connection manager shut down");
-    }
-
-    private String format(final HttpRoute route, final Object state) {
-        final StringBuilder buf = new StringBuilder();
-        buf.append("[route: ").append(route).append("]");
-        if (state != null) {
-            buf.append("[state: ").append(state).append("]");
-        }
-        return buf.toString();
-    }
-
-    private String formatStats(final HttpRoute route) {
-        final StringBuilder buf = new StringBuilder();
-        final PoolStats totals = this.pool.getTotalStats();
-        final PoolStats stats = this.pool.getStats(route);
-        buf.append("[total kept alive: ").append(totals.getAvailable()).append("; ");
-        buf.append("route allocated: ").append(stats.getLeased() + stats.getAvailable());
-        buf.append(" of ").append(stats.getMax()).append("; ");
-        buf.append("total allocated: ").append(totals.getLeased() + totals.getAvailable());
-        buf.append(" of ").append(totals.getMax()).append("]");
-        return buf.toString();
-    }
-
-    private String format(final HttpPoolEntry entry) {
-        final StringBuilder buf = new StringBuilder();
-        buf.append("[id: ").append(entry.getId()).append("]");
-        buf.append("[route: ").append(entry.getRoute()).append("]");
-        final Object state = entry.getState();
-        if (state != null) {
-            buf.append("[state: ").append(state).append("]");
-        }
-        return buf.toString();
-    }
-
-    @Override
-    public Future<ManagedClientAsyncConnection> leaseConnection(
-            final HttpRoute route,
-            final Object state,
-            final long connectTimeout,
-            final TimeUnit tunit,
-            final FutureCallback<ManagedClientAsyncConnection> callback) {
-        Args.notNull(route, "HTTP route");
-        Args.notNull(tunit, "Time unit");
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("Connection request: " + format(route, state) + formatStats(route));
-        }
-        final BasicFuture<ManagedClientAsyncConnection> future = new BasicFuture<ManagedClientAsyncConnection>(
-                callback);
-        this.pool.lease(route, state, connectTimeout, tunit, new InternalPoolEntryCallback(future));
-        return future;
-    }
-
-    @Override
-    public void releaseConnection(
-            final ManagedClientAsyncConnection conn,
-            final long keepalive,
-            final TimeUnit tunit) {
-        Args.notNull(conn, "HTTP connection");
-        if (!(conn instanceof ManagedClientAsyncConnectionImpl)) {
-            throw new IllegalArgumentException("Connection class mismatch, " +
-                 "connection not obtained from this manager");
-        }
-        Args.notNull(tunit, "Time unit");
-        final ManagedClientAsyncConnectionImpl managedConn = (ManagedClientAsyncConnectionImpl) conn;
-        final ClientAsyncConnectionManager manager = managedConn.getManager();
-        if (manager != null && manager != this) {
-            throw new IllegalArgumentException("Connection not obtained from this manager");
-        }
-        if (this.pool.isShutdown()) {
-            return;
-        }
-
-        synchronized (managedConn) {
-            final HttpPoolEntry entry = managedConn.getPoolEntry();
-            if (entry == null) {
-                return;
-            }
-            try {
-                if (managedConn.isOpen() && !managedConn.isMarkedReusable()) {
-                    try {
-                        managedConn.shutdown();
-                    } catch (final IOException iox) {
-                        if (this.log.isDebugEnabled()) {
-                            this.log.debug("I/O exception shutting down released connection", iox);
-                        }
-                    }
-                }
-                if (managedConn.isOpen()) {
-                    entry.updateExpiry(keepalive, tunit != null ? tunit : TimeUnit.MILLISECONDS);
-                    if (this.log.isDebugEnabled()) {
-                        String s;
-                        if (keepalive > 0) {
-                            s = "for " + keepalive + " " + tunit;
-                        } else {
-                            s = "indefinitely";
-                        }
-                        this.log.debug("Connection " + format(entry) + " can be kept alive " + s);
-                    }
-                    // Do not time out pooled connection
-                    managedConn.setSocketTimeout(0);
-                }
-            } finally {
-                this.pool.release(managedConn.detach(), managedConn.isMarkedReusable());
-            }
-            if (this.log.isDebugEnabled()) {
-                this.log.debug("Connection released: " + format(entry) + formatStats(entry.getRoute()));
-            }
-        }
-    }
-
-    @Override
-    public PoolStats getTotalStats() {
-        return this.pool.getTotalStats();
-    }
-
-    @Override
-    public PoolStats getStats(final HttpRoute route) {
-        return this.pool.getStats(route);
-    }
-
-    @Override
-    public void setMaxTotal(final int max) {
-        this.pool.setMaxTotal(max);
-    }
-
-    @Override
-    public void setDefaultMaxPerRoute(final int max) {
-        this.pool.setDefaultMaxPerRoute(max);
-    }
-
-    @Override
-    public void setMaxPerRoute(final HttpRoute route, final int max) {
-        this.pool.setMaxPerRoute(route, max);
-    }
-
-    @Override
-    public int getMaxTotal() {
-        return this.pool.getMaxTotal();
-    }
-
-    @Override
-    public int getDefaultMaxPerRoute() {
-        return this.pool.getDefaultMaxPerRoute();
-    }
-
-    @Override
-    public int getMaxPerRoute(final HttpRoute route) {
-        return this.pool.getMaxPerRoute(route);
-    }
-
-    public void closeIdleConnections(final long idleTimeout, final TimeUnit tunit) {
-        if (log.isDebugEnabled()) {
-            log.debug("Closing connections idle longer than " + idleTimeout + " " + tunit);
-        }
-        this.pool.closeIdle(idleTimeout, tunit);
-    }
-
-    public void closeExpiredConnections() {
-        log.debug("Closing expired connections");
-        this.pool.closeExpired();
-    }
-
-    class InternalPoolEntryCallback implements FutureCallback<HttpPoolEntry> {
-
-        private final BasicFuture<ManagedClientAsyncConnection> future;
-
-        public InternalPoolEntryCallback(
-                final BasicFuture<ManagedClientAsyncConnection> future) {
-            super();
-            this.future = future;
-        }
-
-        @Override
-        public void completed(final HttpPoolEntry entry) {
-            if (log.isDebugEnabled()) {
-                log.debug("Connection leased: " + format(entry) + formatStats(entry.getRoute()));
-            }
-            final ManagedClientAsyncConnection conn = new ManagedClientAsyncConnectionImpl(
-                    PoolingClientAsyncConnectionManager.this,
-                    PoolingClientAsyncConnectionManager.this.connFactory,
-                    entry);
-            if (!this.future.completed(conn)) {
-                pool.release(entry, true);
-            }
-        }
-
-        @Override
-        public void failed(final Exception ex) {
-            if (log.isDebugEnabled()) {
-                log.debug("Connection request failed", ex);
-            }
-            this.future.failed(ex);
-        }
-
-        @Override
-        public void cancelled() {
-            log.debug("Connection request cancelled");
-            this.future.cancel(true);
-        }
-
-    }
-
-}
diff --git a/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/ClientAsyncConnection.java b/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/ClientAsyncConnection.java
deleted file mode 100644
index b47cbda..0000000
--- a/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/ClientAsyncConnection.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.conn;
-
-import org.apache.http.HttpInetConnection;
-import org.apache.http.nio.NHttpClientConnection;
-import org.apache.http.nio.reactor.IOSession;
-
-@Deprecated
-public interface ClientAsyncConnection extends NHttpClientConnection, HttpInetConnection {
-
-    void upgrade(IOSession iosession);
-
-    IOSession getIOSession();
-
-}
diff --git a/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/ClientAsyncConnectionFactory.java b/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/ClientAsyncConnectionFactory.java
deleted file mode 100644
index a0b4422..0000000
--- a/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/ClientAsyncConnectionFactory.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.conn;
-
-import org.apache.http.nio.reactor.IOSession;
-import org.apache.http.params.HttpParams;
-
-@Deprecated
-public interface ClientAsyncConnectionFactory {
-
-    ClientAsyncConnection create(String id, IOSession iosession, HttpParams params);
-
-}
diff --git a/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/ClientAsyncConnectionManager.java b/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/ClientAsyncConnectionManager.java
deleted file mode 100644
index ccde65f..0000000
--- a/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/ClientAsyncConnectionManager.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.conn;
-
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.http.concurrent.FutureCallback;
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.nio.conn.scheme.AsyncSchemeRegistry;
-import org.apache.http.nio.reactor.IOReactor;
-
-@Deprecated
-public interface ClientAsyncConnectionManager extends IOReactor {
-
-    AsyncSchemeRegistry getSchemeRegistry();
-
-    Future<ManagedClientAsyncConnection> leaseConnection(
-            HttpRoute route, Object state,
-            long connectTimeout, TimeUnit timeUnit,
-            FutureCallback<ManagedClientAsyncConnection> callback);
-
-    void releaseConnection(ManagedClientAsyncConnection session,
-            long validDuration, TimeUnit timeUnit);
-
-}
diff --git a/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/ManagedClientAsyncConnection.java b/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/ManagedClientAsyncConnection.java
deleted file mode 100644
index b40042d..0000000
--- a/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/ManagedClientAsyncConnection.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.conn;
-
-import java.io.IOException;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.http.HttpHost;
-import org.apache.http.conn.ConnectionReleaseTrigger;
-import org.apache.http.conn.HttpRoutedConnection;
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.nio.NHttpClientConnection;
-import org.apache.http.params.HttpParams;
-import org.apache.http.protocol.HttpContext;
-
-@Deprecated
-public interface ManagedClientAsyncConnection
-    extends HttpRoutedConnection, NHttpClientConnection, ConnectionReleaseTrigger {
-
-    Object getState();
-
-    void setState(Object state);
-
-    void markReusable();
-
-    void unmarkReusable();
-
-    boolean isMarkedReusable();
-
-    void open(HttpRoute route, HttpContext context, HttpParams params) throws IOException;
-
-    void tunnelTarget(HttpParams params) throws IOException;
-
-    void tunnelProxy(HttpHost next, HttpParams params) throws IOException;
-
-    void layerProtocol(HttpContext context, HttpParams params) throws IOException;
-
-    void setIdleDuration(long duration, TimeUnit tunit);
-
-}
diff --git a/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/scheme/AsyncScheme.java b/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/scheme/AsyncScheme.java
deleted file mode 100644
index e9ebbe1..0000000
--- a/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/scheme/AsyncScheme.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.conn.scheme;
-
-import java.util.Locale;
-
-import org.apache.http.util.Args;
-import org.apache.http.util.LangUtils;
-
-@Deprecated
-public final class AsyncScheme {
-
-    /** The name of this scheme, in lowercase. (e.g. http, https) */
-    private final String name;
-
-    /** The layering strategy for this scheme, if applicable */
-    private final LayeringStrategy strategy;
-
-    /** The default port for this scheme */
-    private final int defaultPort;
-
-    /** A string representation, for {@link #toString toString}. */
-    private String stringRep;
-    /*
-     *  This is used to cache the result of the toString() method
-     *  Since the method always generates the same value, there's no
-     *  need to synchronize, and it does not affect immutability.
-    */
-
-    public AsyncScheme(final String name, final int port, final LayeringStrategy strategy) {
-        Args.notNull(name, "Scheme name");
-        if ((port <= 0) || (port > 0xffff)) {
-            throw new IllegalArgumentException("Port is invalid: " + port);
-        }
-        this.name = name.toLowerCase(Locale.ROOT);
-        this.strategy = strategy;
-        this.defaultPort = port;
-    }
-
-    public final int getDefaultPort() {
-        return defaultPort;
-    }
-
-    public final LayeringStrategy getLayeringStrategy() {
-        return this.strategy;
-    }
-
-    public final String getName() {
-        return name;
-    }
-
-    public final int resolvePort(final int port) {
-        return port <= 0 ? defaultPort : port;
-    }
-
-    @Override
-    public final String toString() {
-        if (stringRep == null) {
-            final StringBuilder buffer = new StringBuilder();
-            buffer.append(this.name);
-            buffer.append(':');
-            buffer.append(Integer.toString(this.defaultPort));
-            stringRep = buffer.toString();
-        }
-        return stringRep;
-    }
-
-    @Override
-    public final boolean equals(final Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj instanceof AsyncScheme) {
-            final AsyncScheme that = (AsyncScheme) obj;
-            return this.name.equals(that.name)
-                && this.defaultPort == that.defaultPort
-                && this.strategy.equals(that.strategy);
-        }
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        int hash = LangUtils.HASH_SEED;
-        hash = LangUtils.hashCode(hash, this.defaultPort);
-        hash = LangUtils.hashCode(hash, this.name);
-        hash = LangUtils.hashCode(hash, this.strategy);
-        return hash;
-    }
-
-}
diff --git a/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/scheme/AsyncSchemeRegistry.java b/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/scheme/AsyncSchemeRegistry.java
deleted file mode 100644
index 9f2062e..0000000
--- a/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/scheme/AsyncSchemeRegistry.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.conn.scheme;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.apache.http.HttpHost;
-
-/**
- * A set of supported protocol {@link AsyncScheme}s.
- * Schemes are identified by lowercase names.
- *
- */
-@Deprecated
-public final class AsyncSchemeRegistry {
-
-    /** The available schemes in this registry. */
-    private final Map<String, AsyncScheme> registeredSchemes;
-
-    /**
-     * Creates a new, empty scheme registry.
-     */
-    public AsyncSchemeRegistry() {
-        super();
-        registeredSchemes = new ConcurrentHashMap<String, AsyncScheme>();
-    }
-
-    /**
-     * Obtains a scheme by name.
-     *
-     * @param name      the name of the scheme to look up (in lowercase)
-     *
-     * @return  the scheme, never {@code null}
-     *
-     * @throws IllegalStateException
-     *          if the scheme with the given name is not registered
-     */
-    public final AsyncScheme getScheme(final String name) {
-        final AsyncScheme found = get(name);
-        if (found == null) {
-            throw new IllegalStateException
-                ("Scheme '"+name+"' not registered.");
-        }
-        return found;
-    }
-
-    /**
-     * Obtains the scheme for a host.
-     * Convenience method for {@code getScheme(host.getSchemeName())}
-     *
-     * @param host      the host for which to obtain the scheme
-     *
-     * @return  the scheme for the given host, never {@code null}
-     *
-     * @throws IllegalStateException
-     *          if a scheme with the respective name is not registered
-     */
-    public final AsyncScheme getScheme(final HttpHost host) {
-        if (host == null) {
-            throw new IllegalArgumentException("Host must not be null.");
-        }
-        return getScheme(host.getSchemeName());
-    }
-
-    /**
-     * Obtains a scheme by name, if registered.
-     *
-     * @param name      the name of the scheme to look up (in lowercase)
-     *
-     * @return  the scheme, or
-     *          {@code null} if there is none by this name
-     */
-    public final AsyncScheme get(final String name) {
-        if (name == null) {
-            throw new IllegalArgumentException("Name must not be null.");
-        }
-
-        // leave it to the caller to use the correct name - all lowercase
-        //name = name.toLowerCase(Locale.ENGLISH);
-        final AsyncScheme found = registeredSchemes.get(name);
-        return found;
-    }
-
-    /**
-     * Registers a scheme.
-     * The scheme can later be retrieved by its name
-     * using {@link #getScheme(String) getScheme} or {@link #get get}.
-     *
-     * @param sch       the scheme to register
-     *
-     * @return  the scheme previously registered with that name, or
-     *          {@code null} if none was registered
-     */
-    public final AsyncScheme register(final AsyncScheme sch) {
-        if (sch == null) {
-            throw new IllegalArgumentException("Scheme must not be null.");
-        }
-
-        final AsyncScheme old = registeredSchemes.put(sch.getName(), sch);
-        return old;
-    }
-
-    /**
-     * Unregisters a scheme.
-     *
-     * @param name      the name of the scheme to unregister (in lowercase)
-     *
-     * @return  the unregistered scheme, or
-     *          {@code null} if there was none
-     */
-    public final AsyncScheme unregister(final String name) {
-        if (name == null) {
-            throw new IllegalArgumentException("Name must not be null.");
-        }
-
-        // leave it to the caller to use the correct name - all lowercase
-        //name = name.toLowerCase(Locale.ENGLISH);
-        final AsyncScheme gone = registeredSchemes.remove(name);
-        return gone;
-    }
-
-    /**
-     * Obtains the names of the registered schemes.
-     *
-     * @return  List containing registered scheme names.
-     */
-    public final List<String> getSchemeNames() {
-        return new ArrayList<String>(registeredSchemes.keySet());
-    }
-
-    /**
-     * Populates the internal collection of registered {@link AsyncScheme protocol schemes}
-     * with the content of the map passed as a parameter.
-     *
-     * @param map protocol schemes
-     */
-    public void setItems(final Map<String, AsyncScheme> map) {
-        if (map == null) {
-            return;
-        }
-        registeredSchemes.clear();
-        registeredSchemes.putAll(map);
-    }
-
-}
-
diff --git a/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/scheme/LayeringStrategy.java b/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/scheme/LayeringStrategy.java
deleted file mode 100644
index c794acf..0000000
--- a/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/scheme/LayeringStrategy.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.conn.scheme;
-
-import org.apache.http.nio.reactor.IOSession;
-
-@Deprecated
-public interface LayeringStrategy {
-
-    boolean isSecure();
-
-    IOSession layer(IOSession iosession);
-
-}
diff --git a/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/scheme/package-info.java b/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/scheme/package-info.java
deleted file mode 100644
index 7284593..0000000
--- a/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/scheme/package-info.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-/**
- * Deprecated
- */
-package org.apache.http.nio.conn.scheme;
diff --git a/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/ssl/SSLLayeringStrategy.java b/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/ssl/SSLLayeringStrategy.java
deleted file mode 100644
index e1c852d..0000000
--- a/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/ssl/SSLLayeringStrategy.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.http.nio.conn.ssl;
-
-import java.net.InetSocketAddress;
-import java.security.KeyManagementException;
-import java.security.KeyStore;
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
-import java.security.UnrecoverableKeyException;
-import java.security.cert.Certificate;
-import java.security.cert.X509Certificate;
-
-import javax.net.ssl.KeyManager;
-import javax.net.ssl.KeyManagerFactory;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLEngine;
-import javax.net.ssl.SSLException;
-import javax.net.ssl.SSLSession;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.TrustManagerFactory;
-import javax.net.ssl.X509TrustManager;
-
-import org.apache.http.conn.ssl.BrowserCompatHostnameVerifier;
-import org.apache.http.conn.ssl.SSLContexts;
-import org.apache.http.conn.ssl.TrustStrategy;
-import org.apache.http.conn.ssl.X509HostnameVerifier;
-import org.apache.http.nio.conn.scheme.LayeringStrategy;
-import org.apache.http.nio.reactor.IOSession;
-import org.apache.http.nio.reactor.ssl.SSLIOSession;
-import org.apache.http.nio.reactor.ssl.SSLMode;
-import org.apache.http.nio.reactor.ssl.SSLSetupHandler;
-
-@Deprecated
-public class SSLLayeringStrategy implements LayeringStrategy {
-
-    public static final String TLS   = "TLS";
-    public static final String SSL   = "SSL";
-    public static final String SSLV2 = "SSLv2";
-
-    public static SSLLayeringStrategy getDefaultStrategy() {
-        return new SSLLayeringStrategy(SSLContexts.createDefault());
-    }
-
-    public static SSLLayeringStrategy getSystemDefaultStrategy() {
-        return new SSLLayeringStrategy(SSLContexts.createSystemDefault());
-    }
-
-    private final SSLContext sslContext;
-    private final X509HostnameVerifier hostnameVerifier;
-
-    private static SSLContext createSSLContext(
-            final String algorithm,
-            final KeyStore keystore,
-            final String keystorePassword,
-            final KeyStore truststore,
-            final SecureRandom random,
-            final TrustStrategy trustStrategy)
-                throws NoSuchAlgorithmException, KeyStoreException, UnrecoverableKeyException, KeyManagementException {
-        final String algo = algorithm != null ? algorithm : TLS;
-        final KeyManagerFactory kmfactory = KeyManagerFactory.getInstance(
-                KeyManagerFactory.getDefaultAlgorithm());
-        kmfactory.init(keystore, keystorePassword != null ? keystorePassword.toCharArray(): null);
-        final KeyManager[] keymanagers =  kmfactory.getKeyManagers();
-        final TrustManagerFactory tmfactory = TrustManagerFactory.getInstance(
-                TrustManagerFactory.getDefaultAlgorithm());
-        tmfactory.init(truststore);
-        final TrustManager[] trustmanagers = tmfactory.getTrustManagers();
-        if (trustmanagers != null && trustStrategy != null) {
-            for (int i = 0; i < trustmanagers.length; i++) {
-                final TrustManager tm = trustmanagers[i];
-                if (tm instanceof X509TrustManager) {
-                    trustmanagers[i] = new TrustManagerDecorator(
-                            (X509TrustManager) tm, trustStrategy);
-                }
-            }
-        }
-        final SSLContext sslcontext = SSLContext.getInstance(algo);
-        sslcontext.init(keymanagers, trustmanagers, random);
-        return sslcontext;
-    }
-
-    public SSLLayeringStrategy(
-            final String algorithm,
-            final KeyStore keystore,
-            final String keystorePassword,
-            final KeyStore truststore,
-            final SecureRandom random,
-            final X509HostnameVerifier hostnameVerifier)
-                throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
-        this(createSSLContext(
-                algorithm, keystore, keystorePassword, truststore, random, null),
-                hostnameVerifier);
-    }
-
-    public SSLLayeringStrategy(
-            final String algorithm,
-            final KeyStore keystore,
-            final String keystorePassword,
-            final KeyStore truststore,
-            final SecureRandom random,
-            final TrustStrategy trustStrategy,
-            final X509HostnameVerifier hostnameVerifier)
-                throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
-        this(createSSLContext(
-                algorithm, keystore, keystorePassword, truststore, random, trustStrategy),
-                hostnameVerifier);
-    }
-
-    public SSLLayeringStrategy(
-            final KeyStore keystore,
-            final String keystorePassword,
-            final KeyStore truststore)
-                throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
-        this(TLS, keystore, keystorePassword, truststore, null, null, new BrowserCompatHostnameVerifier());
-    }
-
-    public SSLLayeringStrategy(
-            final KeyStore keystore,
-            final String keystorePassword)
-                throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException{
-        this(TLS, keystore, keystorePassword, null, null, null, new BrowserCompatHostnameVerifier());
-    }
-
-    public SSLLayeringStrategy(
-            final KeyStore truststore)
-                throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
-        this(TLS, null, null, truststore, null, null, new BrowserCompatHostnameVerifier());
-    }
-
-    public SSLLayeringStrategy(
-            final TrustStrategy trustStrategy,
-            final X509HostnameVerifier hostnameVerifier)
-                throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
-        this(TLS, null, null, null, null, trustStrategy, hostnameVerifier);
-    }
-
-    public SSLLayeringStrategy(
-            final TrustStrategy trustStrategy)
-                throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
-        this(TLS, null, null, null, null, trustStrategy, new BrowserCompatHostnameVerifier());
-    }
-
-    public SSLLayeringStrategy(
-            final SSLContext sslContext, final X509HostnameVerifier hostnameVerifier) {
-        super();
-        this.sslContext = sslContext;
-        this.hostnameVerifier = hostnameVerifier;
-    }
-
-    public SSLLayeringStrategy(final SSLContext sslContext) {
-        this(sslContext, new BrowserCompatHostnameVerifier());
-    }
-
-    @Override
-    public boolean isSecure() {
-        return true;
-    }
-
-    @Override
-    public SSLIOSession layer(final IOSession iosession) {
-        final SSLIOSession ssliosession = new SSLIOSession(
-            iosession,
-            SSLMode.CLIENT,
-            this.sslContext,
-            new SSLSetupHandler() {
-
-                @Override
-                public void initalize(
-                        final SSLEngine sslengine) throws SSLException {
-                    initializeEngine(sslengine);
-                }
-
-                @Override
-                public void verify(
-                        final IOSession iosession,
-                        final SSLSession sslsession) throws SSLException {
-                    verifySession(iosession, sslsession);
-                }
-
-        });
-        iosession.setAttribute(SSLIOSession.SESSION_KEY, ssliosession);
-        return ssliosession;
-    }
-
-    protected void initializeEngine(final SSLEngine engine) {
-    }
-
-    protected void verifySession(
-            final IOSession iosession,
-            final SSLSession sslsession) throws SSLException {
-        final InetSocketAddress address = (InetSocketAddress) iosession.getRemoteAddress();
-
-        final Certificate[] certs = sslsession.getPeerCertificates();
-        final X509Certificate x509 = (X509Certificate) certs[0];
-        this.hostnameVerifier.verify(address.getHostName(), x509);
-    }
-
-}
diff --git a/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/ssl/TrustManagerDecorator.java b/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/ssl/TrustManagerDecorator.java
deleted file mode 100644
index af50d99..0000000
--- a/httpasyncclient/src/main/java-deprecated/org/apache/http/nio/conn/ssl/TrustManagerDecorator.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.conn.ssl;
-
-import java.security.cert.CertificateException;
-import java.security.cert.X509Certificate;
-
-import javax.net.ssl.X509TrustManager;
-
-import org.apache.http.conn.ssl.TrustStrategy;
-
-@Deprecated
-class TrustManagerDecorator implements X509TrustManager {
-
-    private final X509TrustManager trustManager;
-    private final TrustStrategy trustStrategy;
-
-    TrustManagerDecorator(final X509TrustManager trustManager, final TrustStrategy trustStrategy) {
-        super();
-        this.trustManager = trustManager;
-        this.trustStrategy = trustStrategy;
-    }
-
-    @Override
-    public void checkClientTrusted(
-            final X509Certificate[] chain, final String authType) throws CertificateException {
-        this.trustManager.checkClientTrusted(chain, authType);
-    }
-
-    @Override
-    public void checkServerTrusted(
-            final X509Certificate[] chain, final String authType) throws CertificateException {
-        if (!this.trustStrategy.isTrusted(chain, authType)) {
-            this.trustManager.checkServerTrusted(chain, authType);
-        }
-    }
-
-    @Override
-    public X509Certificate[] getAcceptedIssuers() {
-        return this.trustManager.getAcceptedIssuers();
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/AbstractClientExchangeHandler.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/AbstractClientExchangeHandler.java
deleted file mode 100644
index 8eaa3cc..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/AbstractClientExchangeHandler.java
+++ /dev/null
@@ -1,439 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.client;
-
-import java.io.IOException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicLong;
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.apache.commons.logging.Log;
-import org.apache.http.ConnectionClosedException;
-import org.apache.http.ConnectionReuseStrategy;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.methods.HttpRequestWrapper;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.concurrent.BasicFuture;
-import org.apache.http.concurrent.FutureCallback;
-import org.apache.http.conn.ConnectionKeepAliveStrategy;
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.conn.routing.RouteTracker;
-import org.apache.http.nio.NHttpClientConnection;
-import org.apache.http.nio.conn.NHttpClientConnectionManager;
-import org.apache.http.nio.protocol.HttpAsyncClientExchangeHandler;
-import org.apache.http.nio.protocol.HttpAsyncRequestExecutor;
-import org.apache.http.util.Asserts;
-
-/**
- * Abstract {@link org.apache.http.nio.protocol.HttpAsyncClientExchangeHandler} class
- * that implements connection management aspects shared by all HTTP exchange handlers.
- * <p>
- * Instances of this class are expected to be accessed by one thread at a time only.
- * The {@link #cancel()} method can be called concurrently by multiple threads.
- */
-abstract class AbstractClientExchangeHandler<T> implements HttpAsyncClientExchangeHandler {
-
-    private static final AtomicLong COUNTER = new AtomicLong(1);
-
-    protected final Log log;
-
-    private final long id;
-    private final HttpClientContext localContext;
-    private final BasicFuture<T> resultFuture;
-    private final NHttpClientConnectionManager connmgr;
-    private final ConnectionReuseStrategy connReuseStrategy;
-    private final ConnectionKeepAliveStrategy keepaliveStrategy;
-    private final AtomicReference<NHttpClientConnection> managedConnRef;
-    private final AtomicReference<HttpRoute> routeRef;
-    private final AtomicReference<RouteTracker> routeTrackerRef;
-    private final AtomicBoolean routeEstablished;
-    private final AtomicReference<Long> validDurationRef;
-    private final AtomicReference<HttpRequestWrapper> requestRef;
-    private final AtomicReference<HttpResponse> responseRef;
-    private final AtomicBoolean completed;
-    private final AtomicBoolean closed;
-
-    AbstractClientExchangeHandler(
-            final Log log,
-            final HttpClientContext localContext,
-            final BasicFuture<T> resultFuture,
-            final NHttpClientConnectionManager connmgr,
-            final ConnectionReuseStrategy connReuseStrategy,
-            final ConnectionKeepAliveStrategy keepaliveStrategy) {
-        super();
-        this.log = log;
-        this.id = COUNTER.getAndIncrement();
-        this.localContext = localContext;
-        this.resultFuture = resultFuture;
-        this.connmgr = connmgr;
-        this.connReuseStrategy = connReuseStrategy;
-        this.keepaliveStrategy = keepaliveStrategy;
-        this.managedConnRef = new AtomicReference<NHttpClientConnection>(null);
-        this.routeRef = new AtomicReference<HttpRoute>(null);
-        this.routeTrackerRef = new AtomicReference<RouteTracker>(null);
-        this.routeEstablished = new AtomicBoolean(false);
-        this.validDurationRef = new AtomicReference<Long>(null);
-        this.requestRef = new AtomicReference<HttpRequestWrapper>(null);
-        this.responseRef = new AtomicReference<HttpResponse>(null);
-        this.completed = new AtomicBoolean(false);
-        this.closed = new AtomicBoolean(false);
-    }
-
-    final long getId() {
-        return this.id;
-    }
-
-    final boolean isCompleted() {
-        return this.completed.get();
-    }
-
-    final void markCompleted() {
-        this.completed.set(true);
-    }
-
-    final void markConnectionNonReusable() {
-        this.validDurationRef.set(null);
-    }
-
-    final boolean isRouteEstablished() {
-        return this.routeEstablished.get();
-    }
-
-    final HttpRoute getRoute() {
-        return this.routeRef.get();
-    }
-
-    final void setRoute(final HttpRoute route) {
-        this.routeRef.set(route);
-    }
-
-    final HttpRequestWrapper getCurrentRequest() {
-        return this.requestRef.get();
-    }
-
-    final void setCurrentRequest(final HttpRequestWrapper request) {
-        this.requestRef.set(request);
-    }
-
-    final HttpResponse getCurrentResponse() {
-        return this.responseRef.get();
-    }
-
-    final void setCurrentResponse(final HttpResponse response) {
-        this.responseRef.set(response);
-    }
-
-    final HttpRoute getActualRoute() {
-        final RouteTracker routeTracker = this.routeTrackerRef.get();
-        return routeTracker != null ? routeTracker.toRoute() : null;
-    }
-
-    final void verifytRoute() {
-        if (!this.routeEstablished.get() && this.routeTrackerRef.get() == null) {
-            final NHttpClientConnection managedConn = this.managedConnRef.get();
-            Asserts.check(managedConn != null, "Inconsistent state: managed connection is null");
-            final boolean routeComplete = this.connmgr.isRouteComplete(managedConn);
-            this.routeEstablished.set(routeComplete);
-            if (!routeComplete) {
-                this.log.debug("Start connection routing");
-                final HttpRoute route = this.routeRef.get();
-                this.routeTrackerRef.set(new RouteTracker(route));
-            } else {
-                this.log.debug("Connection route already established");
-            }
-        }
-    }
-
-    final void onRouteToTarget() throws IOException {
-        final NHttpClientConnection managedConn = this.managedConnRef.get();
-        Asserts.check(managedConn != null, "Inconsistent state: managed connection is null");
-        final HttpRoute route = this.routeRef.get();
-        Asserts.check(route != null, "Inconsistent state: HTTP route is null");
-        final RouteTracker routeTracker = this.routeTrackerRef.get();
-        Asserts.check(routeTracker != null, "Inconsistent state: HTTP route tracker");
-        this.connmgr.startRoute(managedConn, route, this.localContext);
-        routeTracker.connectTarget(route.isSecure());
-    }
-
-    final void onRouteToProxy() throws IOException {
-        final NHttpClientConnection managedConn = this.managedConnRef.get();
-        Asserts.check(managedConn != null, "Inconsistent state: managed connection is null");
-        final HttpRoute route = this.routeRef.get();
-        Asserts.check(route != null, "Inconsistent state: HTTP route is null");
-        final RouteTracker routeTracker = this.routeTrackerRef.get();
-        Asserts.check(routeTracker != null, "Inconsistent state: HTTP route tracker");
-        this.connmgr.startRoute(managedConn, route, this.localContext);
-        final HttpHost proxy  = route.getProxyHost();
-        routeTracker.connectProxy(proxy, false);
-    }
-
-    final void onRouteUpgrade() throws IOException {
-        final NHttpClientConnection managedConn = this.managedConnRef.get();
-        Asserts.check(managedConn != null, "Inconsistent state: managed connection is null");
-        final HttpRoute route = this.routeRef.get();
-        Asserts.check(route != null, "Inconsistent state: HTTP route is null");
-        final RouteTracker routeTracker = this.routeTrackerRef.get();
-        Asserts.check(routeTracker != null, "Inconsistent state: HTTP route tracker");
-        this.connmgr.upgrade(managedConn, route, this.localContext);
-        routeTracker.layerProtocol(route.isSecure());
-    }
-
-    final void onRouteTunnelToTarget() {
-        final RouteTracker routeTracker = this.routeTrackerRef.get();
-        Asserts.check(routeTracker != null, "Inconsistent state: HTTP route tracker");
-        routeTracker.tunnelTarget(false);
-    }
-
-    final void onRouteComplete() {
-        final NHttpClientConnection managedConn = this.managedConnRef.get();
-        Asserts.check(managedConn != null, "Inconsistent state: managed connection is null");
-        final HttpRoute route = this.routeRef.get();
-        Asserts.check(route != null, "Inconsistent state: HTTP route is null");
-        this.connmgr.routeComplete(managedConn, route, this.localContext);
-        this.routeEstablished.set(true);
-        this.routeTrackerRef.set(null);
-    }
-
-    final NHttpClientConnection getConnection() {
-        return this.managedConnRef.get();
-    }
-
-    final void releaseConnection() {
-        final NHttpClientConnection localConn = this.managedConnRef.getAndSet(null);
-        if (localConn != null) {
-            if (this.log.isDebugEnabled()) {
-                this.log.debug("[exchange: " + this.id + "] releasing connection");
-            }
-            localConn.getContext().removeAttribute(HttpAsyncRequestExecutor.HTTP_HANDLER);
-            final Long validDuration = this.validDurationRef.get();
-            if (validDuration != null) {
-                final Object userToken = this.localContext.getUserToken();
-                this.connmgr.releaseConnection(localConn, userToken, validDuration, TimeUnit.MILLISECONDS);
-            } else {
-                try {
-                    localConn.close();
-                    if (this.log.isDebugEnabled()) {
-                        this.log.debug("[exchange: " + this.id + "] connection discarded");
-                    }
-                } catch (final IOException ex) {
-                    if (this.log.isDebugEnabled()) {
-                        this.log.debug(ex.getMessage(), ex);
-                    }
-                } finally {
-                    this.connmgr.releaseConnection(localConn, null, 0, TimeUnit.MILLISECONDS);
-                }
-            }
-        }
-    }
-
-    final void discardConnection() {
-        final NHttpClientConnection localConn = this.managedConnRef.getAndSet(null);
-        if (localConn != null) {
-            try {
-                localConn.shutdown();
-                if (this.log.isDebugEnabled()) {
-                    this.log.debug("[exchange: " + this.id + "] connection aborted");
-                }
-            } catch (final IOException ex) {
-                if (this.log.isDebugEnabled()) {
-                    this.log.debug(ex.getMessage(), ex);
-                }
-            } finally {
-                this.connmgr.releaseConnection(localConn, null, 0, TimeUnit.MILLISECONDS);
-            }
-        }
-    }
-
-    final boolean manageConnectionPersistence() {
-        final HttpResponse response = this.responseRef.get();
-        Asserts.check(response != null, "Inconsistent state: HTTP response");
-        final NHttpClientConnection managedConn = this.managedConnRef.get();
-        Asserts.check(managedConn != null, "Inconsistent state: managed connection is null");
-        final boolean keepAlive = managedConn.isOpen() &&
-                this.connReuseStrategy.keepAlive(response, this.localContext);
-        if (keepAlive) {
-            final long validDuration = this.keepaliveStrategy.getKeepAliveDuration(
-                    response, this.localContext);
-            if (this.log.isDebugEnabled()) {
-                final String s;
-                if (validDuration > 0) {
-                    s = "for " + validDuration + " " + TimeUnit.MILLISECONDS;
-                } else {
-                    s = "indefinitely";
-                }
-                this.log.debug("[exchange: " + this.id + "] Connection can be kept alive " + s);
-            }
-            this.validDurationRef.set(validDuration);
-        } else {
-            if (this.log.isDebugEnabled()) {
-                this.log.debug("[exchange: " + this.id + "] Connection cannot be kept alive");
-            }
-            this.validDurationRef.set(null);
-        }
-        return keepAlive;
-    }
-
-    private void connectionAllocated(final NHttpClientConnection managedConn) {
-        try {
-            if (this.log.isDebugEnabled()) {
-                this.log.debug("[exchange: " + this.id + "] Connection allocated: " + managedConn);
-            }
-            this.managedConnRef.set(managedConn);
-
-            if (this.closed.get()) {
-                discardConnection();
-                return;
-            }
-
-            managedConn.getContext().setAttribute(HttpAsyncRequestExecutor.HTTP_HANDLER, this);
-            managedConn.requestOutput();
-            if (managedConn.isStale()) {
-                failed(new ConnectionClosedException("Connection closed"));
-            }
-        } catch (final RuntimeException runex) {
-            failed(runex);
-            throw runex;
-        }
-    }
-
-    private void connectionRequestFailed(final Exception ex) {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + this.id + "] connection request failed");
-        }
-        failed(ex);
-    }
-
-    private void connectionRequestCancelled() {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + this.id + "] Connection request cancelled");
-        }
-        try {
-            this.resultFuture.cancel();
-        } finally {
-            close();
-        }
-    }
-
-    final void requestConnection() {
-        final HttpRoute route = this.routeRef.get();
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + this.id + "] Request connection for " + route);
-        }
-
-        discardConnection();
-
-        this.validDurationRef.set(null);
-        this.routeTrackerRef.set(null);
-        this.routeEstablished.set(false);
-
-        final Object userToken = this.localContext.getUserToken();
-        final RequestConfig config = this.localContext.getRequestConfig();
-        this.connmgr.requestConnection(
-                route,
-                userToken,
-                config.getConnectTimeout(),
-                config.getConnectionRequestTimeout(),
-                TimeUnit.MILLISECONDS,
-                new FutureCallback<NHttpClientConnection>() {
-
-                    @Override
-                    public void completed(final NHttpClientConnection managedConn) {
-                        connectionAllocated(managedConn);
-                    }
-
-                    @Override
-                    public void failed(final Exception ex) {
-                        connectionRequestFailed(ex);
-                    }
-
-                    @Override
-                    public void cancelled() {
-                        connectionRequestCancelled();
-                    }
-
-                });
-    }
-
-    abstract void releaseResources();
-
-    abstract void executionFailed(final Exception ex);
-
-    abstract boolean executionCancelled();
-
-    @Override
-    public final void close() {
-        if (this.closed.compareAndSet(false, true)) {
-            discardConnection();
-            releaseResources();
-        }
-    }
-
-    @Override
-    public final boolean isDone() {
-        return this.completed.get();
-    }
-
-    @Override
-    public final void failed(final Exception ex) {
-        if (this.closed.compareAndSet(false, true)) {
-            try {
-                try {
-                    executionFailed(ex);
-                } finally {
-                    discardConnection();
-                    releaseResources();
-                }
-            } finally {
-                this.resultFuture.failed(ex);
-            }
-        }
-    }
-
-    @Override
-    public final boolean cancel() {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + this.id + "] Cancelled");
-        }
-        if (this.closed.compareAndSet(false, true)) {
-            try {
-                try {
-                    return executionCancelled();
-                } finally {
-                    discardConnection();
-                    releaseResources();
-                }
-            } finally {
-                this.resultFuture.cancel();
-            }
-        }
-        return false;
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/CloseableHttpAsyncClient.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/CloseableHttpAsyncClient.java
deleted file mode 100644
index 33f7f5a..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/CloseableHttpAsyncClient.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.client;
-
-import java.io.Closeable;
-import java.net.URI;
-import java.util.concurrent.Future;
-
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.annotation.ThreadSafe;
-import org.apache.http.client.ClientProtocolException;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.client.utils.URIUtils;
-import org.apache.http.concurrent.BasicFuture;
-import org.apache.http.concurrent.FutureCallback;
-import org.apache.http.nio.client.HttpAsyncClient;
-import org.apache.http.nio.client.methods.HttpAsyncMethods;
-import org.apache.http.nio.protocol.HttpAsyncRequestProducer;
-import org.apache.http.nio.protocol.HttpAsyncResponseConsumer;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.util.Args;
-
-/**
- * Base implementation of {@link HttpAsyncClient} that also implements {@link Closeable}.
- *
- * @since 4.0
- */
-@ThreadSafe
-public abstract class CloseableHttpAsyncClient implements HttpAsyncClient, Closeable {
-
-    public abstract boolean isRunning();
-
-    public abstract void start();
-
-    @Override
-    public <T> Future<T> execute(
-            final HttpAsyncRequestProducer requestProducer,
-            final HttpAsyncResponseConsumer<T> responseConsumer,
-            final FutureCallback<T> callback) {
-        return execute(requestProducer, responseConsumer, HttpClientContext.create(), callback);
-    }
-
-    @Override
-    public Future<HttpResponse> execute(
-            final HttpHost target, final HttpRequest request, final HttpContext context,
-            final FutureCallback<HttpResponse> callback) {
-        return execute(
-                HttpAsyncMethods.create(target, request),
-                HttpAsyncMethods.createConsumer(),
-                context, callback);
-    }
-
-    @Override
-    public Future<HttpResponse> execute(
-            final HttpHost target, final HttpRequest request,
-            final FutureCallback<HttpResponse> callback) {
-        return execute(target, request, HttpClientContext.create(), callback);
-    }
-
-    @Override
-    public Future<HttpResponse> execute(
-            final HttpUriRequest request,
-            final FutureCallback<HttpResponse> callback) {
-        return execute(request, HttpClientContext.create(), callback);
-    }
-
-    @Override
-    public Future<HttpResponse> execute(
-            final HttpUriRequest request,
-            final HttpContext context,
-            final FutureCallback<HttpResponse> callback) {
-        final HttpHost target;
-        try {
-            target = determineTarget(request);
-        } catch (final ClientProtocolException ex) {
-            final BasicFuture<HttpResponse> future = new BasicFuture<HttpResponse>(callback);
-            future.failed(ex);
-            return future;
-        }
-        return execute(target, request, context, callback);
-    }
-
-    private HttpHost determineTarget(final HttpUriRequest request) throws ClientProtocolException {
-        Args.notNull(request, "HTTP request");
-        // A null target may be acceptable if there is a default target.
-        // Otherwise, the null target is detected in the director.
-        HttpHost target = null;
-
-        final URI requestURI = request.getURI();
-        if (requestURI.isAbsolute()) {
-            target = URIUtils.extractHost(requestURI);
-            if (target == null) {
-                throw new ClientProtocolException(
-                        "URI does not specify a valid host name: " + requestURI);
-            }
-        }
-        return target;
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/CloseableHttpAsyncClientBase.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/CloseableHttpAsyncClientBase.java
deleted file mode 100644
index 5c12ce3..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/CloseableHttpAsyncClientBase.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.client;
-
-import java.io.IOException;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.http.nio.NHttpClientEventHandler;
-import org.apache.http.nio.conn.NHttpClientConnectionManager;
-import org.apache.http.nio.reactor.IOEventDispatch;
-import org.apache.http.util.Asserts;
-
-abstract class CloseableHttpAsyncClientBase extends CloseableHttpPipeliningClient {
-
-    private final Log log = LogFactory.getLog(getClass());
-
-    static enum Status {INACTIVE, ACTIVE, STOPPED}
-
-    private final NHttpClientConnectionManager connmgr;
-    private final Thread reactorThread;
-
-    private final AtomicReference<Status> status;
-
-    public CloseableHttpAsyncClientBase(
-            final NHttpClientConnectionManager connmgr,
-            final ThreadFactory threadFactory,
-            final NHttpClientEventHandler handler) {
-        super();
-        this.connmgr = connmgr;
-        if (threadFactory != null && handler != null) {
-            this.reactorThread = threadFactory.newThread(new Runnable() {
-
-                @Override
-                public void run() {
-                    try {
-                        final IOEventDispatch ioEventDispatch = new InternalIODispatch(handler);
-                        connmgr.execute(ioEventDispatch);
-                    } catch (final Exception ex) {
-                        log.error("I/O reactor terminated abnormally", ex);
-                    } finally {
-                        status.set(Status.STOPPED);
-                    }
-                }
-
-            });
-        } else {
-            this.reactorThread = null;
-        }
-        this.status = new AtomicReference<Status>(Status.INACTIVE);
-    }
-
-    @Override
-    public void start() {
-        if (this.status.compareAndSet(Status.INACTIVE, Status.ACTIVE)) {
-            if (this.reactorThread != null) {
-                this.reactorThread.start();
-            }
-        }
-    }
-
-    protected void ensureRunning() {
-        final Status currentStatus = this.status.get();
-        Asserts.check(currentStatus == Status.ACTIVE, "Request cannot be executed; " +
-                "I/O reactor status: %s", currentStatus);
-    }
-
-    @Override
-    public void close() {
-        if (this.status.compareAndSet(Status.ACTIVE, Status.STOPPED)) {
-            if (this.reactorThread != null) {
-                try {
-                    this.connmgr.shutdown();
-                } catch (final IOException ex) {
-                    this.log.error("I/O error shutting down connection manager", ex);
-                }
-                try {
-                    this.reactorThread.join();
-                } catch (final InterruptedException ex) {
-                    Thread.currentThread().interrupt();
-                }
-            }
-        }
-    }
-
-    @Override
-    public boolean isRunning() {
-        return this.status.get() == Status.ACTIVE;
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/CloseableHttpPipeliningClient.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/CloseableHttpPipeliningClient.java
deleted file mode 100644
index 71890de..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/CloseableHttpPipeliningClient.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.client;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.Future;
-
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.annotation.ThreadSafe;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.concurrent.FutureCallback;
-import org.apache.http.nio.client.HttpPipeliningClient;
-import org.apache.http.nio.client.methods.HttpAsyncMethods;
-import org.apache.http.nio.protocol.HttpAsyncRequestProducer;
-import org.apache.http.nio.protocol.HttpAsyncResponseConsumer;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.util.Args;
-
-/**
- * Base implementation of {@link org.apache.http.nio.client.HttpPipeliningClient} that also
- * implements {@link java.io.Closeable}.
- *
- * @since 4.1
- */
-@ThreadSafe
-public abstract class CloseableHttpPipeliningClient
-        extends CloseableHttpAsyncClient implements HttpPipeliningClient {
-
-    @Override
-    public <T> Future<List<T>> execute(
-            final HttpHost target,
-            final List<? extends HttpAsyncRequestProducer> requestProducers,
-            final List<? extends HttpAsyncResponseConsumer<T>> responseConsumers,
-            final FutureCallback<List<T>> callback) {
-        return execute(target, requestProducers, responseConsumers, HttpClientContext.create(), callback);
-    }
-
-    @Override
-    public Future<List<HttpResponse>> execute(
-            final HttpHost target,
-            final List<HttpRequest> requests,
-            final FutureCallback<List<HttpResponse>> callback) {
-        return execute(target, requests, HttpClientContext.create(), callback);
-    }
-
-    @Override
-    public Future<List<HttpResponse>> execute(
-            final HttpHost target,
-            final List<HttpRequest> requests,
-            final HttpContext context,
-            final FutureCallback<List<HttpResponse>> callback) {
-        Args.notEmpty(requests, "HTTP request list");
-        final List<HttpAsyncRequestProducer> requestProducers = new ArrayList<HttpAsyncRequestProducer>(
-                requests.size());
-        final List<HttpAsyncResponseConsumer<HttpResponse>> responseConsumers = new ArrayList<HttpAsyncResponseConsumer<HttpResponse>>(
-                requests.size());
-        for (int i = 0; i < requests.size(); i++) {
-            final HttpRequest request = requests.get(i);
-            requestProducers.add(HttpAsyncMethods.create(target, request));
-            responseConsumers.add(HttpAsyncMethods.createConsumer());
-        }
-        return execute(target, requestProducers, responseConsumers, context, callback);
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/DefaultAsyncUserTokenHandler.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/DefaultAsyncUserTokenHandler.java
deleted file mode 100644
index f599fdd..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/DefaultAsyncUserTokenHandler.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.client;
-
-import org.apache.http.HttpConnection;
-import org.apache.http.annotation.Immutable;
-import org.apache.http.auth.AuthScheme;
-import org.apache.http.auth.AuthState;
-import org.apache.http.auth.Credentials;
-import org.apache.http.client.UserTokenHandler;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.nio.conn.ManagedNHttpClientConnection;
-import org.apache.http.protocol.HttpContext;
-
-import javax.net.ssl.SSLSession;
-import java.security.Principal;
-
-/**
- * Default implementation of {@link org.apache.http.client.UserTokenHandler}
- * for asynchrounous HTTP client communication. This class will use
- * an instance of {@link java.security.Principal} as a state object for
- * non-blocking HTTP connections, if it can be obtained from the given
- * execution context. This helps ensure persistent connections created with
- * a particular user identity within a particular security context can be
- * reused by the same user only.
- * <p>
- * This implementation will use the user principle of connection based
- * authentication schemes such as NTLM or that of the SSL session with
- * the client authentication turned on. If both are unavailable,
- * {@code null} token will be returned.
- *
- * @since 4.0
- */
-@Immutable
-public class DefaultAsyncUserTokenHandler implements UserTokenHandler {
-
-    public static final DefaultAsyncUserTokenHandler INSTANCE = new DefaultAsyncUserTokenHandler();
-
-    @Override
-    public Object getUserToken(final HttpContext context) {
-
-        final HttpClientContext clientContext = HttpClientContext.adapt(context);
-
-        Principal userPrincipal = null;
-
-        final AuthState targetAuthState = clientContext.getTargetAuthState();
-        if (targetAuthState != null) {
-            userPrincipal = getAuthPrincipal(targetAuthState);
-            if (userPrincipal == null) {
-                final AuthState proxyAuthState = clientContext.getProxyAuthState();
-                userPrincipal = getAuthPrincipal(proxyAuthState);
-            }
-        }
-
-        if (userPrincipal == null) {
-            final HttpConnection conn = clientContext.getConnection();
-            if (conn.isOpen() && conn instanceof ManagedNHttpClientConnection) {
-                final SSLSession sslsession = ((ManagedNHttpClientConnection) conn).getSSLSession();
-                if (sslsession != null) {
-                    userPrincipal = sslsession.getLocalPrincipal();
-                }
-            }
-        }
-
-        return userPrincipal;
-    }
-
-    private static Principal getAuthPrincipal(final AuthState authState) {
-        final AuthScheme scheme = authState.getAuthScheme();
-        if (scheme != null && scheme.isComplete() && scheme.isConnectionBased()) {
-            final Credentials creds = authState.getCredentials();
-            if (creds != null) {
-                return creds.getUserPrincipal();
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl.java
deleted file mode 100644
index 07aff6d..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.client;
-
-import java.io.IOException;
-
-import org.apache.commons.logging.Log;
-import org.apache.http.ConnectionReuseStrategy;
-import org.apache.http.HttpException;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.HttpExecutionAware;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.concurrent.BasicFuture;
-import org.apache.http.conn.ConnectionKeepAliveStrategy;
-import org.apache.http.nio.ContentDecoder;
-import org.apache.http.nio.ContentEncoder;
-import org.apache.http.nio.IOControl;
-import org.apache.http.nio.NHttpClientConnection;
-import org.apache.http.nio.conn.NHttpClientConnectionManager;
-import org.apache.http.nio.protocol.HttpAsyncRequestProducer;
-import org.apache.http.nio.protocol.HttpAsyncResponseConsumer;
-
-/**
- * Default implementation of {@link org.apache.http.nio.protocol.HttpAsyncClientExchangeHandler}.
- * <p>
- * Instances of this class are expected to be accessed by one thread at a time only.
- * The {@link #cancel()} method can be called concurrently by multiple threads.
- */
-class DefaultClientExchangeHandlerImpl<T> extends AbstractClientExchangeHandler {
-
-    private final HttpAsyncRequestProducer requestProducer;
-    private final HttpAsyncResponseConsumer<T> responseConsumer;
-    private final BasicFuture<T> resultFuture;
-    private final InternalClientExec exec;
-    private final InternalState state;
-
-    public DefaultClientExchangeHandlerImpl(
-            final Log log,
-            final HttpAsyncRequestProducer requestProducer,
-            final HttpAsyncResponseConsumer<T> responseConsumer,
-            final HttpClientContext localContext,
-            final BasicFuture<T> resultFuture,
-            final NHttpClientConnectionManager connmgr,
-            final ConnectionReuseStrategy connReuseStrategy,
-            final ConnectionKeepAliveStrategy keepaliveStrategy,
-            final InternalClientExec exec) {
-        super(log, localContext, resultFuture, connmgr, connReuseStrategy, keepaliveStrategy);
-        this.requestProducer = requestProducer;
-        this.responseConsumer = responseConsumer;
-        this.resultFuture = resultFuture;
-        this.exec = exec;
-        this.state = new InternalState(getId(), requestProducer, responseConsumer, localContext);
-    }
-
-    @Override
-    void releaseResources() {
-        try {
-            this.requestProducer.close();
-        } catch (final IOException ex) {
-            this.log.debug("I/O error closing request producer", ex);
-        }
-        try {
-            this.responseConsumer.close();
-        } catch (final IOException ex) {
-            this.log.debug("I/O error closing response consumer", ex);
-        }
-    }
-
-    @Override
-    void executionFailed(final Exception ex) {
-        this.requestProducer.failed(ex);
-        this.responseConsumer.failed(ex);
-    }
-
-    @Override
-    boolean executionCancelled() {
-        final boolean cancelled = this.responseConsumer.cancel();
-
-        final T result = this.responseConsumer.getResult();
-        final Exception ex = this.responseConsumer.getException();
-        if (ex != null) {
-            this.resultFuture.failed(ex);
-        } else if (result != null) {
-            this.resultFuture.completed(result);
-        } else {
-            this.resultFuture.cancel();
-        }
-        return cancelled;
-    }
-
-    public void start() throws HttpException, IOException {
-        final HttpHost target = this.requestProducer.getTarget();
-        final HttpRequest original = this.requestProducer.generateRequest();
-
-        if (original instanceof HttpExecutionAware) {
-            ((HttpExecutionAware) original).setCancellable(this);
-        }
-        this.exec.prepare(target, original, this.state, this);
-        requestConnection();
-    }
-
-    @Override
-    public HttpRequest generateRequest() throws IOException, HttpException {
-        return this.exec.generateRequest(this.state, this);
-    }
-
-    @Override
-    public void produceContent(
-            final ContentEncoder encoder, final IOControl ioctrl) throws IOException {
-        this.exec.produceContent(this.state, encoder, ioctrl);
-    }
-
-    @Override
-    public void requestCompleted() {
-        this.exec.requestCompleted(this.state, this);
-    }
-
-    @Override
-    public void responseReceived(
-            final HttpResponse response) throws IOException, HttpException {
-        this.exec.responseReceived(response, this.state, this);
-    }
-
-    @Override
-    public void consumeContent(
-            final ContentDecoder decoder, final IOControl ioctrl) throws IOException {
-        this.exec.consumeContent(this.state, decoder, ioctrl);
-        if (!decoder.isCompleted() && this.responseConsumer.isDone()) {
-            markConnectionNonReusable();
-            try {
-                markCompleted();
-                releaseConnection();
-                this.resultFuture.cancel();
-            } finally {
-                close();
-            }
-        }
-    }
-
-    @Override
-    public void responseCompleted() throws IOException, HttpException {
-        this.exec.responseCompleted(this.state, this);
-
-        if (this.state.getFinalResponse() != null || this.resultFuture.isDone()) {
-            try {
-                markCompleted();
-                releaseConnection();
-                final T result = this.responseConsumer.getResult();
-                final Exception ex = this.responseConsumer.getException();
-                if (ex == null) {
-                    this.resultFuture.completed(result);
-                } else {
-                    this.resultFuture.failed(ex);
-                }
-            } finally {
-                close();
-            }
-        } else {
-            NHttpClientConnection localConn = getConnection();
-            if (localConn != null && !localConn.isOpen()) {
-                releaseConnection();
-                localConn = null;
-            }
-            if (localConn != null) {
-                localConn.requestOutput();
-            } else {
-                requestConnection();
-            }
-        }
-    }
-
-    @Override
-    public void inputTerminated() {
-        if (!isCompleted()) {
-            requestConnection();
-        } else {
-            close();
-        }
-    }
-
-    public void abortConnection() {
-        discardConnection();
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/HttpAsyncClientBuilder.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/HttpAsyncClientBuilder.java
deleted file mode 100644
index c6980a4..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/HttpAsyncClientBuilder.java
+++ /dev/null
@@ -1,898 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.http.impl.nio.client;
-
-import java.net.ProxySelector;
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ThreadFactory;
-
-import javax.net.ssl.HostnameVerifier;
-import javax.net.ssl.SSLContext;
-
-import org.apache.http.ConnectionReuseStrategy;
-import org.apache.http.Header;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequestInterceptor;
-import org.apache.http.HttpResponseInterceptor;
-import org.apache.http.annotation.NotThreadSafe;
-import org.apache.http.auth.AuthSchemeProvider;
-import org.apache.http.client.AuthenticationStrategy;
-import org.apache.http.client.CookieStore;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.client.RedirectStrategy;
-import org.apache.http.client.UserTokenHandler;
-import org.apache.http.client.config.AuthSchemes;
-import org.apache.http.client.config.CookieSpecs;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.protocol.RequestAddCookies;
-import org.apache.http.client.protocol.RequestAuthCache;
-import org.apache.http.client.protocol.RequestClientConnControl;
-import org.apache.http.client.protocol.RequestDefaultHeaders;
-import org.apache.http.client.protocol.RequestExpectContinue;
-import org.apache.http.client.protocol.ResponseProcessCookies;
-import org.apache.http.config.ConnectionConfig;
-import org.apache.http.config.Lookup;
-import org.apache.http.config.RegistryBuilder;
-import org.apache.http.conn.ConnectionKeepAliveStrategy;
-import org.apache.http.conn.DnsResolver;
-import org.apache.http.conn.SchemePortResolver;
-import org.apache.http.conn.routing.HttpRoutePlanner;
-import org.apache.http.conn.ssl.DefaultHostnameVerifier;
-import org.apache.http.conn.ssl.X509HostnameVerifier;
-import org.apache.http.conn.util.PublicSuffixMatcher;
-import org.apache.http.conn.util.PublicSuffixMatcherLoader;
-import org.apache.http.cookie.CookieSpecProvider;
-import org.apache.http.impl.DefaultConnectionReuseStrategy;
-import org.apache.http.impl.NoConnectionReuseStrategy;
-import org.apache.http.impl.auth.BasicSchemeFactory;
-import org.apache.http.impl.auth.DigestSchemeFactory;
-import org.apache.http.impl.auth.KerberosSchemeFactory;
-import org.apache.http.impl.auth.NTLMSchemeFactory;
-import org.apache.http.impl.auth.SPNegoSchemeFactory;
-import org.apache.http.impl.client.BasicCookieStore;
-import org.apache.http.impl.client.BasicCredentialsProvider;
-import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy;
-import org.apache.http.impl.client.DefaultRedirectStrategy;
-import org.apache.http.impl.client.NoopUserTokenHandler;
-import org.apache.http.impl.client.ProxyAuthenticationStrategy;
-import org.apache.http.impl.client.TargetAuthenticationStrategy;
-import org.apache.http.impl.conn.DefaultProxyRoutePlanner;
-import org.apache.http.impl.conn.DefaultRoutePlanner;
-import org.apache.http.impl.conn.DefaultSchemePortResolver;
-import org.apache.http.impl.conn.SystemDefaultRoutePlanner;
-import org.apache.http.impl.cookie.DefaultCookieSpecProvider;
-import org.apache.http.impl.cookie.IgnoreSpecProvider;
-import org.apache.http.impl.cookie.NetscapeDraftSpecProvider;
-import org.apache.http.impl.cookie.RFC6265CookieSpecProvider;
-import org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager;
-import org.apache.http.impl.nio.reactor.IOReactorConfig;
-import org.apache.http.nio.NHttpClientEventHandler;
-import org.apache.http.nio.conn.NHttpClientConnectionManager;
-import org.apache.http.nio.conn.NoopIOSessionStrategy;
-import org.apache.http.nio.conn.SchemeIOSessionStrategy;
-import org.apache.http.nio.conn.ssl.SSLIOSessionStrategy;
-import org.apache.http.nio.protocol.HttpAsyncRequestExecutor;
-import org.apache.http.nio.reactor.ConnectingIOReactor;
-import org.apache.http.protocol.HttpProcessor;
-import org.apache.http.protocol.HttpProcessorBuilder;
-import org.apache.http.protocol.RequestContent;
-import org.apache.http.protocol.RequestTargetHost;
-import org.apache.http.protocol.RequestUserAgent;
-import org.apache.http.ssl.SSLContexts;
-import org.apache.http.util.TextUtils;
-import org.apache.http.util.VersionInfo;
-
-/**
- * Builder for {@link CloseableHttpAsyncClient} instances.
- * <p>
- * When a particular component is not explicitly this class will
- * use its default implementation. System properties will be taken
- * into account when configuring the default implementations when
- * {@link #useSystemProperties()} method is called prior to calling
- * {@link #build()}.
- * <ul>
- *  <li>ssl.TrustManagerFactory.algorithm</li>
- *  <li>javax.net.ssl.trustStoreType</li>
- *  <li>javax.net.ssl.trustStore</li>
- *  <li>javax.net.ssl.trustStoreProvider</li>
- *  <li>javax.net.ssl.trustStorePassword</li>
- *  <li>ssl.KeyManagerFactory.algorithm</li>
- *  <li>javax.net.ssl.keyStoreType</li>
- *  <li>javax.net.ssl.keyStore</li>
- *  <li>javax.net.ssl.keyStoreProvider</li>
- *  <li>javax.net.ssl.keyStorePassword</li>
- *  <li>https.protocols</li>
- *  <li>https.cipherSuites</li>
- *  <li>http.proxyHost</li>
- *  <li>http.proxyPort</li>
- *  <li>http.keepAlive</li>
- *  <li>http.maxConnections</li>
- *  <li>http.agent</li>
- * </ul>
- * <p>
- * Please note that some settings used by this class can be mutually
- * exclusive and may not apply when building {@link CloseableHttpAsyncClient}
- * instances.
- *
- * @since 4.0
- */
-@NotThreadSafe
-public class HttpAsyncClientBuilder {
-
-    private NHttpClientConnectionManager connManager;
-    private boolean connManagerShared;
-    private SchemePortResolver schemePortResolver;
-    private SchemeIOSessionStrategy sslStrategy;
-    private HostnameVerifier hostnameVerifier;
-    private SSLContext sslcontext;
-    private ConnectionReuseStrategy reuseStrategy;
-    private ConnectionKeepAliveStrategy keepAliveStrategy;
-    private AuthenticationStrategy targetAuthStrategy;
-    private AuthenticationStrategy proxyAuthStrategy;
-    private UserTokenHandler userTokenHandler;
-    private HttpProcessor httpprocessor;
-    private DnsResolver dnsResolver;
-
-    private LinkedList<HttpRequestInterceptor> requestFirst;
-    private LinkedList<HttpRequestInterceptor> requestLast;
-    private LinkedList<HttpResponseInterceptor> responseFirst;
-    private LinkedList<HttpResponseInterceptor> responseLast;
-
-    private HttpRoutePlanner routePlanner;
-    private RedirectStrategy redirectStrategy;
-    private Lookup<AuthSchemeProvider> authSchemeRegistry;
-    private Lookup<CookieSpecProvider> cookieSpecRegistry;
-    private CookieStore cookieStore;
-    private CredentialsProvider credentialsProvider;
-    private String userAgent;
-    private HttpHost proxy;
-    private Collection<? extends Header> defaultHeaders;
-    private IOReactorConfig defaultIOReactorConfig;
-    private ConnectionConfig defaultConnectionConfig;
-    private RequestConfig defaultRequestConfig;
-
-    private ThreadFactory threadFactory;
-    private NHttpClientEventHandler eventHandler;
-
-    private PublicSuffixMatcher publicSuffixMatcher;
-
-    private boolean systemProperties;
-    private boolean cookieManagementDisabled;
-    private boolean authCachingDisabled;
-    private boolean connectionStateDisabled;
-
-    private int maxConnTotal = 0;
-    private int maxConnPerRoute = 0;
-
-    public static HttpAsyncClientBuilder create() {
-        return new HttpAsyncClientBuilder();
-    }
-
-    protected HttpAsyncClientBuilder() {
-        super();
-    }
-
-    /**
-     * Assigns file containing public suffix matcher. Instances of this class can be created
-     * with {@link org.apache.http.conn.util.PublicSuffixMatcherLoader}.
-     *
-     * @see org.apache.http.conn.util.PublicSuffixMatcher
-     * @see org.apache.http.conn.util.PublicSuffixMatcherLoader
-     *
-     *   @since 4.1
-     */
-    public final HttpAsyncClientBuilder setPublicSuffixMatcher(final PublicSuffixMatcher publicSuffixMatcher) {
-        this.publicSuffixMatcher = publicSuffixMatcher;
-        return this;
-    }
-
-    /**
-     * Assigns {@link NHttpClientConnectionManager} instance.
-     */
-    public final HttpAsyncClientBuilder setConnectionManager(
-            final NHttpClientConnectionManager connManager) {
-        this.connManager = connManager;
-        return this;
-    }
-
-    /**
-     * Defines the connection manager is to be shared by multiple
-     * client instances.
-     * <p>
-     * If the connection manager is shared its life-cycle is expected
-     * to be managed by the caller and it will not be shut down
-     * if the client is closed.
-     *
-     * @param shared defines whether or not the connection manager can be shared
-     *  by multiple clients.
-     *
-     * @since 4.1
-     */
-    public final HttpAsyncClientBuilder setConnectionManagerShared(
-            final boolean shared) {
-        this.connManagerShared = shared;
-        return this;
-    }
-
-    /**
-     * Assigns {@link SchemePortResolver} instance.
-     */
-    public final HttpAsyncClientBuilder setSchemePortResolver(
-            final SchemePortResolver schemePortResolver) {
-        this.schemePortResolver = schemePortResolver;
-        return this;
-    }
-
-    /**
-     * Assigns maximum total connection value.
-     * <p>
-     * Please note this value can be overridden by the {@link #setConnectionManager(
-     *   org.apache.http.nio.conn.NHttpClientConnectionManager)} method.
-     */
-    public final HttpAsyncClientBuilder setMaxConnTotal(final int maxConnTotal) {
-        this.maxConnTotal = maxConnTotal;
-        return this;
-    }
-
-    /**
-     * Assigns maximum connection per route value.
-     * <p>
-     * Please note this value can be overridden by the {@link #setConnectionManager(
-     *   org.apache.http.nio.conn.NHttpClientConnectionManager)} method.
-     */
-    public final HttpAsyncClientBuilder setMaxConnPerRoute(final int maxConnPerRoute) {
-        this.maxConnPerRoute = maxConnPerRoute;
-        return this;
-    }
-
-    /**
-     * Assigns {@link ConnectionReuseStrategy} instance.
-     */
-    public final HttpAsyncClientBuilder setConnectionReuseStrategy(
-            final ConnectionReuseStrategy reuseStrategy) {
-        this.reuseStrategy = reuseStrategy;
-        return this;
-    }
-
-    /**
-     * Assigns {@link ConnectionKeepAliveStrategy} instance.
-     */
-    public final HttpAsyncClientBuilder setKeepAliveStrategy(
-            final ConnectionKeepAliveStrategy keepAliveStrategy) {
-        this.keepAliveStrategy = keepAliveStrategy;
-        return this;
-    }
-
-    /**
-     * Assigns {@link UserTokenHandler} instance.
-     * <p>
-     * Please note this value can be overridden by the {@link #disableConnectionState()}
-     * method.
-     */
-    public final HttpAsyncClientBuilder setUserTokenHandler(final UserTokenHandler userTokenHandler) {
-        this.userTokenHandler = userTokenHandler;
-        return this;
-    }
-
-    /**
-     * Assigns {@link AuthenticationStrategy} instance for proxy
-     * authentication.
-     */
-    public final HttpAsyncClientBuilder setTargetAuthenticationStrategy(
-            final AuthenticationStrategy targetAuthStrategy) {
-        this.targetAuthStrategy = targetAuthStrategy;
-        return this;
-    }
-
-    /**
-     * Assigns {@link AuthenticationStrategy} instance for target
-     * host authentication.
-     */
-    public final HttpAsyncClientBuilder setProxyAuthenticationStrategy(
-            final AuthenticationStrategy proxyAuthStrategy) {
-        this.proxyAuthStrategy = proxyAuthStrategy;
-        return this;
-    }
-
-    /**
-     * Assigns {@link HttpProcessor} instance.
-     */
-    public final HttpAsyncClientBuilder setHttpProcessor(final HttpProcessor httpprocessor) {
-        this.httpprocessor = httpprocessor;
-        return this;
-    }
-
-    /**
-     * Assigns {@link DnsResolver} instance.
-     * <p>
-     * Please note this value can be overridden by the {@link #setConnectionManager(
-     *   org.apache.http.nio.conn.NHttpClientConnectionManager)} method.
-     */
-    public final HttpAsyncClientBuilder setDnsResolver(final DnsResolver dnsResolver){
-        this.dnsResolver = dnsResolver;
-        return this;
-    }
-
-    /**
-     * Adds this protocol interceptor to the head of the protocol processing list.
-     * <p>
-     * Please note this value can be overridden by the {@link #setHttpProcessor(
-     * org.apache.http.protocol.HttpProcessor)} method.
-     */
-    public final HttpAsyncClientBuilder addInterceptorFirst(final HttpResponseInterceptor itcp) {
-        if (itcp == null) {
-            return this;
-        }
-        if (responseFirst == null) {
-            responseFirst = new LinkedList<HttpResponseInterceptor>();
-        }
-        responseFirst.addFirst(itcp);
-        return this;
-    }
-
-    /**
-     * Adds this protocol interceptor to the tail of the protocol processing list.
-     * <p>
-     * Please note this value can be overridden by the {@link #setHttpProcessor(
-     * org.apache.http.protocol.HttpProcessor)} method.
-     */
-    public final HttpAsyncClientBuilder addInterceptorLast(final HttpResponseInterceptor itcp) {
-        if (itcp == null) {
-            return this;
-        }
-        if (responseLast == null) {
-            responseLast = new LinkedList<HttpResponseInterceptor>();
-        }
-        responseLast.addLast(itcp);
-        return this;
-    }
-
-    /**
-     * Adds this protocol interceptor to the head of the protocol processing list.
-     * <p>
-     * Please note this value can be overridden by the {@link #setHttpProcessor(
-     * org.apache.http.protocol.HttpProcessor)} method.
-     */
-    public final HttpAsyncClientBuilder addInterceptorFirst(final HttpRequestInterceptor itcp) {
-        if (itcp == null) {
-            return this;
-        }
-        if (requestFirst == null) {
-            requestFirst = new LinkedList<HttpRequestInterceptor>();
-        }
-        requestFirst.addFirst(itcp);
-        return this;
-    }
-
-    /**
-     * Adds this protocol interceptor to the tail of the protocol processing list.
-     * <p>
-     * Please note this value can be overridden by the {@link #setHttpProcessor(
-     * org.apache.http.protocol.HttpProcessor)} method.
-     */
-    public final HttpAsyncClientBuilder addInterceptorLast(final HttpRequestInterceptor itcp) {
-        if (itcp == null) {
-            return this;
-        }
-        if (requestLast == null) {
-            requestLast = new LinkedList<HttpRequestInterceptor>();
-        }
-        requestLast.addLast(itcp);
-        return this;
-    }
-
-    /**
-     * Assigns {@link HttpRoutePlanner} instance.
-     */
-    public final HttpAsyncClientBuilder setRoutePlanner(final HttpRoutePlanner routePlanner) {
-        this.routePlanner = routePlanner;
-        return this;
-    }
-
-    /**
-     * Assigns {@link RedirectStrategy} instance.
-     */
-    public final HttpAsyncClientBuilder setRedirectStrategy(final RedirectStrategy redirectStrategy) {
-        this.redirectStrategy = redirectStrategy;
-        return this;
-    }
-
-    /**
-     * Assigns default {@link CookieStore} instance which will be used for
-     * request execution if not explicitly set in the client execution context.
-     */
-    public final HttpAsyncClientBuilder setDefaultCookieStore(final CookieStore cookieStore) {
-        this.cookieStore = cookieStore;
-        return this;
-    }
-
-    /**
-     * Assigns default {@link CredentialsProvider} instance which will be used
-     * for request execution if not explicitly set in the client execution
-     * context.
-     */
-    public final HttpAsyncClientBuilder setDefaultCredentialsProvider(
-            final CredentialsProvider credentialsProvider) {
-        this.credentialsProvider = credentialsProvider;
-        return this;
-    }
-
-
-    /**
-     * Assigns default {@link org.apache.http.auth.AuthScheme} registry which will
-     * be used for request execution if not explicitly set in the client execution
-     * context.
-     */
-    public final HttpAsyncClientBuilder setDefaultAuthSchemeRegistry(
-            final Lookup<AuthSchemeProvider> authSchemeRegistry) {
-        this.authSchemeRegistry = authSchemeRegistry;
-        return this;
-    }
-
-    /**
-     * Assigns default {@link org.apache.http.cookie.CookieSpec} registry which will
-     * be used for request execution if not explicitly set in the client execution
-     * context.
-     */
-    public final HttpAsyncClientBuilder setDefaultCookieSpecRegistry(
-            final Lookup<CookieSpecProvider> cookieSpecRegistry) {
-        this.cookieSpecRegistry = cookieSpecRegistry;
-        return this;
-    }
-
-    /**
-     * Assigns {@code User-Agent} value.
-     * <p>
-     * Please note this value can be overridden by the {@link #setHttpProcessor(
-     * org.apache.http.protocol.HttpProcessor)} method.
-     */
-    public final HttpAsyncClientBuilder setUserAgent(final String userAgent) {
-        this.userAgent = userAgent;
-        return this;
-    }
-
-    /**
-     * Assigns default proxy value.
-     * <p>
-     * Please note this value can be overridden by the {@link #setRoutePlanner(
-     *   org.apache.http.conn.routing.HttpRoutePlanner)} method.
-     */
-    public final HttpAsyncClientBuilder setProxy(final HttpHost proxy) {
-        this.proxy = proxy;
-        return this;
-    }
-
-    /**
-     * Assigns {@link SchemeIOSessionStrategy} instance.
-     * <p>
-     * Please note this value can be overridden by the {@link #setConnectionManager(
-     *   org.apache.http.nio.conn.NHttpClientConnectionManager)} method.
-     */
-    public final HttpAsyncClientBuilder setSSLStrategy(final SchemeIOSessionStrategy strategy) {
-        this.sslStrategy = strategy;
-        return this;
-    }
-
-    /**
-     * Assigns {@link SSLContext} instance.
-     * <p>
-     * Please note this value can be overridden by the {@link #setConnectionManager(
-     *   org.apache.http.nio.conn.NHttpClientConnectionManager)} and the {@link #setSSLStrategy(
-     *   org.apache.http.nio.conn.SchemeIOSessionStrategy)} methods.
-     */
-    public final HttpAsyncClientBuilder setSSLContext(final SSLContext sslcontext) {
-        this.sslcontext = sslcontext;
-        return this;
-    }
-
-    /**
-     * Assigns {@link X509HostnameVerifier} instance.
-     * <p>
-     * Please note this value can be overridden by the {@link #setConnectionManager(
-     *   org.apache.http.nio.conn.NHttpClientConnectionManager)} and the {@link #setSSLStrategy(
-     *   org.apache.http.nio.conn.SchemeIOSessionStrategy)} methods.
-     *
-     * @deprecated (4.1) use {@link #setSSLHostnameVerifier(javax.net.ssl.HostnameVerifier)}
-     */
-    @Deprecated
-    public final HttpAsyncClientBuilder setHostnameVerifier(final X509HostnameVerifier hostnameVerifier) {
-        this.hostnameVerifier = hostnameVerifier;
-        return this;
-    }
-
-    /**
-     * Assigns {@link javax.net.ssl.HostnameVerifier} instance.
-     * <p>
-     * Please note this value can be overridden by the {@link #setConnectionManager(
-     *   org.apache.http.nio.conn.NHttpClientConnectionManager)} and the {@link #setSSLStrategy(
-     *   org.apache.http.nio.conn.SchemeIOSessionStrategy)} methods.
-     *
-     * @since 4.1
-     */
-    public final HttpAsyncClientBuilder setSSLHostnameVerifier(final HostnameVerifier hostnameVerifier) {
-        this.hostnameVerifier = hostnameVerifier;
-        return this;
-    }
-
-    /**
-     * Assigns default request header values.
-     * <p>
-     * Please note this value can be overridden by the {@link #setHttpProcessor(
-     * org.apache.http.protocol.HttpProcessor)} method.
-     */
-    public final HttpAsyncClientBuilder setDefaultHeaders(final Collection<? extends Header> defaultHeaders) {
-        this.defaultHeaders = defaultHeaders;
-        return this;
-    }
-
-    /**
-     * Assigns default {@link IOReactorConfig}.
-     * <p>
-     * Please note this value can be overridden by the {@link #setConnectionManager(
-     *   org.apache.http.nio.conn.NHttpClientConnectionManager)} method.
-     */
-    public final HttpAsyncClientBuilder setDefaultIOReactorConfig(final IOReactorConfig config) {
-        this.defaultIOReactorConfig = config;
-        return this;
-    }
-
-    /**
-     * Assigns default {@link ConnectionConfig}.
-     * <p>
-     * Please note this value can be overridden by the {@link #setConnectionManager(
-     *   org.apache.http.nio.conn.NHttpClientConnectionManager)} method.
-     */
-    public final HttpAsyncClientBuilder setDefaultConnectionConfig(final ConnectionConfig config) {
-        this.defaultConnectionConfig = config;
-        return this;
-    }
-
-    /**
-     * Assigns default {@link RequestConfig} instance which will be used
-     * for request execution if not explicitly set in the client execution
-     * context.
-     */
-    public final HttpAsyncClientBuilder setDefaultRequestConfig(final RequestConfig config) {
-        this.defaultRequestConfig = config;
-        return this;
-    }
-
-    /**
-     * Assigns {@link ThreadFactory} instance.
-     */
-    public final HttpAsyncClientBuilder setThreadFactory(final ThreadFactory threadFactory) {
-        this.threadFactory = threadFactory;
-        return this;
-    }
-
-    /**
-     * Assigns {@link NHttpClientEventHandler} instance.
-     *
-     * @since 4.1
-     */
-    public final HttpAsyncClientBuilder setEventHandler(final NHttpClientEventHandler eventHandler) {
-        this.eventHandler = eventHandler;
-        return this;
-    }
-
-    /**
-     * Disables connection state tracking.
-     */
-    public final HttpAsyncClientBuilder disableConnectionState() {
-        connectionStateDisabled = true;
-        return this;
-    }
-
-    /**
-     * Disables state (cookie) management.
-     * <p>
-     * Please note this value can be overridden by the {@link #setHttpProcessor(
-     * org.apache.http.protocol.HttpProcessor)} method.
-     */
-    public final HttpAsyncClientBuilder disableCookieManagement() {
-        cookieManagementDisabled = true;
-        return this;
-    }
-
-    /**
-     * Disables authentication scheme caching.
-     * <p>
-     * Please note this value can be overridden by the {@link #setHttpProcessor(
-     * org.apache.http.protocol.HttpProcessor)} method.
-     */
-    public final HttpAsyncClientBuilder disableAuthCaching() {
-        authCachingDisabled = true;
-        return this;
-    }
-
-    /**
-     * Use system properties when creating and configuring default
-     * implementations.
-     */
-    public final HttpAsyncClientBuilder useSystemProperties() {
-        systemProperties = true;
-        return this;
-    }
-
-    private static String[] split(final String s) {
-        if (TextUtils.isBlank(s)) {
-            return null;
-        }
-        return s.split(" *, *");
-    }
-
-    public CloseableHttpAsyncClient build() {
-
-        PublicSuffixMatcher publicSuffixMatcher = this.publicSuffixMatcher;
-        if (publicSuffixMatcher == null) {
-            publicSuffixMatcher = PublicSuffixMatcherLoader.getDefault();
-        }
-
-        NHttpClientConnectionManager connManager = this.connManager;
-        if (connManager == null) {
-            SchemeIOSessionStrategy sslStrategy = this.sslStrategy;
-            if (sslStrategy == null) {
-                SSLContext sslcontext = this.sslcontext;
-                if (sslcontext == null) {
-                    if (systemProperties) {
-                        sslcontext = SSLContexts.createSystemDefault();
-                    } else {
-                        sslcontext = SSLContexts.createDefault();
-                    }
-                }
-                final String[] supportedProtocols = systemProperties ? split(
-                        System.getProperty("https.protocols")) : null;
-                final String[] supportedCipherSuites = systemProperties ? split(
-                        System.getProperty("https.cipherSuites")) : null;
-                HostnameVerifier hostnameVerifier = this.hostnameVerifier;
-                if (hostnameVerifier == null) {
-                    hostnameVerifier = new DefaultHostnameVerifier(publicSuffixMatcher);
-                }
-                sslStrategy = new SSLIOSessionStrategy(
-                        sslcontext, supportedProtocols, supportedCipherSuites, hostnameVerifier);
-            }
-            final ConnectingIOReactor ioreactor = IOReactorUtils.create(
-                defaultIOReactorConfig != null ? defaultIOReactorConfig : IOReactorConfig.DEFAULT);
-            final PoolingNHttpClientConnectionManager poolingmgr = new PoolingNHttpClientConnectionManager(
-                    ioreactor,
-                    null,
-                    RegistryBuilder.<SchemeIOSessionStrategy>create()
-                        .register("http", NoopIOSessionStrategy.INSTANCE)
-                        .register("https", sslStrategy)
-                        .build(),
-                    this.dnsResolver);
-            if (defaultConnectionConfig != null) {
-                poolingmgr.setDefaultConnectionConfig(defaultConnectionConfig);
-            }
-            if (systemProperties) {
-                String s = System.getProperty("http.keepAlive", "true");
-                if ("true".equalsIgnoreCase(s)) {
-                    s = System.getProperty("http.maxConnections", "5");
-                    final int max = Integer.parseInt(s);
-                    poolingmgr.setDefaultMaxPerRoute(max);
-                    poolingmgr.setMaxTotal(2 * max);
-                }
-            } else {
-                if (maxConnTotal > 0) {
-                    poolingmgr.setMaxTotal(maxConnTotal);
-                }
-                if (maxConnPerRoute > 0) {
-                    poolingmgr.setDefaultMaxPerRoute(maxConnPerRoute);
-                }
-            }
-            connManager = poolingmgr;
-        }
-        ConnectionReuseStrategy reuseStrategy = this.reuseStrategy;
-        if (reuseStrategy == null) {
-            if (systemProperties) {
-                final String s = System.getProperty("http.keepAlive", "true");
-                if ("true".equalsIgnoreCase(s)) {
-                    reuseStrategy = DefaultConnectionReuseStrategy.INSTANCE;
-                } else {
-                    reuseStrategy = NoConnectionReuseStrategy.INSTANCE;
-                }
-            } else {
-                reuseStrategy = DefaultConnectionReuseStrategy.INSTANCE;
-            }
-        }
-        ConnectionKeepAliveStrategy keepAliveStrategy = this.keepAliveStrategy;
-        if (keepAliveStrategy == null) {
-            keepAliveStrategy = DefaultConnectionKeepAliveStrategy.INSTANCE;
-        }
-        AuthenticationStrategy targetAuthStrategy = this.targetAuthStrategy;
-        if (targetAuthStrategy == null) {
-            targetAuthStrategy = TargetAuthenticationStrategy.INSTANCE;
-        }
-        AuthenticationStrategy proxyAuthStrategy = this.proxyAuthStrategy;
-        if (proxyAuthStrategy == null) {
-            proxyAuthStrategy = ProxyAuthenticationStrategy.INSTANCE;
-        }
-        UserTokenHandler userTokenHandler = this.userTokenHandler;
-        if (userTokenHandler == null) {
-            if (!connectionStateDisabled) {
-                userTokenHandler = DefaultAsyncUserTokenHandler.INSTANCE;
-            } else {
-                userTokenHandler = NoopUserTokenHandler.INSTANCE;
-            }
-        }
-        SchemePortResolver schemePortResolver = this.schemePortResolver;
-        if (schemePortResolver == null) {
-            schemePortResolver = DefaultSchemePortResolver.INSTANCE;
-        }
-
-        HttpProcessor httpprocessor = this.httpprocessor;
-        if (httpprocessor == null) {
-
-            String userAgent = this.userAgent;
-            if (userAgent == null) {
-                if (systemProperties) {
-                    userAgent = System.getProperty("http.agent");
-                }
-                if (userAgent == null) {
-                    userAgent = VersionInfo.getUserAgent(
-                            "Apache-HttpAsyncClient",
-                            "org.apache.http.nio.client", getClass());
-                }
-            }
-
-            final HttpProcessorBuilder b = HttpProcessorBuilder.create();
-            if (requestFirst != null) {
-                for (final HttpRequestInterceptor i: requestFirst) {
-                    b.addFirst(i);
-                }
-            }
-            if (responseFirst != null) {
-                for (final HttpResponseInterceptor i: responseFirst) {
-                    b.addFirst(i);
-                }
-            }
-            b.addAll(
-                    new RequestDefaultHeaders(defaultHeaders),
-                    new RequestContent(),
-                    new RequestTargetHost(),
-                    new RequestClientConnControl(),
-                    new RequestUserAgent(userAgent),
-                    new RequestExpectContinue());
-            if (!cookieManagementDisabled) {
-                b.add(new RequestAddCookies());
-            }
-            if (!authCachingDisabled) {
-                b.add(new RequestAuthCache());
-            }
-            if (!cookieManagementDisabled) {
-                b.add(new ResponseProcessCookies());
-            }
-            if (requestLast != null) {
-                for (final HttpRequestInterceptor i: requestLast) {
-                    b.addLast(i);
-                }
-            }
-            if (responseLast != null) {
-                for (final HttpResponseInterceptor i: responseLast) {
-                    b.addLast(i);
-                }
-            }
-            httpprocessor = b.build();
-        }
-        // Add redirect executor, if not disabled
-        HttpRoutePlanner routePlanner = this.routePlanner;
-        if (routePlanner == null) {
-            if (proxy != null) {
-                routePlanner = new DefaultProxyRoutePlanner(proxy, schemePortResolver);
-            } else if (systemProperties) {
-                routePlanner = new SystemDefaultRoutePlanner(
-                        schemePortResolver, ProxySelector.getDefault());
-            } else {
-                routePlanner = new DefaultRoutePlanner(schemePortResolver);
-            }
-        }
-        Lookup<AuthSchemeProvider> authSchemeRegistry = this.authSchemeRegistry;
-        if (authSchemeRegistry == null) {
-            authSchemeRegistry = RegistryBuilder.<AuthSchemeProvider>create()
-                .register(AuthSchemes.BASIC, new BasicSchemeFactory())
-                .register(AuthSchemes.DIGEST, new DigestSchemeFactory())
-                .register(AuthSchemes.NTLM, new NTLMSchemeFactory())
-                .register(AuthSchemes.SPNEGO, new SPNegoSchemeFactory())
-                .register(AuthSchemes.KERBEROS, new KerberosSchemeFactory())
-                .build();
-        }
-        Lookup<CookieSpecProvider> cookieSpecRegistry = this.cookieSpecRegistry;
-        if (cookieSpecRegistry == null) {
-            final CookieSpecProvider defaultProvider = new DefaultCookieSpecProvider(publicSuffixMatcher);
-            final CookieSpecProvider laxStandardProvider = new RFC6265CookieSpecProvider(
-                    RFC6265CookieSpecProvider.CompatibilityLevel.RELAXED, publicSuffixMatcher);
-            final CookieSpecProvider strictStandardProvider = new RFC6265CookieSpecProvider(
-                    RFC6265CookieSpecProvider.CompatibilityLevel.STRICT, publicSuffixMatcher);
-            cookieSpecRegistry = RegistryBuilder.<CookieSpecProvider>create()
-                    .register(CookieSpecs.DEFAULT, defaultProvider)
-                    .register("best-match", defaultProvider)
-                    .register("compatibility", defaultProvider)
-                    .register(CookieSpecs.STANDARD, laxStandardProvider)
-                    .register(CookieSpecs.STANDARD_STRICT, strictStandardProvider)
-                    .register(CookieSpecs.NETSCAPE, new NetscapeDraftSpecProvider())
-                    .register(CookieSpecs.IGNORE_COOKIES, new IgnoreSpecProvider())
-                    .build();
-        }
-
-        CookieStore defaultCookieStore = this.cookieStore;
-        if (defaultCookieStore == null) {
-            defaultCookieStore = new BasicCookieStore();
-        }
-
-        CredentialsProvider defaultCredentialsProvider = this.credentialsProvider;
-        if (defaultCredentialsProvider == null) {
-            defaultCredentialsProvider = new BasicCredentialsProvider();
-        }
-
-        RedirectStrategy redirectStrategy = this.redirectStrategy;
-        if (redirectStrategy == null) {
-            redirectStrategy = DefaultRedirectStrategy.INSTANCE;
-        }
-
-        RequestConfig defaultRequestConfig = this.defaultRequestConfig;
-        if (defaultRequestConfig == null) {
-            defaultRequestConfig = RequestConfig.DEFAULT;
-        }
-
-        final MainClientExec exec = new MainClientExec(
-            httpprocessor,
-            routePlanner,
-            redirectStrategy,
-            targetAuthStrategy,
-            proxyAuthStrategy,
-            userTokenHandler);
-
-        ThreadFactory threadFactory = null;
-        NHttpClientEventHandler eventHandler = null;
-        if (!this.connManagerShared) {
-            threadFactory = this.threadFactory;
-            if (threadFactory == null) {
-                threadFactory = Executors.defaultThreadFactory();
-            }
-            eventHandler = this.eventHandler;
-            if (eventHandler == null) {
-                eventHandler = new HttpAsyncRequestExecutor();
-            }
-        }
-        return new InternalHttpAsyncClient(
-            connManager,
-            reuseStrategy,
-            keepAliveStrategy,
-            threadFactory,
-            eventHandler,
-            exec,
-            cookieSpecRegistry,
-            authSchemeRegistry,
-            defaultCookieStore,
-            defaultCredentialsProvider,
-            defaultRequestConfig);
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/HttpAsyncClients.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/HttpAsyncClients.java
deleted file mode 100644
index da83c41..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/HttpAsyncClients.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.http.impl.nio.client;
-
-import org.apache.http.annotation.Immutable;
-import org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager;
-import org.apache.http.nio.conn.NHttpClientConnectionManager;
-import org.apache.http.nio.reactor.ConnectingIOReactor;
-import org.apache.http.util.Args;
-
-/**
- * Factory methods for {@link org.apache.http.impl.nio.client.CloseableHttpAsyncClient} and
- * {@link org.apache.http.impl.nio.client.CloseableHttpPipeliningClient} instances.
- *
- * @since 4.0
- */
-@Immutable
-public class HttpAsyncClients {
-
-    private HttpAsyncClients() {
-        super();
-    }
-
-    /**
-     * Creates builder object for construction of custom
-     * {@link CloseableHttpAsyncClient} instances.
-     */
-    public static HttpAsyncClientBuilder custom() {
-        return HttpAsyncClientBuilder.create();
-    }
-
-    /**
-     * Creates {@link CloseableHttpAsyncClient} instance with default
-     * configuration.
-     */
-    public static CloseableHttpAsyncClient createDefault() {
-        return HttpAsyncClientBuilder.create().build();
-    }
-
-    /**
-     * Creates {@link CloseableHttpAsyncClient} instance with default
-     * configuration based on ssytem properties.
-     */
-    public static CloseableHttpAsyncClient createSystem() {
-        return HttpAsyncClientBuilder.create()
-                .useSystemProperties()
-                .build();
-    }
-
-    /**
-     * Creates {@link CloseableHttpAsyncClient} instance that supports esential HTTP protocol
-     * aspects only. This client does not support HTTP state management, authentication
-     * and automatic redirects.
-     */
-    public static CloseableHttpAsyncClient createMinimal() {
-        return MinimalHttpAsyncClientBuilder.create()
-                .disableCookieManagement()
-                .build();
-    }
-
-    /**
-     * Creates {@link CloseableHttpAsyncClient} instance that supports esential HTTP protocol
-     * aspects only. This client does not support HTTP state management, authentication
-     * and automatic redirects.
-     */
-    public static CloseableHttpAsyncClient createMinimal(final ConnectingIOReactor ioreactor) {
-        Args.notNull(ioreactor, "I/O reactor");
-        return createMinimal(new PoolingNHttpClientConnectionManager(ioreactor), false);
-    }
-
-    /**
-     * Creates {@link CloseableHttpAsyncClient} instance that supports esential HTTP protocol
-     * aspects only. This client does not support HTTP state management, authentication
-     * and automatic redirects.
-     */
-    public static CloseableHttpAsyncClient createMinimal(final NHttpClientConnectionManager connManager) {
-        return createMinimal(connManager, false);
-    }
-
-    /**
-     * Creates {@link CloseableHttpAsyncClient} instance that supports esential HTTP protocol
-     * aspects only. This client does not support HTTP state management, authentication
-     * and automatic redirects.
-     * <p>
-     * Please note that clients with a shared connection manager make no attempts to control
-     * its life cycle and dealocation of resources. It is a responibility of the caller to
-     * ensure that the shared connection manager is properly started and shut down when no
-     * longer needed.
-     *
-     * @since 4.1
-     */
-    public static CloseableHttpAsyncClient createMinimal(
-            final NHttpClientConnectionManager connManager, final boolean shared) {
-        Args.notNull(connManager, "Connection manager");
-        return MinimalHttpAsyncClientBuilder.create()
-                .setConnectionManager(connManager)
-                .setConnectionManagerShared(shared)
-                .disableCookieManagement()
-                .build();
-    }
-
-    /**
-     * Creates {@link CloseableHttpPipeliningClient} instance that supports pipelined request
-     * execution. This client does not support authentication and automatic redirects.
-     *
-     * @since 4.1
-     */
-    public static CloseableHttpPipeliningClient createPipelining() {
-        return MinimalHttpAsyncClientBuilder.create().build();
-    }
-
-    /**
-     * Creates {@link CloseableHttpPipeliningClient} instance that supports pipelined request
-     * execution. This client does not support authentication and automatic redirects.
-     *
-     * @since 4.1
-     */
-    public static CloseableHttpPipeliningClient createPipelining(final ConnectingIOReactor ioreactor) {
-        return createPipelining(new PoolingNHttpClientConnectionManager(ioreactor), false);
-    }
-
-    /**
-     * Creates {@link CloseableHttpPipeliningClient} instance that supports pipelined request
-     * execution. This client does not support authentication and automatic redirects.
-     *
-     * @since 4.1
-     */
-    public static CloseableHttpPipeliningClient createPipelining(final NHttpClientConnectionManager connManager) {
-        return createPipelining(connManager, false);
-    }
-
-    /**
-     * Creates {@link CloseableHttpPipeliningClient} instance that supports pipelined request
-     * execution. This client does not support authentication and automatic redirects.
-     * <p>
-     * Please note that clients with a shared connection manager make no attempts to control
-     * its life cycle and dealocation of resources. It is a responibility of the caller to
-     * ensure that the shared connection manager is properly started and shut down when no
-     * longer needed.
-     *
-     * @since 4.1
-     */
-    public static CloseableHttpPipeliningClient createPipelining(
-            final NHttpClientConnectionManager connManager, final boolean shared) {
-        Args.notNull(connManager, "Connection manager");
-        return MinimalHttpAsyncClientBuilder.create()
-                .setConnectionManager(connManager)
-                .setConnectionManagerShared(shared)
-                .build();
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/IOReactorUtils.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/IOReactorUtils.java
deleted file mode 100644
index aefa474..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/IOReactorUtils.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.client;
-
-import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor;
-import org.apache.http.impl.nio.reactor.IOReactorConfig;
-import org.apache.http.nio.reactor.ConnectingIOReactor;
-import org.apache.http.nio.reactor.IOReactorException;
-
-final class IOReactorUtils {
-
-    private IOReactorUtils() {
-    }
-
-    public static ConnectingIOReactor create(final IOReactorConfig config) {
-        try {
-            return new DefaultConnectingIOReactor(config);
-        } catch (final IOReactorException ex) {
-            throw new IllegalStateException(ex);
-        }
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/InternalClientExec.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/InternalClientExec.java
deleted file mode 100644
index 77db4e7..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/InternalClientExec.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.client;
-
-import java.io.IOException;
-
-import org.apache.http.HttpException;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.nio.ContentDecoder;
-import org.apache.http.nio.ContentEncoder;
-import org.apache.http.nio.IOControl;
-
-interface InternalClientExec {
-
-    void prepare(
-            HttpHost target,
-            HttpRequest original,
-            InternalState state,
-            AbstractClientExchangeHandler<?> handler) throws IOException, HttpException;
-
-    HttpRequest generateRequest(
-            InternalState state,
-            AbstractClientExchangeHandler<?> handler) throws IOException, HttpException;
-
-    void produceContent(
-            InternalState state,
-            ContentEncoder encoder,
-            IOControl ioctrl) throws IOException;
-
-    void requestCompleted(
-            InternalState state,
-            AbstractClientExchangeHandler<?> handler);
-
-    void responseReceived(
-            HttpResponse response,
-            InternalState state,
-            AbstractClientExchangeHandler<?> handler) throws IOException, HttpException;
-
-    void consumeContent(
-            InternalState state,
-            ContentDecoder decoder,
-            IOControl ioctrl) throws IOException;
-
-    void responseCompleted(
-            InternalState state,
-            AbstractClientExchangeHandler<?> handler) throws IOException, HttpException;
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/InternalHttpAsyncClient.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/InternalHttpAsyncClient.java
deleted file mode 100644
index 930ac27..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/InternalHttpAsyncClient.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.client;
-
-import java.util.List;
-import java.util.concurrent.Future;
-import java.util.concurrent.ThreadFactory;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.http.ConnectionReuseStrategy;
-import org.apache.http.HttpHost;
-import org.apache.http.auth.AuthSchemeProvider;
-import org.apache.http.auth.AuthState;
-import org.apache.http.client.CookieStore;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.concurrent.BasicFuture;
-import org.apache.http.concurrent.FutureCallback;
-import org.apache.http.config.Lookup;
-import org.apache.http.conn.ConnectionKeepAliveStrategy;
-import org.apache.http.cookie.CookieSpecProvider;
-import org.apache.http.nio.NHttpClientEventHandler;
-import org.apache.http.nio.conn.NHttpClientConnectionManager;
-import org.apache.http.nio.protocol.HttpAsyncRequestProducer;
-import org.apache.http.nio.protocol.HttpAsyncResponseConsumer;
-import org.apache.http.protocol.BasicHttpContext;
-import org.apache.http.protocol.HttpContext;
-
-class InternalHttpAsyncClient extends CloseableHttpAsyncClientBase {
-
-    private final Log log = LogFactory.getLog(getClass());
-
-    private final NHttpClientConnectionManager connmgr;
-    private final ConnectionReuseStrategy connReuseStrategy;
-    private final ConnectionKeepAliveStrategy keepaliveStrategy;
-    private final InternalClientExec exec;
-    private final Lookup<CookieSpecProvider> cookieSpecRegistry;
-    private final Lookup<AuthSchemeProvider> authSchemeRegistry;
-    private final CookieStore cookieStore;
-    private final CredentialsProvider credentialsProvider;
-    private final RequestConfig defaultConfig;
-
-    public InternalHttpAsyncClient(
-            final NHttpClientConnectionManager connmgr,
-            final ConnectionReuseStrategy connReuseStrategy,
-            final ConnectionKeepAliveStrategy keepaliveStrategy,
-            final ThreadFactory threadFactory,
-            final NHttpClientEventHandler handler,
-            final InternalClientExec exec,
-            final Lookup<CookieSpecProvider> cookieSpecRegistry,
-            final Lookup<AuthSchemeProvider> authSchemeRegistry,
-            final CookieStore cookieStore,
-            final CredentialsProvider credentialsProvider,
-            final RequestConfig defaultConfig) {
-        super(connmgr, threadFactory, handler);
-        this.connmgr = connmgr;
-        this.connReuseStrategy = connReuseStrategy;
-        this.keepaliveStrategy = keepaliveStrategy;
-        this.exec = exec;
-        this.cookieSpecRegistry = cookieSpecRegistry;
-        this.authSchemeRegistry = authSchemeRegistry;
-        this.cookieStore = cookieStore;
-        this.credentialsProvider = credentialsProvider;
-        this.defaultConfig = defaultConfig;
-    }
-
-    private void setupContext(final HttpClientContext context) {
-        if (context.getAttribute(HttpClientContext.TARGET_AUTH_STATE) == null) {
-            context.setAttribute(HttpClientContext.TARGET_AUTH_STATE, new AuthState());
-        }
-        if (context.getAttribute(HttpClientContext.PROXY_AUTH_STATE) == null) {
-            context.setAttribute(HttpClientContext.PROXY_AUTH_STATE, new AuthState());
-        }
-        if (context.getAttribute(HttpClientContext.AUTHSCHEME_REGISTRY) == null) {
-            context.setAttribute(HttpClientContext.AUTHSCHEME_REGISTRY, this.authSchemeRegistry);
-        }
-        if (context.getAttribute(HttpClientContext.COOKIESPEC_REGISTRY) == null) {
-            context.setAttribute(HttpClientContext.COOKIESPEC_REGISTRY, this.cookieSpecRegistry);
-        }
-        if (context.getAttribute(HttpClientContext.COOKIE_STORE) == null) {
-            context.setAttribute(HttpClientContext.COOKIE_STORE, this.cookieStore);
-        }
-        if (context.getAttribute(HttpClientContext.CREDS_PROVIDER) == null) {
-            context.setAttribute(HttpClientContext.CREDS_PROVIDER, this.credentialsProvider);
-        }
-        if (context.getAttribute(HttpClientContext.REQUEST_CONFIG) == null) {
-            context.setAttribute(HttpClientContext.REQUEST_CONFIG, this.defaultConfig);
-        }
-    }
-
-    @Override
-    public <T> Future<T> execute(
-            final HttpAsyncRequestProducer requestProducer,
-            final HttpAsyncResponseConsumer<T> responseConsumer,
-            final HttpContext context,
-            final FutureCallback<T> callback) {
-        ensureRunning();
-        final BasicFuture<T> future = new BasicFuture<T>(callback);
-        final HttpClientContext localcontext = HttpClientContext.adapt(
-            context != null ? context : new BasicHttpContext());
-        setupContext(localcontext);
-
-        @SuppressWarnings("resource")
-        final DefaultClientExchangeHandlerImpl<T> handler = new DefaultClientExchangeHandlerImpl<T>(
-            this.log,
-            requestProducer,
-            responseConsumer,
-            localcontext,
-            future,
-            this.connmgr,
-            this.connReuseStrategy,
-            this.keepaliveStrategy,
-            this.exec);
-        try {
-            handler.start();
-        } catch (final Exception ex) {
-            handler.failed(ex);
-        }
-        return future;
-    }
-
-    @Override
-    public <T> Future<List<T>> execute(
-            final HttpHost target,
-            final List<? extends HttpAsyncRequestProducer> requestProducers,
-            final List<? extends HttpAsyncResponseConsumer<T>> responseConsumers,
-            final HttpContext context,
-            final FutureCallback<List<T>> callback) {
-        throw new UnsupportedOperationException("Pipelining not supported");
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/InternalIODispatch.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/InternalIODispatch.java
deleted file mode 100644
index fa04c6b..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/InternalIODispatch.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.http.impl.nio.client;
-
-import java.io.IOException;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.http.impl.nio.DefaultNHttpClientConnection;
-import org.apache.http.impl.nio.reactor.AbstractIODispatch;
-import org.apache.http.nio.NHttpClientEventHandler;
-import org.apache.http.nio.reactor.IOSession;
-
-class InternalIODispatch extends AbstractIODispatch<DefaultNHttpClientConnection> {
-
-    private final Log log = LogFactory.getLog(InternalIODispatch.class);
-
-    private final NHttpClientEventHandler handler;
-
-    public InternalIODispatch(final NHttpClientEventHandler handler) {
-        super();
-        if (this.log.isDebugEnabled()) {
-            this.handler = new InternalRequestExecutor(this.log, handler);
-        } else {
-            this.handler = handler;
-        }
-    }
-
-    @Override
-    protected DefaultNHttpClientConnection createConnection(final IOSession session) {
-        throw new IllegalStateException("Connection must be created by connection manager");
-    }
-
-    @Override
-    protected void onConnected(final DefaultNHttpClientConnection conn) {
-        final Object attachment = conn.getContext().getAttribute(IOSession.ATTACHMENT_KEY);
-        try {
-            this.handler.connected(conn, attachment);
-        } catch (final Exception ex) {
-            this.handler.exception(conn, ex);
-        }
-    }
-
-    @Override
-    protected void onClosed(final DefaultNHttpClientConnection conn) {
-        this.handler.closed(conn);
-    }
-
-    @Override
-    protected void onException(final DefaultNHttpClientConnection conn, final IOException ex) {
-        this.handler.exception(conn, ex);
-    }
-
-    @Override
-    protected void onInputReady(final DefaultNHttpClientConnection conn) {
-        conn.consumeInput(this.handler);
-    }
-
-    @Override
-    protected void onOutputReady(final DefaultNHttpClientConnection conn) {
-        conn.produceOutput(this.handler);
-    }
-
-    @Override
-    protected void onTimeout(final DefaultNHttpClientConnection conn) {
-        try {
-            this.handler.timeout(conn);
-        } catch (final Exception ex) {
-            this.handler.exception(conn, ex);
-        }
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/InternalIOReactorExceptionHandler.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/InternalIOReactorExceptionHandler.java
deleted file mode 100644
index 1fc0634..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/InternalIOReactorExceptionHandler.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.client;
-
-import java.io.IOException;
-
-import org.apache.commons.logging.Log;
-import org.apache.http.nio.reactor.IOReactorExceptionHandler;
-
-class InternalIOReactorExceptionHandler implements IOReactorExceptionHandler {
-
-    private final Log log;
-
-    InternalIOReactorExceptionHandler(final Log log) {
-        super();
-        this.log = log;
-    }
-
-    @Override
-    public boolean handle(final IOException ex) {
-        this.log.error("Fatal I/O error", ex);
-        return false;
-    }
-
-    @Override
-    public boolean handle(final RuntimeException ex) {
-        this.log.error("Fatal runtime error", ex);
-        return false;
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/InternalRequestExecutor.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/InternalRequestExecutor.java
deleted file mode 100644
index fae3ab9..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/InternalRequestExecutor.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.http.impl.nio.client;
-
-import java.io.IOException;
-
-import org.apache.commons.logging.Log;
-import org.apache.http.HttpException;
-import org.apache.http.nio.ContentDecoder;
-import org.apache.http.nio.ContentEncoder;
-import org.apache.http.nio.NHttpClientConnection;
-import org.apache.http.nio.NHttpClientEventHandler;
-
-class InternalRequestExecutor implements NHttpClientEventHandler {
-
-    private final Log log;
-    private final NHttpClientEventHandler handler;
-
-    public InternalRequestExecutor(final Log log, final NHttpClientEventHandler handler) {
-        this.log = log;
-        this.handler = handler;
-    }
-
-    @Override
-    public void connected(
-            final NHttpClientConnection conn,
-            final Object attachment) throws IOException, HttpException {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug(conn + ": Connected");
-        }
-        this.handler.connected(conn, attachment);
-    }
-
-    @Override
-    public void closed(final NHttpClientConnection conn) {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug(conn + ": Disconnected");
-        }
-        this.handler.closed(conn);
-    }
-
-    @Override
-    public void requestReady(
-            final NHttpClientConnection conn) throws IOException, HttpException {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug(conn + " Request ready");
-        }
-        this.handler.requestReady(conn);
-    }
-
-    @Override
-    public void inputReady(
-            final NHttpClientConnection conn,
-            final ContentDecoder decoder) throws IOException, HttpException {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug(conn + " Input ready");
-        }
-        this.handler.inputReady(conn, decoder);
-        if (this.log.isDebugEnabled()) {
-            this.log.debug(conn + " " + decoder);
-        }
-    }
-
-    @Override
-    public void outputReady(
-            final NHttpClientConnection conn,
-            final ContentEncoder encoder) throws IOException, HttpException {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug(conn + " Output ready");
-        }
-        this.handler.outputReady(conn, encoder);
-        if (this.log.isDebugEnabled()) {
-            this.log.debug(conn + " " + encoder);
-        }
-    }
-
-    @Override
-    public void responseReceived(
-            final NHttpClientConnection conn) throws HttpException, IOException {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug(conn + " Response received");
-        }
-        this.handler.responseReceived(conn);
-    }
-
-    @Override
-    public void timeout(final NHttpClientConnection conn) throws HttpException, IOException {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug(conn + " Timeout");
-        }
-        this.handler.timeout(conn);
-    }
-
-    @Override
-    public void exception(final NHttpClientConnection conn, final Exception ex) {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug(conn + " Exception", ex);
-        }
-        this.handler.exception(conn, ex);
-    }
-
-    @Override
-    public void endOfInput(final NHttpClientConnection conn) throws IOException {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug(conn + " End of input");
-        }
-        this.handler.endOfInput(conn);
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/InternalState.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/InternalState.java
deleted file mode 100644
index 1c7c992..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/InternalState.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.client;
-
-import java.nio.ByteBuffer;
-
-import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.HttpRequestWrapper;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.nio.protocol.HttpAsyncRequestProducer;
-import org.apache.http.nio.protocol.HttpAsyncResponseConsumer;
-
-class InternalState {
-
-    private final long id;
-    private final HttpAsyncRequestProducer requestProducer;
-    private final HttpAsyncResponseConsumer<?> responseConsumer;
-    private final HttpClientContext localContext;
-
-    private HttpRequestWrapper mainRequest;
-    private HttpResponse finalResponse;
-    private ByteBuffer tmpbuf;
-    private boolean requestContentProduced;
-    private int execCount;
-
-    private int redirectCount;
-    private HttpUriRequest redirect;
-
-    public InternalState(
-            final long id,
-            final HttpAsyncRequestProducer requestProducer,
-            final HttpAsyncResponseConsumer<?> responseConsumer,
-            final HttpClientContext localContext) {
-        super();
-        this.id = id;
-        this.requestProducer = requestProducer;
-        this.responseConsumer = responseConsumer;
-        this.localContext = localContext;
-    }
-
-    public long getId() {
-        return id;
-    }
-
-    public HttpAsyncRequestProducer getRequestProducer() {
-        return requestProducer;
-    }
-
-    public HttpAsyncResponseConsumer<?> getResponseConsumer() {
-        return responseConsumer;
-    }
-
-    public HttpClientContext getLocalContext() {
-        return localContext;
-    }
-
-    public HttpRequestWrapper getMainRequest() {
-        return mainRequest;
-    }
-
-    public void setMainRequest(final HttpRequestWrapper mainRequest) {
-        this.mainRequest = mainRequest;
-    }
-
-    public HttpResponse getFinalResponse() {
-        return finalResponse;
-    }
-
-    public void setFinalResponse(final HttpResponse finalResponse) {
-        this.finalResponse = finalResponse;
-    }
-
-    public ByteBuffer getTmpbuf() {
-        if (tmpbuf == null) {
-            tmpbuf = ByteBuffer.allocate(4 * 1024);
-        }
-        return tmpbuf;
-    }
-
-    public boolean isRequestContentProduced() {
-        return requestContentProduced;
-    }
-
-    public void setRequestContentProduced() {
-        this.requestContentProduced = true;
-    }
-
-    public int getExecCount() {
-        return execCount;
-    }
-
-    public void incrementExecCount() {
-        this.execCount++;
-    }
-
-    public int getRedirectCount() {
-        return redirectCount;
-    }
-
-    public void incrementRedirectCount() {
-        this.redirectCount++;
-    }
-
-    public HttpUriRequest getRedirect() {
-        return redirect;
-    }
-
-    public void setRedirect(final HttpUriRequest redirect) {
-        this.redirect = redirect;
-    }
-
-    @Override
-    public String toString() {
-        return Long.toString(id);
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/MainClientExec.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/MainClientExec.java
deleted file mode 100644
index c605f60..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/MainClientExec.java
+++ /dev/null
@@ -1,644 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.client;
-
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.nio.ByteBuffer;
-import java.util.List;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.http.HttpException;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.HttpVersion;
-import org.apache.http.ProtocolException;
-import org.apache.http.auth.AUTH;
-import org.apache.http.auth.AuthProtocolState;
-import org.apache.http.auth.AuthScheme;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.AuthState;
-import org.apache.http.auth.UsernamePasswordCredentials;
-import org.apache.http.client.AuthenticationStrategy;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.client.NonRepeatableRequestException;
-import org.apache.http.client.RedirectException;
-import org.apache.http.client.RedirectStrategy;
-import org.apache.http.client.UserTokenHandler;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.methods.Configurable;
-import org.apache.http.client.methods.HttpRequestWrapper;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.client.protocol.RequestClientConnControl;
-import org.apache.http.client.utils.URIUtils;
-import org.apache.http.conn.routing.BasicRouteDirector;
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.conn.routing.HttpRouteDirector;
-import org.apache.http.conn.routing.HttpRoutePlanner;
-import org.apache.http.impl.auth.HttpAuthenticator;
-import org.apache.http.message.BasicHttpRequest;
-import org.apache.http.nio.ContentDecoder;
-import org.apache.http.nio.ContentEncoder;
-import org.apache.http.nio.IOControl;
-import org.apache.http.nio.NHttpClientConnection;
-import org.apache.http.nio.protocol.HttpAsyncRequestProducer;
-import org.apache.http.nio.protocol.HttpAsyncResponseConsumer;
-import org.apache.http.protocol.HttpCoreContext;
-import org.apache.http.protocol.HttpProcessor;
-import org.apache.http.protocol.ImmutableHttpProcessor;
-import org.apache.http.protocol.RequestTargetHost;
-
-class MainClientExec implements InternalClientExec {
-
-    private final Log log = LogFactory.getLog(getClass());
-
-    private final HttpProcessor httpProcessor;
-    private final HttpProcessor proxyHttpProcessor;
-    private final HttpRoutePlanner routePlanner;
-    private final AuthenticationStrategy targetAuthStrategy;
-    private final AuthenticationStrategy proxyAuthStrategy;
-    private final UserTokenHandler userTokenHandler;
-    private final RedirectStrategy redirectStrategy;
-    private final HttpRouteDirector routeDirector;
-    private final HttpAuthenticator authenticator;
-
-    public MainClientExec(
-            final HttpProcessor httpProcessor,
-            final HttpRoutePlanner routePlanner,
-            final RedirectStrategy redirectStrategy,
-            final AuthenticationStrategy targetAuthStrategy,
-            final AuthenticationStrategy proxyAuthStrategy,
-            final UserTokenHandler userTokenHandler) {
-        super();
-        this.httpProcessor = httpProcessor;
-        this.proxyHttpProcessor = new ImmutableHttpProcessor(
-                new RequestTargetHost(), new RequestClientConnControl());
-        this.routePlanner = routePlanner;
-        this.redirectStrategy = redirectStrategy;
-        this.targetAuthStrategy = targetAuthStrategy;
-        this.proxyAuthStrategy = proxyAuthStrategy;
-        this.userTokenHandler = userTokenHandler;
-        this.routeDirector = new BasicRouteDirector();
-        this.authenticator = new HttpAuthenticator(log);
-    }
-
-    @Override
-    public void prepare(
-            final HttpHost target,
-            final HttpRequest original,
-            final InternalState state,
-            final AbstractClientExchangeHandler<?> handler) throws HttpException, IOException {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + state.getId() + "] start execution");
-        }
-
-        final HttpClientContext localContext = state.getLocalContext();
-
-        if (original instanceof Configurable) {
-            final RequestConfig config = ((Configurable) original).getConfig();
-            if (config != null) {
-                localContext.setRequestConfig(config);
-            }
-        }
-
-        final List<URI> redirectLocations = localContext.getRedirectLocations();
-        if (redirectLocations != null) {
-            redirectLocations.clear();
-        }
-
-        final HttpRequestWrapper request = HttpRequestWrapper.wrap(original);
-        final HttpRoute route = this.routePlanner.determineRoute(target, request, localContext);
-
-        handler.setRoute(route);
-
-        state.setMainRequest(request);
-        handler.setCurrentRequest(request);
-
-        prepareRequest(state, handler);
-    }
-
-    @Override
-    public HttpRequest generateRequest(
-            final InternalState state,
-            final AbstractClientExchangeHandler<?> handler) throws IOException, HttpException {
-
-        final HttpRoute route = handler.getRoute();
-
-        handler.verifytRoute();
-
-        if (!handler.isRouteEstablished()) {
-            int step;
-            loop:
-            do {
-                final HttpRoute fact = handler.getActualRoute();
-                step = this.routeDirector.nextStep(route, fact);
-                switch (step) {
-                case HttpRouteDirector.CONNECT_TARGET:
-                    handler.onRouteToTarget();
-                    break;
-                case HttpRouteDirector.CONNECT_PROXY:
-                    handler.onRouteToProxy();
-                    break;
-                case HttpRouteDirector.TUNNEL_TARGET:
-                    if (this.log.isDebugEnabled()) {
-                        this.log.debug("[exchange: " + state.getId() + "] Tunnel required");
-                    }
-                    final HttpRequest connect = createConnectRequest(route, state);
-                    handler.setCurrentRequest(HttpRequestWrapper.wrap(connect));
-                    break loop;
-                case HttpRouteDirector.TUNNEL_PROXY:
-                    throw new HttpException("Proxy chains are not supported");
-                case HttpRouteDirector.LAYER_PROTOCOL:
-                    handler.onRouteUpgrade();
-                    break;
-                case HttpRouteDirector.UNREACHABLE:
-                    throw new HttpException("Unable to establish route: " +
-                            "planned = " + route + "; current = " + fact);
-                case HttpRouteDirector.COMPLETE:
-                    handler.onRouteComplete();
-                    this.log.debug("Connection route established");
-                    break;
-                default:
-                    throw new IllegalStateException("Unknown step indicator "
-                            + step + " from RouteDirector.");
-                }
-            } while (step > HttpRouteDirector.COMPLETE);
-        }
-
-        final HttpClientContext localContext = state.getLocalContext();
-        HttpRequestWrapper currentRequest = handler.getCurrentRequest();
-        if (currentRequest == null) {
-            currentRequest = state.getMainRequest();
-            handler.setCurrentRequest(currentRequest);
-        }
-
-        if (handler.isRouteEstablished()) {
-            state.incrementExecCount();
-            if (state.getExecCount() > 1) {
-                final HttpAsyncRequestProducer requestProducer = state.getRequestProducer();
-                if (!requestProducer.isRepeatable() && state.isRequestContentProduced()) {
-                    throw new NonRepeatableRequestException("Cannot retry request " +
-                            "with a non-repeatable request entity.");
-                }
-                requestProducer.resetRequest();
-            }
-            if (this.log.isDebugEnabled()) {
-                this.log.debug("[exchange: " + state.getId() + "] Attempt " + state.getExecCount() +
-                    " to execute request");
-            }
-
-            if (!currentRequest.containsHeader(AUTH.WWW_AUTH_RESP)) {
-                final AuthState targetAuthState = localContext.getTargetAuthState();
-                if (this.log.isDebugEnabled()) {
-                    this.log.debug("Target auth state: " + targetAuthState.getState());
-                }
-                this.authenticator.generateAuthResponse(currentRequest, targetAuthState, localContext);
-            }
-            if (!currentRequest.containsHeader(AUTH.PROXY_AUTH_RESP) && !route.isTunnelled()) {
-                final AuthState proxyAuthState = localContext.getProxyAuthState();
-                if (this.log.isDebugEnabled()) {
-                    this.log.debug("Proxy auth state: " + proxyAuthState.getState());
-                }
-                this.authenticator.generateAuthResponse(currentRequest, proxyAuthState, localContext);
-            }
-        } else {
-            if (!currentRequest.containsHeader(AUTH.PROXY_AUTH_RESP)) {
-                final AuthState proxyAuthState = localContext.getProxyAuthState();
-                if (this.log.isDebugEnabled()) {
-                    this.log.debug("Proxy auth state: " + proxyAuthState.getState());
-                }
-                this.authenticator.generateAuthResponse(currentRequest, proxyAuthState, localContext);
-            }
-        }
-
-        final NHttpClientConnection managedConn = handler.getConnection();
-        localContext.setAttribute(HttpCoreContext.HTTP_CONNECTION, managedConn);
-        final RequestConfig config = localContext.getRequestConfig();
-        if (config.getSocketTimeout() > 0) {
-            managedConn.setSocketTimeout(config.getSocketTimeout());
-        }
-        return currentRequest;
-    }
-
-    @Override
-    public void produceContent(
-            final InternalState state,
-            final ContentEncoder encoder,
-            final IOControl ioctrl) throws IOException {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + state.getId() + "] produce content");
-        }
-        final HttpAsyncRequestProducer requestProducer = state.getRequestProducer();
-        state.setRequestContentProduced();
-        requestProducer.produceContent(encoder, ioctrl);
-        if (encoder.isCompleted()) {
-            requestProducer.resetRequest();
-        }
-    }
-
-    @Override
-    public void requestCompleted(
-            final InternalState state,
-            final AbstractClientExchangeHandler<?> handler) {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + state.getId() + "] Request completed");
-        }
-        final HttpClientContext localContext = state.getLocalContext();
-        final HttpAsyncRequestProducer requestProducer = state.getRequestProducer();
-        requestProducer.requestCompleted(localContext);
-    }
-
-    @Override
-    public void responseReceived(
-            final HttpResponse response,
-            final InternalState state,
-            final AbstractClientExchangeHandler<?> handler) throws IOException, HttpException {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + state.getId() + "] Response received " + response.getStatusLine());
-        }
-        final HttpClientContext context = state.getLocalContext();
-        context.setAttribute(HttpCoreContext.HTTP_RESPONSE, response);
-        this.httpProcessor.process(response, context);
-
-        handler.setCurrentResponse(response);
-
-        if (!handler.isRouteEstablished()) {
-            final int status = response.getStatusLine().getStatusCode();
-            if (status < 200) {
-                throw new HttpException("Unexpected response to CONNECT request: " +
-                        response.getStatusLine());
-            }
-            if (status == HttpStatus.SC_OK) {
-                handler.onRouteTunnelToTarget();
-                handler.setCurrentRequest(null);
-            } else {
-                if (!handleConnectResponse(state, handler)) {
-                    state.setFinalResponse(response);
-                }
-            }
-        } else {
-            if (!handleResponse(state, handler)) {
-                state.setFinalResponse(response);
-            }
-        }
-        if (state.getFinalResponse() != null) {
-            final HttpAsyncResponseConsumer<?> responseConsumer = state.getResponseConsumer();
-            responseConsumer.responseReceived(response);
-        }
-    }
-
-    @Override
-    public void consumeContent(
-            final InternalState state,
-            final ContentDecoder decoder,
-            final IOControl ioctrl) throws IOException {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + state.getId() + "] Consume content");
-        }
-        if (state.getFinalResponse() != null) {
-            final HttpAsyncResponseConsumer<?> responseConsumer = state.getResponseConsumer();
-            responseConsumer.consumeContent(decoder, ioctrl);
-        } else {
-            final ByteBuffer tmpbuf = state.getTmpbuf();
-            tmpbuf.clear();
-            decoder.read(tmpbuf);
-        }
-    }
-
-    @Override
-    public void responseCompleted(
-            final InternalState state,
-            final AbstractClientExchangeHandler<?> handler) throws IOException, HttpException {
-        final HttpClientContext localContext = state.getLocalContext();
-        final HttpResponse currentResponse = handler.getCurrentResponse();
-
-        if (!handler.isRouteEstablished()) {
-            final int status = currentResponse.getStatusLine().getStatusCode();
-            if (status == HttpStatus.SC_OK) {
-                handler.setCurrentResponse(null);
-                return;
-            }
-        }
-
-        final boolean keepAlive = handler.manageConnectionPersistence();
-        if (!keepAlive) {
-            handler.releaseConnection();
-            final AuthState proxyAuthState = localContext.getProxyAuthState();
-            if (proxyAuthState.getState() == AuthProtocolState.SUCCESS
-                    && proxyAuthState.getAuthScheme() != null
-                    && proxyAuthState.getAuthScheme().isConnectionBased()) {
-                if (this.log.isDebugEnabled()) {
-                    this.log.debug("[exchange: " + state.getId() + "] Resetting proxy auth state");
-                }
-                proxyAuthState.reset();
-            }
-            final AuthState targetAuthState = localContext.getTargetAuthState();
-            if (targetAuthState.getState() == AuthProtocolState.SUCCESS
-                    && targetAuthState.getAuthScheme() != null
-                    && targetAuthState.getAuthScheme().isConnectionBased()) {
-                if (this.log.isDebugEnabled()) {
-                    this.log.debug("[exchange: " + state.getId() + "] Resetting target auth state");
-                }
-                targetAuthState.reset();
-            }
-        }
-
-        Object userToken = localContext.getUserToken();
-        if (userToken == null) {
-            userToken = this.userTokenHandler.getUserToken(localContext);
-            localContext.setAttribute(HttpClientContext.USER_TOKEN, userToken);
-        }
-
-        if (state.getFinalResponse() != null) {
-            final HttpAsyncResponseConsumer<?> responseConsumer = state.getResponseConsumer();
-            responseConsumer.responseCompleted(localContext);
-            if (this.log.isDebugEnabled()) {
-                this.log.debug("[exchange: " + state.getId() + "] Response processed");
-            }
-            handler.releaseConnection();
-        } else {
-            if (state.getRedirect() != null) {
-                final HttpUriRequest redirect = state.getRedirect();
-                final URI uri = redirect.getURI();
-                if (this.log.isDebugEnabled()) {
-                    this.log.debug("[exchange: " + state.getId() + "] Redirecting to '" + uri + "'");
-                }
-                state.setRedirect(null);
-
-                final HttpHost newTarget = URIUtils.extractHost(uri);
-                if (newTarget == null) {
-                    throw new ProtocolException("Redirect URI does not specify a valid host name: " + uri);
-                }
-
-                // Reset auth states if redirecting to another host
-                final HttpRoute route = handler.getRoute();
-                if (!route.getTargetHost().equals(newTarget)) {
-                    final AuthState targetAuthState = localContext.getTargetAuthState();
-                    if (this.log.isDebugEnabled()) {
-                        this.log.debug("[exchange: " + state.getId() + "] Resetting target auth state");
-                    }
-                    targetAuthState.reset();
-                    final AuthState proxyAuthState = localContext.getProxyAuthState();
-                    final AuthScheme authScheme = proxyAuthState.getAuthScheme();
-                    if (authScheme != null && authScheme.isConnectionBased()) {
-                        if (this.log.isDebugEnabled()) {
-                            this.log.debug("[exchange: " + state.getId() + "] Resetting proxy auth state");
-                        }
-                        proxyAuthState.reset();
-                    }
-                }
-
-                if (!redirect.headerIterator().hasNext()) {
-                    final HttpRequest original = state.getMainRequest().getOriginal();
-                    redirect.setHeaders(original.getAllHeaders());
-                }
-
-                final HttpRequestWrapper newRequest = HttpRequestWrapper.wrap(redirect);
-                final HttpRoute newRoute = this.routePlanner.determineRoute(
-                    newTarget, newRequest, localContext);
-                if (!route.equals(newRoute)) {
-                    handler.releaseConnection();
-                }
-                handler.setRoute(newRoute);
-                handler.setCurrentRequest(newRequest);
-                state.setMainRequest(newRequest);
-                prepareRequest(state, handler);
-            }
-        }
-        handler.setCurrentResponse(null);
-    }
-
-    private void rewriteRequestURI(
-            final HttpRequestWrapper request,
-            final HttpRoute route) throws ProtocolException {
-        try {
-            URI uri = request.getURI();
-            if (uri != null) {
-                if (route.getProxyHost() != null && !route.isTunnelled()) {
-                    // Make sure the request URI is absolute
-                    if (!uri.isAbsolute()) {
-                        final HttpHost target = route.getTargetHost();
-                        uri = URIUtils.rewriteURI(uri, target, true);
-                    } else {
-                        uri = URIUtils.rewriteURI(uri);
-                    }
-                } else {
-                    // Make sure the request URI is relative
-                    if (uri.isAbsolute()) {
-                        uri = URIUtils.rewriteURI(uri, null, true);
-                    } else {
-                        uri = URIUtils.rewriteURI(uri);
-                    }
-                }
-                request.setURI(uri);
-            }
-        } catch (final URISyntaxException ex) {
-            throw new ProtocolException("Invalid URI: " +
-                    request.getRequestLine().getUri(), ex);
-        }
-    }
-
-    private void prepareRequest(
-            final InternalState state,
-            final AbstractClientExchangeHandler<?> handler) throws IOException, HttpException {
-        final HttpClientContext localContext = state.getLocalContext();
-        final HttpRequestWrapper currentRequest = handler.getCurrentRequest();
-        final HttpRoute route = handler.getRoute();
-
-        final HttpRequest original = currentRequest.getOriginal();
-        URI uri = null;
-        if (original instanceof HttpUriRequest) {
-            uri = ((HttpUriRequest) original).getURI();
-        } else {
-            final String uriString = original.getRequestLine().getUri();
-            try {
-                uri = URI.create(uriString);
-            } catch (final IllegalArgumentException ex) {
-                if (this.log.isDebugEnabled()) {
-                    this.log.debug("Unable to parse '" + uriString + "' as a valid URI; " +
-                        "request URI and Host header may be inconsistent", ex);
-                }
-            }
-
-        }
-        currentRequest.setURI(uri);
-
-        // Re-write request URI if needed
-        rewriteRequestURI(currentRequest, route);
-
-        HttpHost target = null;
-        if (uri != null && uri.isAbsolute() && uri.getHost() != null) {
-            target = new HttpHost(uri.getHost(), uri.getPort(), uri.getScheme());
-        }
-        if (target == null) {
-            target = route.getTargetHost();
-        }
-
-        // Get user info from the URI
-        if (uri != null) {
-            final String userinfo = uri.getUserInfo();
-            if (userinfo != null) {
-                final CredentialsProvider credsProvider = localContext.getCredentialsProvider();
-                credsProvider.setCredentials(
-                        new AuthScope(target),
-                        new UsernamePasswordCredentials(userinfo));
-            }
-        }
-
-        localContext.setAttribute(HttpCoreContext.HTTP_REQUEST, currentRequest);
-        localContext.setAttribute(HttpCoreContext.HTTP_TARGET_HOST, target);
-        localContext.setAttribute(HttpClientContext.HTTP_ROUTE, route);
-        this.httpProcessor.process(currentRequest, localContext);
-    }
-
-    private HttpRequest createConnectRequest(
-            final HttpRoute route, final InternalState state) throws IOException, HttpException {
-        // see RFC 2817, section 5.2 and
-        // INTERNET-DRAFT: Tunneling TCP based protocols through
-        // Web proxy servers
-        final HttpHost target = route.getTargetHost();
-        final String host = target.getHostName();
-        final int port = target.getPort();
-        final StringBuilder buffer = new StringBuilder(host.length() + 6);
-        buffer.append(host);
-        buffer.append(':');
-        buffer.append(Integer.toString(port));
-        final HttpRequest request = new BasicHttpRequest("CONNECT", buffer.toString(), HttpVersion.HTTP_1_1);
-        final HttpClientContext localContext = state.getLocalContext();
-        this.proxyHttpProcessor.process(request, localContext);
-        return request;
-    }
-
-    private boolean handleConnectResponse(
-            final InternalState state,
-            final AbstractClientExchangeHandler<?> handler) throws HttpException {
-        final HttpClientContext localContext = state.getLocalContext();
-        final RequestConfig config = localContext.getRequestConfig();
-        if (config.isAuthenticationEnabled()) {
-            final CredentialsProvider credsProvider = localContext.getCredentialsProvider();
-            if (credsProvider != null) {
-                final HttpRoute route = handler.getRoute();
-                final HttpHost proxy = route.getProxyHost();
-                final HttpResponse currentResponse = handler.getCurrentResponse();
-                final AuthState proxyAuthState = localContext.getProxyAuthState();
-                if (this.authenticator.isAuthenticationRequested(proxy, currentResponse,
-                        this.proxyAuthStrategy, proxyAuthState, localContext)) {
-                    return this.authenticator.handleAuthChallenge(proxy, currentResponse,
-                            this.proxyAuthStrategy, proxyAuthState, localContext);
-                }
-            }
-        }
-        return false;
-    }
-
-    private boolean handleResponse(
-            final InternalState state,
-            final AbstractClientExchangeHandler<?> handler) throws HttpException {
-        final HttpClientContext localContext = state.getLocalContext();
-        final RequestConfig config = localContext.getRequestConfig();
-        if (config.isAuthenticationEnabled()) {
-            if (needAuthentication(state, handler)) {
-                // discard previous auth headers
-                final HttpRequestWrapper currentRequest = handler.getCurrentRequest();
-                final HttpRequest original = currentRequest.getOriginal();
-                if (!original.containsHeader(AUTH.WWW_AUTH_RESP)) {
-                    currentRequest.removeHeaders(AUTH.WWW_AUTH_RESP);
-                }
-                if (!original.containsHeader(AUTH.PROXY_AUTH_RESP)) {
-                    currentRequest.removeHeaders(AUTH.PROXY_AUTH_RESP);
-                }
-                return true;
-            }
-        }
-        if (config.isRedirectsEnabled()) {
-            final HttpRequest currentRequest = handler.getCurrentRequest();
-            final HttpResponse currentResponse = handler.getCurrentResponse();
-            if (this.redirectStrategy.isRedirected(currentRequest, currentResponse, localContext)) {
-                final int maxRedirects = config.getMaxRedirects() >= 0 ? config.getMaxRedirects() : 100;
-                if (state.getRedirectCount() >= maxRedirects) {
-                    throw new RedirectException("Maximum redirects (" + maxRedirects + ") exceeded");
-                }
-                state.incrementRedirectCount();
-                final HttpUriRequest redirect = this.redirectStrategy.getRedirect(currentRequest, currentResponse,
-                    localContext);
-                state.setRedirect(redirect);
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private boolean needAuthentication(
-            final InternalState state,
-            final AbstractClientExchangeHandler<?> handler) throws HttpException {
-        final HttpClientContext localContext = state.getLocalContext();
-        final CredentialsProvider credsProvider = localContext.getCredentialsProvider();
-        if (credsProvider != null) {
-            final HttpRoute route = handler.getRoute();
-            final HttpResponse currentResponse = handler.getCurrentResponse();
-            HttpHost target = localContext.getTargetHost();
-            if (target == null) {
-                target = route.getTargetHost();
-            }
-            if (target.getPort() < 0) {
-                target = new HttpHost(
-                        target.getHostName(),
-                        route.getTargetHost().getPort(),
-                        target.getSchemeName());
-            }
-            final AuthState targetAuthState = localContext.getTargetAuthState();
-            final AuthState proxyAuthState = localContext.getProxyAuthState();
-
-            final boolean targetAuthRequested = this.authenticator.isAuthenticationRequested(
-                    target, currentResponse, this.targetAuthStrategy, targetAuthState, localContext);
-
-            HttpHost proxy = route.getProxyHost();
-            // if proxy is not set use target host instead
-            if (proxy == null) {
-                proxy = route.getTargetHost();
-            }
-            final boolean proxyAuthRequested = this.authenticator.isAuthenticationRequested(
-                    proxy, currentResponse, this.proxyAuthStrategy, proxyAuthState, localContext);
-
-            if (targetAuthRequested) {
-                return this.authenticator.handleAuthChallenge(target, currentResponse,
-                        this.targetAuthStrategy, targetAuthState, localContext);
-            }
-            if (proxyAuthRequested) {
-                return this.authenticator.handleAuthChallenge(proxy, currentResponse,
-                        this.proxyAuthStrategy, proxyAuthState, localContext);
-            }
-        }
-        return false;
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/MinimalClientExchangeHandlerImpl.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/MinimalClientExchangeHandlerImpl.java
deleted file mode 100644
index 554a6ef..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/MinimalClientExchangeHandlerImpl.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.client;
-
-import java.io.IOException;
-
-import org.apache.commons.logging.Log;
-import org.apache.http.ConnectionReuseStrategy;
-import org.apache.http.HttpException;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.methods.Configurable;
-import org.apache.http.client.methods.HttpExecutionAware;
-import org.apache.http.client.methods.HttpRequestWrapper;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.concurrent.BasicFuture;
-import org.apache.http.conn.ConnectionKeepAliveStrategy;
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.nio.ContentDecoder;
-import org.apache.http.nio.ContentEncoder;
-import org.apache.http.nio.IOControl;
-import org.apache.http.nio.NHttpClientConnection;
-import org.apache.http.nio.conn.NHttpClientConnectionManager;
-import org.apache.http.nio.protocol.HttpAsyncRequestProducer;
-import org.apache.http.nio.protocol.HttpAsyncResponseConsumer;
-import org.apache.http.protocol.HttpCoreContext;
-import org.apache.http.protocol.HttpProcessor;
-
-/**
- * Default implementation of {@link org.apache.http.nio.protocol.HttpAsyncClientExchangeHandler}.
- * <p>
- * Instances of this class are expected to be accessed by one thread at a time only.
- * The {@link #cancel()} method can be called concurrently by multiple threads.
- */
-class MinimalClientExchangeHandlerImpl<T> extends AbstractClientExchangeHandler {
-
-    private final HttpAsyncRequestProducer requestProducer;
-    private final HttpAsyncResponseConsumer<T> responseConsumer;
-    private final HttpClientContext localContext;
-    private final BasicFuture<T> resultFuture;
-    private final HttpProcessor httpProcessor;
-
-    public MinimalClientExchangeHandlerImpl(
-            final Log log,
-            final HttpAsyncRequestProducer requestProducer,
-            final HttpAsyncResponseConsumer<T> responseConsumer,
-            final HttpClientContext localContext,
-            final BasicFuture<T> resultFuture,
-            final NHttpClientConnectionManager connmgr,
-            final HttpProcessor httpProcessor,
-            final ConnectionReuseStrategy connReuseStrategy,
-            final ConnectionKeepAliveStrategy keepaliveStrategy) {
-        super(log, localContext, resultFuture, connmgr, connReuseStrategy, keepaliveStrategy);
-        this.requestProducer = requestProducer;
-        this.responseConsumer = responseConsumer;
-        this.localContext = localContext;
-        this.resultFuture = resultFuture;
-        this.httpProcessor = httpProcessor;
-    }
-
-    @Override
-    void releaseResources() {
-        try {
-            this.requestProducer.close();
-        } catch (final IOException ex) {
-            this.log.debug("I/O error closing request producer", ex);
-        }
-        try {
-            this.responseConsumer.close();
-        } catch (final IOException ex) {
-            this.log.debug("I/O error closing response consumer", ex);
-        }
-    }
-
-    @Override
-    void executionFailed(final Exception ex) {
-        this.requestProducer.failed(ex);
-        this.responseConsumer.failed(ex);
-    }
-
-    @Override
-    boolean executionCancelled() {
-        final boolean cancelled = this.responseConsumer.cancel();
-
-        final T result = this.responseConsumer.getResult();
-        final Exception ex = this.responseConsumer.getException();
-        if (ex != null) {
-            this.resultFuture.failed(ex);
-        } else if (result != null) {
-            this.resultFuture.completed(result);
-        } else {
-            this.resultFuture.cancel();
-        }
-        return cancelled;
-    }
-
-    public void start() throws HttpException, IOException {
-        final HttpHost target = this.requestProducer.getTarget();
-        final HttpRequest original = this.requestProducer.generateRequest();
-
-        if (original instanceof HttpExecutionAware) {
-            ((HttpExecutionAware) original).setCancellable(this);
-        }
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + getId() + "] start execution");
-        }
-
-        if (original instanceof Configurable) {
-            final RequestConfig config = ((Configurable) original).getConfig();
-            if (config != null) {
-                this.localContext.setRequestConfig(config);
-            }
-        }
-
-        final HttpRequestWrapper request = HttpRequestWrapper.wrap(original);
-        final HttpRoute route = new HttpRoute(target);
-        setCurrentRequest(request);
-        setRoute(route);
-
-        this.localContext.setAttribute(HttpCoreContext.HTTP_REQUEST, request);
-        this.localContext.setAttribute(HttpCoreContext.HTTP_TARGET_HOST, target);
-        this.localContext.setAttribute(HttpClientContext.HTTP_ROUTE, route);
-
-        this.httpProcessor.process(request, this.localContext);
-
-        requestConnection();
-    }
-
-    @Override
-    public HttpRequest generateRequest() throws IOException, HttpException {
-        verifytRoute();
-        if (!isRouteEstablished()) {
-            onRouteToTarget();
-            onRouteComplete();
-        }
-
-        final NHttpClientConnection localConn = getConnection();
-        this.localContext.setAttribute(HttpCoreContext.HTTP_CONNECTION, localConn);
-        final RequestConfig config = this.localContext.getRequestConfig();
-        if (config.getSocketTimeout() > 0) {
-            localConn.setSocketTimeout(config.getSocketTimeout());
-        }
-        return getCurrentRequest();
-    }
-
-    @Override
-    public void produceContent(
-            final ContentEncoder encoder, final IOControl ioctrl) throws IOException {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + getId() + "] produce content");
-        }
-        this.requestProducer.produceContent(encoder, ioctrl);
-        if (encoder.isCompleted()) {
-            this.requestProducer.resetRequest();
-        }
-    }
-
-    @Override
-    public void requestCompleted() {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + getId() + "] Request completed");
-        }
-        this.requestProducer.requestCompleted(this.localContext);
-    }
-
-    @Override
-    public void responseReceived(
-            final HttpResponse response) throws IOException, HttpException {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + getId() + "] Response received " + response.getStatusLine());
-        }
-        this.localContext.setAttribute(HttpCoreContext.HTTP_RESPONSE, response);
-        this.httpProcessor.process(response, this.localContext);
-
-        setCurrentResponse(response);
-
-        this.responseConsumer.responseReceived(response);
-    }
-
-    @Override
-    public void consumeContent(
-            final ContentDecoder decoder, final IOControl ioctrl) throws IOException {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + getId() + "] Consume content");
-        }
-        this.responseConsumer.consumeContent(decoder, ioctrl);
-        if (!decoder.isCompleted() && this.responseConsumer.isDone()) {
-            markConnectionNonReusable();
-            try {
-                markCompleted();
-                releaseConnection();
-                this.resultFuture.cancel();
-            } finally {
-                close();
-            }
-        }
-    }
-
-    @Override
-    public void responseCompleted() throws IOException, HttpException {
-        manageConnectionPersistence();
-        this.responseConsumer.responseCompleted(this.localContext);
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + getId() + "] Response processed");
-        }
-        try {
-            markCompleted();
-            releaseConnection();
-            final T result = this.responseConsumer.getResult();
-            final Exception ex = this.responseConsumer.getException();
-            if (ex == null) {
-                this.resultFuture.completed(result);
-            } else {
-                this.resultFuture.failed(ex);
-            }
-        } finally {
-            close();
-        }
-    }
-
-    @Override
-    public void inputTerminated() {
-        close();
-    }
-
-    public void abortConnection() {
-        discardConnection();
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/MinimalHttpAsyncClient.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/MinimalHttpAsyncClient.java
deleted file mode 100644
index 4898eec..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/MinimalHttpAsyncClient.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.client;
-
-import java.util.List;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.ThreadFactory;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.http.ConnectionReuseStrategy;
-import org.apache.http.HttpHost;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.concurrent.BasicFuture;
-import org.apache.http.concurrent.FutureCallback;
-import org.apache.http.conn.ConnectionKeepAliveStrategy;
-import org.apache.http.impl.DefaultConnectionReuseStrategy;
-import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy;
-import org.apache.http.nio.NHttpClientEventHandler;
-import org.apache.http.nio.conn.NHttpClientConnectionManager;
-import org.apache.http.nio.protocol.HttpAsyncRequestExecutor;
-import org.apache.http.nio.protocol.HttpAsyncRequestProducer;
-import org.apache.http.nio.protocol.HttpAsyncResponseConsumer;
-import org.apache.http.protocol.BasicHttpContext;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.protocol.HttpProcessor;
-
-class MinimalHttpAsyncClient extends CloseableHttpAsyncClientBase {
-
-    private final Log log = LogFactory.getLog(getClass());
-
-    private final NHttpClientConnectionManager connmgr;
-    private final HttpProcessor httpProcessor;
-    private final ConnectionReuseStrategy connReuseStrategy;
-    private final ConnectionKeepAliveStrategy keepaliveStrategy;
-
-    public MinimalHttpAsyncClient(
-            final NHttpClientConnectionManager connmgr,
-            final ThreadFactory threadFactory,
-            final NHttpClientEventHandler eventHandler,
-            final HttpProcessor httpProcessor,
-            final ConnectionReuseStrategy connReuseStrategy,
-            final ConnectionKeepAliveStrategy keepaliveStrategy) {
-        super(connmgr, threadFactory, eventHandler);
-        this.connmgr = connmgr;
-        this.httpProcessor = httpProcessor;
-        this.connReuseStrategy = connReuseStrategy;
-        this.keepaliveStrategy = keepaliveStrategy;
-    }
-
-    public MinimalHttpAsyncClient(
-            final NHttpClientConnectionManager connmgr,
-            final HttpProcessor httpProcessor) {
-        this(connmgr,
-                Executors.defaultThreadFactory(),
-                new HttpAsyncRequestExecutor(),
-                httpProcessor,
-                DefaultConnectionReuseStrategy.INSTANCE,
-                DefaultConnectionKeepAliveStrategy.INSTANCE);
-    }
-
-    @Override
-    public <T> Future<T> execute(
-            final HttpAsyncRequestProducer requestProducer,
-            final HttpAsyncResponseConsumer<T> responseConsumer,
-            final HttpContext context,
-            final FutureCallback<T> callback) {
-        ensureRunning();
-        final BasicFuture<T> future = new BasicFuture<T>(callback);
-        final HttpClientContext localcontext = HttpClientContext.adapt(
-            context != null ? context : new BasicHttpContext());
-
-        @SuppressWarnings("resource")
-        final MinimalClientExchangeHandlerImpl<T> handler = new MinimalClientExchangeHandlerImpl<T>(
-            this.log,
-            requestProducer,
-            responseConsumer,
-            localcontext,
-            future,
-            this.connmgr,
-            this.httpProcessor,
-            this.connReuseStrategy,
-            this.keepaliveStrategy);
-        try {
-            handler.start();
-        } catch (final Exception ex) {
-            handler.failed(ex);
-        }
-        return future;
-    }
-
-    @Override
-    public <T> Future<List<T>> execute(
-            final HttpHost target,
-            final List<? extends HttpAsyncRequestProducer> requestProducers,
-            final List<? extends HttpAsyncResponseConsumer<T>> responseConsumers,
-            final HttpContext context,
-            final FutureCallback<List<T>> callback) {
-        ensureRunning();
-        final BasicFuture<List<T>> future = new BasicFuture<List<T>>(callback);
-        final HttpClientContext localcontext = HttpClientContext.adapt(
-                context != null ? context : new BasicHttpContext());
-        @SuppressWarnings("resource")
-        final PipeliningClientExchangeHandlerImpl<T> handler = new PipeliningClientExchangeHandlerImpl<T>(
-                this.log,
-                target,
-                requestProducers,
-                responseConsumers,
-                localcontext,
-                future,
-                this.connmgr,
-                this.httpProcessor,
-                this.connReuseStrategy,
-                this.keepaliveStrategy);
-        try {
-            handler.start();
-        } catch (final Exception ex) {
-            handler.failed(ex);
-        }
-        return future;
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/MinimalHttpAsyncClientBuilder.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/MinimalHttpAsyncClientBuilder.java
deleted file mode 100644
index a865dc7..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/MinimalHttpAsyncClientBuilder.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.http.impl.nio.client;
-
-import java.util.concurrent.Executors;
-import java.util.concurrent.ThreadFactory;
-
-import org.apache.http.ConnectionReuseStrategy;
-import org.apache.http.annotation.NotThreadSafe;
-import org.apache.http.client.protocol.RequestAddCookies;
-import org.apache.http.client.protocol.RequestClientConnControl;
-import org.apache.http.client.protocol.ResponseProcessCookies;
-import org.apache.http.conn.ConnectionKeepAliveStrategy;
-import org.apache.http.impl.DefaultConnectionReuseStrategy;
-import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy;
-import org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager;
-import org.apache.http.impl.nio.reactor.IOReactorConfig;
-import org.apache.http.nio.NHttpClientEventHandler;
-import org.apache.http.nio.conn.NHttpClientConnectionManager;
-import org.apache.http.nio.protocol.HttpAsyncRequestExecutor;
-import org.apache.http.protocol.HttpProcessor;
-import org.apache.http.protocol.HttpProcessorBuilder;
-import org.apache.http.protocol.RequestContent;
-import org.apache.http.protocol.RequestTargetHost;
-import org.apache.http.protocol.RequestUserAgent;
-import org.apache.http.util.VersionInfo;
-
-/**
- * Builder for {@link org.apache.http.impl.nio.client.MinimalHttpAsyncClient} instances.
- *
- * @since 4.1
- */
-@NotThreadSafe
-class MinimalHttpAsyncClientBuilder {
-
-    private NHttpClientConnectionManager connManager;
-    private boolean connManagerShared;
-    private ConnectionReuseStrategy reuseStrategy;
-    private ConnectionKeepAliveStrategy keepAliveStrategy;
-    private String userAgent;
-    private ThreadFactory threadFactory;
-    private boolean cookieManagementDisabled;
-
-    public static MinimalHttpAsyncClientBuilder create() {
-        return new MinimalHttpAsyncClientBuilder();
-    }
-
-    protected MinimalHttpAsyncClientBuilder() {
-        super();
-    }
-
-    public final MinimalHttpAsyncClientBuilder setConnectionManager(
-            final NHttpClientConnectionManager connManager) {
-        this.connManager = connManager;
-        return this;
-    }
-
-    public final MinimalHttpAsyncClientBuilder setConnectionManagerShared(
-            final boolean shared) {
-        this.connManagerShared = shared;
-        return this;
-    }
-
-    public final MinimalHttpAsyncClientBuilder setConnectionReuseStrategy(
-            final ConnectionReuseStrategy reuseStrategy) {
-        this.reuseStrategy = reuseStrategy;
-        return this;
-    }
-
-    public final MinimalHttpAsyncClientBuilder setKeepAliveStrategy(
-            final ConnectionKeepAliveStrategy keepAliveStrategy) {
-        this.keepAliveStrategy = keepAliveStrategy;
-        return this;
-    }
-
-    public final MinimalHttpAsyncClientBuilder setUserAgent(final String userAgent) {
-        this.userAgent = userAgent;
-        return this;
-    }
-
-    public final MinimalHttpAsyncClientBuilder setThreadFactory(final ThreadFactory threadFactory) {
-        this.threadFactory = threadFactory;
-        return this;
-    }
-
-    public final MinimalHttpAsyncClientBuilder disableCookieManagement() {
-        cookieManagementDisabled = true;
-        return this;
-    }
-
-    public MinimalHttpAsyncClient build() {
-
-        NHttpClientConnectionManager connManager = this.connManager;
-        if (connManager == null) {
-            connManager = new PoolingNHttpClientConnectionManager(
-                    IOReactorUtils.create(IOReactorConfig.DEFAULT));
-        }
-        ConnectionReuseStrategy reuseStrategy = this.reuseStrategy;
-        if (reuseStrategy == null) {
-            reuseStrategy = DefaultConnectionReuseStrategy.INSTANCE;
-        }
-        ConnectionKeepAliveStrategy keepAliveStrategy = this.keepAliveStrategy;
-        if (keepAliveStrategy == null) {
-            keepAliveStrategy = DefaultConnectionKeepAliveStrategy.INSTANCE;
-        }
-        String userAgent = this.userAgent;
-        if (userAgent == null) {
-            userAgent = VersionInfo.getUserAgent(
-                    "Apache-HttpAsyncClient", "org.apache.http.nio.client", getClass());
-        }
-        final HttpProcessorBuilder b = HttpProcessorBuilder.create();
-        b.addAll(
-                new RequestContent(),
-                new RequestTargetHost(),
-                new RequestClientConnControl(),
-                new RequestUserAgent(userAgent));
-        if (!cookieManagementDisabled) {
-            b.add(new RequestAddCookies());
-            b.add(new ResponseProcessCookies());
-        }
-        final HttpProcessor httpprocessor = b.build();
-
-        ThreadFactory threadFactory = null;
-        NHttpClientEventHandler eventHandler = null;
-        if (!this.connManagerShared) {
-            threadFactory = this.threadFactory;
-            if (threadFactory == null) {
-                threadFactory = Executors.defaultThreadFactory();
-            }
-            eventHandler = new HttpAsyncRequestExecutor();
-        }
-        return new MinimalHttpAsyncClient(
-            connManager,
-            threadFactory,
-            eventHandler,
-            httpprocessor,
-            reuseStrategy,
-            keepAliveStrategy);
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/PipeliningClientExchangeHandlerImpl.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/PipeliningClientExchangeHandlerImpl.java
deleted file mode 100644
index 19027ba..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/PipeliningClientExchangeHandlerImpl.java
+++ /dev/null
@@ -1,338 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.client;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Queue;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.apache.commons.logging.Log;
-import org.apache.http.ConnectionClosedException;
-import org.apache.http.ConnectionReuseStrategy;
-import org.apache.http.HttpException;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.methods.HttpRequestWrapper;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.concurrent.BasicFuture;
-import org.apache.http.conn.ConnectionKeepAliveStrategy;
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.nio.ContentDecoder;
-import org.apache.http.nio.ContentEncoder;
-import org.apache.http.nio.IOControl;
-import org.apache.http.nio.NHttpClientConnection;
-import org.apache.http.nio.conn.NHttpClientConnectionManager;
-import org.apache.http.nio.protocol.HttpAsyncRequestProducer;
-import org.apache.http.nio.protocol.HttpAsyncResponseConsumer;
-import org.apache.http.nio.protocol.Pipelined;
-import org.apache.http.protocol.HttpCoreContext;
-import org.apache.http.protocol.HttpProcessor;
-import org.apache.http.util.Args;
-import org.apache.http.util.Asserts;
-
-/**
- * {@link org.apache.http.nio.protocol.HttpAsyncClientExchangeHandler} implementation
- * that supports HTTP message pipelining.
- * <p>
- * Instances of this class are expected to be accessed by one thread at a time only.
- * The {@link #cancel()} method can be called concurrently by multiple threads.
- */
-@Pipelined
-class PipeliningClientExchangeHandlerImpl<T> extends AbstractClientExchangeHandler {
-
-    private final HttpHost target;
-    private final Queue<HttpAsyncRequestProducer> requestProducerQueue;
-    private final Queue<HttpAsyncResponseConsumer<T>> responseConsumerQueue;
-    private final Queue<HttpRequest> requestQueue;
-    private final Queue<T> resultQueue;
-    private final HttpClientContext localContext;
-    private final BasicFuture<List<T>> resultFuture;
-    private final HttpProcessor httpProcessor;
-    private final AtomicReference<HttpAsyncRequestProducer> requestProducerRef;
-    private final AtomicReference<HttpAsyncResponseConsumer<T>> responseConsumerRef;
-
-    public PipeliningClientExchangeHandlerImpl(
-            final Log log,
-            final HttpHost target,
-            final List<? extends HttpAsyncRequestProducer> requestProducers,
-            final List<? extends HttpAsyncResponseConsumer<T>> responseConsumers,
-            final HttpClientContext localContext,
-            final BasicFuture<List<T>> resultFuture,
-            final NHttpClientConnectionManager connmgr,
-            final HttpProcessor httpProcessor,
-            final ConnectionReuseStrategy connReuseStrategy,
-            final ConnectionKeepAliveStrategy keepaliveStrategy) {
-        super(log, localContext, resultFuture, connmgr, connReuseStrategy, keepaliveStrategy);
-        Args.notNull(target, "HTTP target");
-        Args.notEmpty(requestProducers, "Request producer list");
-        Args.notEmpty(responseConsumers, "Response consumer list");
-        Args.check(requestProducers.size() == responseConsumers.size(),
-                "Number of request producers does not match that of response consumers");
-        this.target = target;
-        this.requestProducerQueue = new ConcurrentLinkedQueue<HttpAsyncRequestProducer>(requestProducers);
-        this.responseConsumerQueue = new ConcurrentLinkedQueue<HttpAsyncResponseConsumer<T>>(responseConsumers);
-        this.requestQueue = new ConcurrentLinkedQueue<HttpRequest>();
-        this.resultQueue = new ConcurrentLinkedQueue<T>();
-        this.localContext = localContext;
-        this.resultFuture = resultFuture;
-        this.httpProcessor = httpProcessor;
-        this.requestProducerRef = new AtomicReference<HttpAsyncRequestProducer>(null);
-        this.responseConsumerRef = new AtomicReference<HttpAsyncResponseConsumer<T>>(null);
-    }
-
-    private void closeProducer(final HttpAsyncRequestProducer requestProducer) {
-        if (requestProducer != null) {
-            try {
-                requestProducer.close();
-            } catch (final IOException ex) {
-                this.log.debug("I/O error closing request producer", ex);
-            }
-        }
-    }
-
-    private void closeConsumer(final HttpAsyncResponseConsumer<?> responseConsumer) {
-        if (responseConsumer != null) {
-            try {
-                responseConsumer.close();
-            } catch (final IOException ex) {
-                this.log.debug("I/O error closing response consumer", ex);
-            }
-        }
-    }
-
-    @Override
-    void releaseResources() {
-        closeProducer(this.requestProducerRef.getAndSet(null));
-        closeConsumer(this.responseConsumerRef.getAndSet(null));
-        while (!this.requestProducerQueue.isEmpty()) {
-            closeProducer(this.requestProducerQueue.remove());
-        }
-        while (!this.responseConsumerQueue.isEmpty()) {
-            closeConsumer(this.responseConsumerQueue.remove());
-        }
-        this.requestQueue.clear();
-        this.resultQueue.clear();
-    }
-
-    @Override
-    void executionFailed(final Exception ex) {
-        final HttpAsyncRequestProducer requestProducer = this.requestProducerRef.get();
-        if (requestProducer != null) {
-            requestProducer.failed(ex);
-        }
-        final HttpAsyncResponseConsumer<T> responseConsumer = this.responseConsumerRef.get();
-        if (responseConsumer != null) {
-            responseConsumer.failed(ex);
-        }
-        for (final HttpAsyncResponseConsumer<T> cancellable: this.responseConsumerQueue) {
-            cancellable.cancel();
-        }
-    }
-
-    @Override
-    boolean executionCancelled() {
-        final HttpAsyncResponseConsumer<T> responseConsumer = this.responseConsumerRef.get();
-        final boolean cancelled = responseConsumer != null && responseConsumer.cancel();
-        this.resultFuture.cancel();
-        return cancelled;
-    }
-
-    public void start() throws HttpException, IOException {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + getId() + "] start execution");
-        }
-
-        final HttpRoute route = new HttpRoute(this.target);
-        setRoute(route);
-
-        this.localContext.setAttribute(HttpCoreContext.HTTP_TARGET_HOST, this.target);
-        this.localContext.setAttribute(HttpClientContext.HTTP_ROUTE, route);
-
-        requestConnection();
-    }
-
-    @Override
-    public HttpRequest generateRequest() throws IOException, HttpException {
-        verifytRoute();
-        if (!isRouteEstablished()) {
-            onRouteToTarget();
-            onRouteComplete();
-        }
-        final NHttpClientConnection localConn = getConnection();
-        this.localContext.setAttribute(HttpCoreContext.HTTP_CONNECTION, localConn);
-
-        Asserts.check(this.requestProducerRef.get() == null, "Inconsistent state: currentRequest producer is not null");
-        final HttpAsyncRequestProducer requestProducer = this.requestProducerQueue.poll();
-        if (requestProducer == null) {
-            return null;
-        }
-        this.requestProducerRef.set(requestProducer);
-
-        final HttpRequest original = requestProducer.generateRequest();
-        final HttpRequestWrapper currentRequest = HttpRequestWrapper.wrap(original);
-        final RequestConfig config = this.localContext.getRequestConfig();
-        if (config.getSocketTimeout() > 0) {
-            localConn.setSocketTimeout(config.getSocketTimeout());
-        }
-
-        this.httpProcessor.process(currentRequest, this.localContext);
-
-        this.requestQueue.add(currentRequest);
-        setCurrentRequest(currentRequest);
-
-        return currentRequest;
-    }
-
-    @Override
-    public void produceContent(
-            final ContentEncoder encoder, final IOControl ioctrl) throws IOException {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + getId() + "] produce content");
-        }
-        final HttpAsyncRequestProducer requestProducer = this.requestProducerRef.get();
-        Asserts.check(requestProducer != null, "Inconsistent state: request producer is null");
-        requestProducer.produceContent(encoder, ioctrl);
-        if (encoder.isCompleted()) {
-            requestProducer.resetRequest();
-        }
-    }
-
-    @Override
-    public void requestCompleted() {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + getId() + "] Request completed");
-        }
-        final HttpAsyncRequestProducer requestProducer = this.requestProducerRef.getAndSet(null);
-        Asserts.check(requestProducer != null, "Inconsistent state: request producer is null");
-        requestProducer.requestCompleted(this.localContext);
-        try {
-            requestProducer.close();
-        } catch (final IOException ioex) {
-            this.log.debug(ioex.getMessage(), ioex);
-        }
-    }
-
-    @Override
-    public void responseReceived(
-            final HttpResponse response) throws IOException, HttpException {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + getId() + "] Response received " + response.getStatusLine());
-        }
-
-        Asserts.check(this.responseConsumerRef.get() == null, "Inconsistent state: response consumer is not null");
-
-        final HttpAsyncResponseConsumer<T> responseConsumer = this.responseConsumerQueue.poll();
-        Asserts.check(responseConsumer != null, "Inconsistent state: response consumer queue is empty");
-        this.responseConsumerRef.set(responseConsumer);
-
-        final HttpRequest request = this.requestQueue.poll();
-        Asserts.check(request != null, "Inconsistent state: request queue is empty");
-
-        this.localContext.setAttribute(HttpCoreContext.HTTP_REQUEST, request);
-        this.localContext.setAttribute(HttpCoreContext.HTTP_RESPONSE, response);
-        this.httpProcessor.process(response, this.localContext);
-
-        responseConsumer.responseReceived(response);
-
-        setCurrentResponse(response);
-    }
-
-    @Override
-    public void consumeContent(
-            final ContentDecoder decoder, final IOControl ioctrl) throws IOException {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + getId() + "] Consume content");
-        }
-        final HttpAsyncResponseConsumer<T> responseConsumer = this.responseConsumerRef.get();
-        Asserts.check(responseConsumer != null, "Inconsistent state: response consumer is null");
-        responseConsumer.consumeContent(decoder, ioctrl);
-    }
-
-    @Override
-    public void responseCompleted() throws IOException, HttpException {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("[exchange: " + getId() + "] Response processed");
-        }
-
-        final boolean keepAlive = manageConnectionPersistence();
-
-        final HttpAsyncResponseConsumer<T> responseConsumer = this.responseConsumerRef.getAndSet(null);
-        Asserts.check(responseConsumer != null, "Inconsistent state: response consumer is null");
-        try {
-            responseConsumer.responseCompleted(this.localContext);
-            final T result = responseConsumer.getResult();
-            final Exception ex = responseConsumer.getException();
-            try {
-                responseConsumer.close();
-            } catch (final IOException ioex) {
-                this.log.debug(ioex.getMessage(), ioex);
-            }
-            if (result != null) {
-                this.resultQueue.add(result);
-            } else {
-                failed(ex);
-            }
-            if (!this.resultFuture.isDone() && this.responseConsumerQueue.isEmpty()) {
-                this.resultFuture.completed(new ArrayList<T>(this.resultQueue));
-                this.resultQueue.clear();
-            }
-
-            if (this.resultFuture.isDone()) {
-                close();
-            } else {
-                if (!keepAlive) {
-                    failed(new ConnectionClosedException("Connection closed"));
-                } else {
-                    final NHttpClientConnection localConn = getConnection();
-                    if (localConn != null) {
-                        localConn.requestOutput();
-                    } else {
-                        requestConnection();
-                    }
-                }
-            }
-        } catch (final RuntimeException ex) {
-            failed(ex);
-            throw ex;
-        }
-    }
-
-    @Override
-    public void inputTerminated() {
-        failed(new ConnectionClosedException("Connection closed"));
-    }
-
-    public void abortConnection() {
-        discardConnection();
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/package-info.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/package-info.java
deleted file mode 100644
index 10110e7..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/client/package-info.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-/**
- * Default asynchronous HTTP client implementation.
- * <p>
- * The usual execution flow can be demonstrated by the code snippet below:
- * <pre>
- * CloseableHttpAsyncClient httpclient = HttpAsyncClients.createDefault();
- * try {
- *     httpclient.start();
- *     HttpGet request = new HttpGet("http://www.apache.org/");
- *     Future<HttpResponse> future = httpclient.execute(request, null);
- *     HttpResponse response = future.get();
- *     System.out.println(response.getStatusLine());
- *     // Do something useful with the response body
- * } finally {
- *     httpclient.close();
- * }
- * </pre>
- */
-package org.apache.http.impl.nio.client;
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPool.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPool.java
deleted file mode 100644
index eaa1e18..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPool.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.conn;
-
-import java.util.concurrent.TimeUnit;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.http.annotation.ThreadSafe;
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.nio.NHttpClientConnection;
-import org.apache.http.nio.conn.ManagedNHttpClientConnection;
-import org.apache.http.nio.pool.AbstractNIOConnPool;
-import org.apache.http.nio.pool.NIOConnFactory;
-import org.apache.http.nio.pool.SocketAddressResolver;
-import org.apache.http.nio.reactor.ConnectingIOReactor;
-
-@ThreadSafe
-class CPool extends AbstractNIOConnPool<HttpRoute, ManagedNHttpClientConnection, CPoolEntry> {
-
-    private final Log log = LogFactory.getLog(CPool.class);
-
-    private final long timeToLive;
-    private final TimeUnit tunit;
-
-    public CPool(
-            final ConnectingIOReactor ioreactor,
-            final NIOConnFactory<HttpRoute, ManagedNHttpClientConnection> connFactory,
-            final SocketAddressResolver<HttpRoute> addressResolver,
-            final int defaultMaxPerRoute, final int maxTotal,
-            final long timeToLive, final TimeUnit tunit) {
-        super(ioreactor, connFactory, addressResolver, defaultMaxPerRoute, maxTotal);
-        this.timeToLive = timeToLive;
-        this.tunit = tunit;
-    }
-
-    @Override
-    protected CPoolEntry createEntry(final HttpRoute route, final ManagedNHttpClientConnection conn) {
-        final CPoolEntry entry =  new CPoolEntry(this.log, conn.getId(), route, conn, this.timeToLive, this.tunit);
-        entry.setSocketTimeout(conn.getSocketTimeout());
-        return entry;
-    }
-
-    @Override
-    protected void onLease(final CPoolEntry entry) {
-        final NHttpClientConnection conn = entry.getConnection();
-        conn.setSocketTimeout(entry.getSocketTimeout());
-    }
-
-    @Override
-    protected void onRelease(final CPoolEntry entry) {
-        final NHttpClientConnection conn = entry.getConnection();
-        entry.setSocketTimeout(conn.getSocketTimeout());
-        conn.setSocketTimeout(0);
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolEntry.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolEntry.java
deleted file mode 100644
index ffe7286..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolEntry.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.conn;
-
-import java.io.IOException;
-import java.util.Date;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.commons.logging.Log;
-import org.apache.http.annotation.ThreadSafe;
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.nio.conn.ManagedNHttpClientConnection;
-import org.apache.http.pool.PoolEntry;
-
-@ThreadSafe
-class CPoolEntry extends PoolEntry<HttpRoute, ManagedNHttpClientConnection> {
-
-    private final Log log;
-    private volatile int socketTimeout;
-    private volatile boolean routeComplete;
-
-    public CPoolEntry(
-            final Log log,
-            final String id,
-            final HttpRoute route,
-            final ManagedNHttpClientConnection conn,
-            final long timeToLive, final TimeUnit tunit) {
-        super(id, route, conn, timeToLive, tunit);
-        this.log = log;
-    }
-
-    public boolean isRouteComplete() {
-        return this.routeComplete;
-    }
-
-    public void markRouteComplete() {
-        this.routeComplete = true;
-    }
-
-    public int getSocketTimeout() {
-        return this.socketTimeout;
-    }
-
-    public void setSocketTimeout(final int socketTimeout) {
-        this.socketTimeout = socketTimeout;
-    }
-
-    public void closeConnection() throws IOException {
-        final ManagedNHttpClientConnection conn = getConnection();
-        conn.close();
-    }
-
-    public void shutdownConnection() throws IOException {
-        final ManagedNHttpClientConnection conn = getConnection();
-        conn.shutdown();
-    }
-
-    @Override
-    public boolean isExpired(final long now) {
-        final boolean expired = super.isExpired(now);
-        if (expired && this.log.isDebugEnabled()) {
-            this.log.debug("Connection " + this + " expired @ " + new Date(getExpiry()));
-        }
-        return expired;
-    }
-
-    @Override
-    public boolean isClosed() {
-        final ManagedNHttpClientConnection conn = getConnection();
-        return !conn.isOpen();
-    }
-
-    @Override
-    public void close() {
-        try {
-            closeConnection();
-        } catch (final IOException ex) {
-            this.log.debug("I/O error closing connection", ex);
-        }
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolProxy.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolProxy.java
deleted file mode 100644
index 485d67d..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolProxy.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.conn;
-
-import java.io.IOException;
-import java.net.InetAddress;
-
-import javax.net.ssl.SSLSession;
-
-import org.apache.http.HttpConnectionMetrics;
-import org.apache.http.HttpException;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.annotation.NotThreadSafe;
-import org.apache.http.impl.conn.ConnectionShutdownException;
-import org.apache.http.nio.NHttpClientConnection;
-import org.apache.http.nio.conn.ManagedNHttpClientConnection;
-import org.apache.http.nio.reactor.IOSession;
-import org.apache.http.protocol.HttpContext;
-
-@NotThreadSafe
-class CPoolProxy implements ManagedNHttpClientConnection {
-
-    private volatile CPoolEntry poolEntry;
-
-    CPoolProxy(final CPoolEntry entry) {
-        super();
-        this.poolEntry = entry;
-    }
-
-    CPoolEntry getPoolEntry() {
-        return this.poolEntry;
-    }
-
-    CPoolEntry detach() {
-        final CPoolEntry local = this.poolEntry;
-        this.poolEntry = null;
-        return local;
-    }
-
-    ManagedNHttpClientConnection getConnection() {
-        final CPoolEntry local = this.poolEntry;
-        if (local == null) {
-            return null;
-        }
-        return local.getConnection();
-    }
-
-    ManagedNHttpClientConnection getValidConnection() {
-        final ManagedNHttpClientConnection conn = getConnection();
-        if (conn == null) {
-            throw new ConnectionShutdownException();
-        }
-        return conn;
-    }
-
-    @Override
-    public void close() throws IOException {
-        final CPoolEntry local = this.poolEntry;
-        if (local != null) {
-            local.closeConnection();
-        }
-    }
-
-    @Override
-    public void shutdown() throws IOException {
-        final CPoolEntry local = this.poolEntry;
-        if (local != null) {
-            local.shutdownConnection();
-        }
-    }
-
-    @Override
-    public HttpConnectionMetrics getMetrics() {
-        return getValidConnection().getMetrics();
-    }
-
-    @Override
-    public void requestInput() {
-        final NHttpClientConnection conn = getConnection();
-        if (conn != null) {
-            conn.requestInput();
-        }
-    }
-
-    @Override
-    public void suspendInput() {
-        final NHttpClientConnection conn = getConnection();
-        if (conn != null) {
-            conn.suspendInput();
-        }
-    }
-
-    @Override
-    public void requestOutput() {
-        final NHttpClientConnection conn = getConnection();
-        if (conn != null) {
-            conn.requestOutput();
-        }
-    }
-
-    @Override
-    public void suspendOutput() {
-        final NHttpClientConnection conn = getConnection();
-        if (conn != null) {
-            conn.suspendOutput();
-        }
-    }
-
-    @Override
-    public InetAddress getLocalAddress() {
-        return getValidConnection().getLocalAddress();
-    }
-
-    @Override
-    public int getLocalPort() {
-        return getValidConnection().getLocalPort();
-    }
-
-    @Override
-    public InetAddress getRemoteAddress() {
-        return getValidConnection().getRemoteAddress();
-    }
-
-    @Override
-    public int getRemotePort() {
-        return getValidConnection().getRemotePort();
-    }
-
-    @Override
-    public boolean isOpen() {
-        final CPoolEntry local = this.poolEntry;
-        if (local != null) {
-            return !local.isClosed();
-        }
-        return false;
-    }
-
-    @Override
-    public boolean isStale() {
-        final NHttpClientConnection conn = getConnection();
-        if (conn != null) {
-            return !conn.isOpen();
-        }
-        return false;
-    }
-
-    @Override
-    public void setSocketTimeout(final int i) {
-        getValidConnection().setSocketTimeout(i);
-    }
-
-    @Override
-    public int getSocketTimeout() {
-        return getValidConnection().getSocketTimeout();
-    }
-
-    @Override
-    public void submitRequest(final HttpRequest request) throws IOException, HttpException {
-        getValidConnection().submitRequest(request);
-    }
-
-    @Override
-    public boolean isRequestSubmitted() {
-        return getValidConnection().isRequestSubmitted();
-    }
-
-    @Override
-    public void resetOutput() {
-        getValidConnection().resetOutput();
-    }
-
-    @Override
-    public void resetInput() {
-        getValidConnection().resetInput();
-    }
-
-    @Override
-    public int getStatus() {
-        return getValidConnection().getStatus();
-    }
-
-    @Override
-    public HttpRequest getHttpRequest() {
-        return getValidConnection().getHttpRequest();
-    }
-
-    @Override
-    public HttpResponse getHttpResponse() {
-        return getValidConnection().getHttpResponse();
-    }
-
-    @Override
-    public HttpContext getContext() {
-        return getValidConnection().getContext();
-    }
-
-    public static NHttpClientConnection newProxy(final CPoolEntry poolEntry) {
-        return new CPoolProxy(poolEntry);
-    }
-
-    private static CPoolProxy getProxy(final NHttpClientConnection conn) {
-        if (!CPoolProxy.class.isInstance(conn)) {
-            throw new IllegalStateException("Unexpected connection proxy class: " + conn.getClass());
-        }
-        return CPoolProxy.class.cast(conn);
-    }
-
-    public static CPoolEntry getPoolEntry(final NHttpClientConnection proxy) {
-        final CPoolEntry entry = getProxy(proxy).getPoolEntry();
-        if (entry == null) {
-            throw new ConnectionShutdownException();
-        }
-        return entry;
-    }
-
-    public static CPoolEntry detach(final NHttpClientConnection proxy) {
-        return getProxy(proxy).detach();
-    }
-
-    @Override
-    public String getId() {
-        return getValidConnection().getId();
-    }
-
-    @Override
-    public void bind(final IOSession iosession) {
-        getValidConnection().bind(iosession);
-    }
-
-    @Override
-    public IOSession getIOSession() {
-        return getValidConnection().getIOSession();
-    }
-
-    @Override
-    public SSLSession getSSLSession() {
-        return getValidConnection().getSSLSession();
-    }
-
-    @Override
-    public String toString() {
-        final StringBuilder sb = new StringBuilder("CPoolProxy{");
-        final ManagedNHttpClientConnection conn = getConnection();
-        if (conn != null) {
-            sb.append(conn);
-        } else {
-            sb.append("detached");
-        }
-        sb.append('}');
-        return sb.toString();
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/LoggingIOSession.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/LoggingIOSession.java
deleted file mode 100644
index 57db166..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/LoggingIOSession.java
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.http.impl.nio.conn;
-
-import java.io.IOException;
-import java.net.SocketAddress;
-import java.nio.ByteBuffer;
-import java.nio.channels.ByteChannel;
-import java.nio.channels.SelectionKey;
-
-import org.apache.commons.logging.Log;
-import org.apache.http.nio.reactor.IOSession;
-import org.apache.http.nio.reactor.SessionBufferStatus;
-
-class LoggingIOSession implements IOSession {
-
-    private final IOSession session;
-    private final ByteChannel channel;
-    private final String id;
-    private final Log log;
-    private final Wire wirelog;
-
-    public LoggingIOSession(final IOSession session, final String id, final Log log, final Log wirelog) {
-        super();
-        this.session = session;
-        this.channel = new LoggingByteChannel();
-        this.id = id;
-        this.log = log;
-        this.wirelog = new Wire(wirelog, this.id);
-    }
-
-    @Override
-    public ByteChannel channel() {
-        return this.channel;
-    }
-
-    @Override
-    public SocketAddress getLocalAddress() {
-        return this.session.getLocalAddress();
-    }
-
-    @Override
-    public SocketAddress getRemoteAddress() {
-        return this.session.getRemoteAddress();
-    }
-
-    @Override
-    public int getEventMask() {
-        return this.session.getEventMask();
-    }
-
-    private static String formatOps(final int ops) {
-        final StringBuilder buffer = new StringBuilder(6);
-        buffer.append('[');
-        if ((ops & SelectionKey.OP_READ) > 0) {
-            buffer.append('r');
-        }
-        if ((ops & SelectionKey.OP_WRITE) > 0) {
-            buffer.append('w');
-        }
-        if ((ops & SelectionKey.OP_ACCEPT) > 0) {
-            buffer.append('a');
-        }
-        if ((ops & SelectionKey.OP_CONNECT) > 0) {
-            buffer.append('c');
-        }
-        buffer.append(']');
-        return buffer.toString();
-    }
-
-    @Override
-    public void setEventMask(final int ops) {
-        this.session.setEventMask(ops);
-        if (this.log.isDebugEnabled()) {
-            this.log.debug(this.id + " " + this.session + ": Event mask set " + formatOps(ops));
-        }
-    }
-
-    @Override
-    public void setEvent(final int op) {
-        this.session.setEvent(op);
-        if (this.log.isDebugEnabled()) {
-            this.log.debug(this.id + " " + this.session + ": Event set " + formatOps(op));
-        }
-    }
-
-    @Override
-    public void clearEvent(final int op) {
-        this.session.clearEvent(op);
-        if (this.log.isDebugEnabled()) {
-            this.log.debug(this.id + " " + this.session + ": Event cleared " + formatOps(op));
-        }
-    }
-
-    @Override
-    public void close() {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug(this.id + " " + this.session + ": Close");
-        }
-        this.session.close();
-    }
-
-    @Override
-    public int getStatus() {
-        return this.session.getStatus();
-    }
-
-    @Override
-    public boolean isClosed() {
-        return this.session.isClosed();
-    }
-
-    @Override
-    public void shutdown() {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug(this.id + " " + this.session + ": Shutdown");
-        }
-        this.session.shutdown();
-    }
-
-    @Override
-    public int getSocketTimeout() {
-        return this.session.getSocketTimeout();
-    }
-
-    @Override
-    public void setSocketTimeout(final int timeout) {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug(this.id + " " + this.session + ": Set timeout " + timeout);
-        }
-        this.session.setSocketTimeout(timeout);
-    }
-
-    @Override
-    public void setBufferStatus(final SessionBufferStatus status) {
-        this.session.setBufferStatus(status);
-    }
-
-    @Override
-    public boolean hasBufferedInput() {
-        return this.session.hasBufferedInput();
-    }
-
-    @Override
-    public boolean hasBufferedOutput() {
-        return this.session.hasBufferedOutput();
-    }
-
-    @Override
-    public Object getAttribute(final String name) {
-        return this.session.getAttribute(name);
-    }
-
-    @Override
-    public void setAttribute(final String name, final Object obj) {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug(this.id + " " + this.session + ": Set attribute " + name);
-        }
-        this.session.setAttribute(name, obj);
-    }
-
-    @Override
-    public Object removeAttribute(final String name) {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug(this.id + " " + this.session + ": Remove attribute " + name);
-        }
-        return this.session.removeAttribute(name);
-    }
-
-    @Override
-    public String toString() {
-        return this.id + " " + this.session.toString();
-    }
-
-    class LoggingByteChannel implements ByteChannel {
-
-        @Override
-        public int read(final ByteBuffer dst) throws IOException {
-            final int bytesRead = session.channel().read(dst);
-            if (log.isDebugEnabled()) {
-                log.debug(id + " " + session + ": " + bytesRead + " bytes read");
-            }
-            if (bytesRead > 0 && wirelog.isEnabled()) {
-                final ByteBuffer b = dst.duplicate();
-                final int p = b.position();
-                b.limit(p);
-                b.position(p - bytesRead);
-                wirelog.input(b);
-            }
-            return bytesRead;
-        }
-
-        @Override
-        public int write(final ByteBuffer src) throws IOException {
-            final int byteWritten = session.channel().write(src);
-            if (log.isDebugEnabled()) {
-                log.debug(id + " " + session + ": " + byteWritten + " bytes written");
-            }
-            if (byteWritten > 0 && wirelog.isEnabled()) {
-                final ByteBuffer b = src.duplicate();
-                final int p = b.position();
-                b.limit(p);
-                b.position(p - byteWritten);
-                wirelog.output(b);
-            }
-            return byteWritten;
-        }
-
-        @Override
-        public void close() throws IOException {
-            if (log.isDebugEnabled()) {
-                log.debug(id + " " + session + ": Channel close");
-            }
-            session.channel().close();
-        }
-
-        @Override
-        public boolean isOpen() {
-            return session.channel().isOpen();
-        }
-
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionFactory.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionFactory.java
deleted file mode 100644
index 83d0738..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionFactory.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.conn;
-
-import java.nio.charset.Charset;
-import java.nio.charset.CharsetDecoder;
-import java.nio.charset.CharsetEncoder;
-import java.nio.charset.CodingErrorAction;
-import java.util.concurrent.atomic.AtomicLong;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.config.ConnectionConfig;
-import org.apache.http.impl.nio.codecs.DefaultHttpRequestWriterFactory;
-import org.apache.http.impl.nio.codecs.DefaultHttpResponseParserFactory;
-import org.apache.http.nio.NHttpMessageParserFactory;
-import org.apache.http.nio.NHttpMessageWriterFactory;
-import org.apache.http.nio.conn.ManagedNHttpClientConnection;
-import org.apache.http.nio.conn.NHttpConnectionFactory;
-import org.apache.http.nio.reactor.IOEventDispatch;
-import org.apache.http.nio.reactor.IOSession;
-import org.apache.http.nio.util.ByteBufferAllocator;
-import org.apache.http.nio.util.HeapByteBufferAllocator;
-
-/**
- * Default factory for {@link ManagedNHttpClientConnection} instances.
- *
- * @since 4.0
- */
-public class ManagedNHttpClientConnectionFactory implements NHttpConnectionFactory<ManagedNHttpClientConnection> {
-
-    private final Log headerlog = LogFactory.getLog("org.apache.http.headers");
-    private final Log wirelog = LogFactory.getLog("org.apache.http.wire");
-    private final Log log = LogFactory.getLog(ManagedNHttpClientConnectionImpl.class);
-
-    private static final AtomicLong COUNTER = new AtomicLong();
-
-    public static final ManagedNHttpClientConnectionFactory INSTANCE = new ManagedNHttpClientConnectionFactory();
-
-    private final ByteBufferAllocator allocator;
-    private final NHttpMessageWriterFactory<HttpRequest> requestWriterFactory;
-    private final NHttpMessageParserFactory<HttpResponse> responseParserFactory;
-
-    public ManagedNHttpClientConnectionFactory(
-            final NHttpMessageWriterFactory<HttpRequest> requestWriterFactory,
-            final NHttpMessageParserFactory<HttpResponse> responseParserFactory,
-            final ByteBufferAllocator allocator) {
-        super();
-        this.requestWriterFactory = requestWriterFactory != null ? requestWriterFactory :
-            DefaultHttpRequestWriterFactory.INSTANCE;
-        this.responseParserFactory = responseParserFactory != null ? responseParserFactory :
-            DefaultHttpResponseParserFactory.INSTANCE;
-        this.allocator = allocator != null ? allocator : HeapByteBufferAllocator.INSTANCE;
-    }
-
-    public ManagedNHttpClientConnectionFactory() {
-        this(null, null, null);
-    }
-
-    @Override
-    public ManagedNHttpClientConnection create(
-            final IOSession iosession, final ConnectionConfig config) {
-        final String id = "http-outgoing-" + Long.toString(COUNTER.getAndIncrement());
-        CharsetDecoder chardecoder = null;
-        CharsetEncoder charencoder = null;
-        final Charset charset = config.getCharset();
-        final CodingErrorAction malformedInputAction = config.getMalformedInputAction() != null ?
-                config.getMalformedInputAction() : CodingErrorAction.REPORT;
-        final CodingErrorAction unmappableInputAction = config.getUnmappableInputAction() != null ?
-                config.getUnmappableInputAction() : CodingErrorAction.REPORT;
-        if (charset != null) {
-            chardecoder = charset.newDecoder();
-            chardecoder.onMalformedInput(malformedInputAction);
-            chardecoder.onUnmappableCharacter(unmappableInputAction);
-            charencoder = charset.newEncoder();
-            charencoder.onMalformedInput(malformedInputAction);
-            charencoder.onUnmappableCharacter(unmappableInputAction);
-        }
-        final ManagedNHttpClientConnection conn = new ManagedNHttpClientConnectionImpl(
-                id,
-                this.log,
-                this.headerlog,
-                this.wirelog,
-                iosession,
-                config.getBufferSize(),
-                config.getFragmentSizeHint(),
-                this.allocator,
-                chardecoder,
-                charencoder,
-                config.getMessageConstraints(),
-                null,
-                null,
-                this.requestWriterFactory,
-                this.responseParserFactory);
-        iosession.setAttribute(IOEventDispatch.CONNECTION_KEY, conn);
-        return conn;
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionImpl.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionImpl.java
deleted file mode 100644
index 1ec810c..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionImpl.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.conn;
-
-import java.nio.charset.CharsetDecoder;
-import java.nio.charset.CharsetEncoder;
-
-import javax.net.ssl.SSLSession;
-
-import org.apache.commons.logging.Log;
-import org.apache.http.Header;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.config.MessageConstraints;
-import org.apache.http.entity.ContentLengthStrategy;
-import org.apache.http.impl.nio.DefaultNHttpClientConnection;
-import org.apache.http.nio.NHttpMessageParserFactory;
-import org.apache.http.nio.NHttpMessageWriterFactory;
-import org.apache.http.nio.conn.ManagedNHttpClientConnection;
-import org.apache.http.nio.reactor.IOSession;
-import org.apache.http.nio.reactor.ssl.SSLIOSession;
-import org.apache.http.nio.util.ByteBufferAllocator;
-import org.apache.http.util.Args;
-import org.apache.http.util.Asserts;
-
-class ManagedNHttpClientConnectionImpl
-                    extends DefaultNHttpClientConnection implements ManagedNHttpClientConnection {
-
-    private final Log headerlog;
-    private final Log wirelog;
-    private final Log log;
-
-    private final String id;
-    private IOSession original;
-
-    public ManagedNHttpClientConnectionImpl(
-            final String id,
-            final Log log,
-            final Log headerlog,
-            final Log wirelog,
-            final IOSession iosession,
-            final int buffersize,
-            final int fragmentSizeHint,
-            final ByteBufferAllocator allocator,
-            final CharsetDecoder chardecoder,
-            final CharsetEncoder charencoder,
-            final MessageConstraints constraints,
-            final ContentLengthStrategy incomingContentStrategy,
-            final ContentLengthStrategy outgoingContentStrategy,
-            final NHttpMessageWriterFactory<HttpRequest> requestWriterFactory,
-            final NHttpMessageParserFactory<HttpResponse> responseParserFactory) {
-        super(iosession, buffersize, fragmentSizeHint, allocator, chardecoder, charencoder, constraints,
-                incomingContentStrategy, outgoingContentStrategy,
-                requestWriterFactory, responseParserFactory);
-        this.id = id;
-        this.log = log;
-        this.headerlog = headerlog;
-        this.wirelog = wirelog;
-        this.original = iosession;
-        if (this.log.isDebugEnabled() || this.wirelog.isDebugEnabled()) {
-            super.bind(new LoggingIOSession(iosession, this.id, this.log, this.wirelog));
-        }
-    }
-
-    @Override
-    public void bind(final IOSession iosession) {
-        Args.notNull(iosession, "I/O session");
-        Asserts.check(!iosession.isClosed(), "I/O session is closed");
-        this.status = ACTIVE;
-        this.original = iosession;
-        if (this.log.isDebugEnabled() || this.wirelog.isDebugEnabled()) {
-            this.log.debug(this.id + " Upgrade session " + iosession);
-            super.bind(new LoggingIOSession(iosession, this.id, this.log, this.wirelog));
-        } else {
-            super.bind(iosession);
-        }
-    }
-
-    @Override
-    public IOSession getIOSession() {
-        return this.original;
-    }
-
-    @Override
-    public SSLSession getSSLSession() {
-        if (this.original instanceof SSLIOSession) {
-            return ((SSLIOSession) this.original).getSSLSession();
-        }
-        return null;
-    }
-
-    @Override
-    public String getId() {
-        return this.id;
-    }
-
-    @Override
-    protected void onResponseReceived(final HttpResponse response) {
-        if (response != null && this.headerlog.isDebugEnabled()) {
-            this.headerlog.debug(this.id + " << " + response.getStatusLine().toString());
-            final Header[] headers = response.getAllHeaders();
-            for (final Header header : headers) {
-                this.headerlog.debug(this.id + " << " + header.toString());
-            }
-        }
-    }
-
-    @Override
-    protected void onRequestSubmitted(final HttpRequest request) {
-        if (request != null && this.headerlog.isDebugEnabled()) {
-            this.headerlog.debug(this.id + " >> " + request.getRequestLine().toString());
-            final Header[] headers = request.getAllHeaders();
-            for (final Header header : headers) {
-                this.headerlog.debug(this.id + " >> " + header.toString());
-            }
-        }
-    }
-
-    @Override
-    public String toString() {
-        final StringBuilder buf = new StringBuilder();
-        buf.append(this.id);
-        buf.append(" [");
-        switch (this.status) {
-        case ACTIVE:
-            buf.append("ACTIVE");
-            if (this.inbuf.hasData()) {
-                buf.append("(").append(this.inbuf.length()).append(")");
-            }
-            break;
-        case CLOSING:
-            buf.append("CLOSING");
-            break;
-        case CLOSED:
-            buf.append("CLOSED");
-            break;
-        }
-        buf.append("]");
-        return buf.toString();
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/PoolingNHttpClientConnectionManager.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/PoolingNHttpClientConnectionManager.java
deleted file mode 100644
index 21b3ed8..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/PoolingNHttpClientConnectionManager.java
+++ /dev/null
@@ -1,613 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.conn;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.SocketAddress;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.http.HttpHost;
-import org.apache.http.annotation.ThreadSafe;
-import org.apache.http.concurrent.BasicFuture;
-import org.apache.http.concurrent.FutureCallback;
-import org.apache.http.config.ConnectionConfig;
-import org.apache.http.config.Lookup;
-import org.apache.http.config.Registry;
-import org.apache.http.config.RegistryBuilder;
-import org.apache.http.conn.DnsResolver;
-import org.apache.http.conn.SchemePortResolver;
-import org.apache.http.conn.UnsupportedSchemeException;
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.impl.conn.DefaultSchemePortResolver;
-import org.apache.http.impl.conn.SystemDefaultDnsResolver;
-import org.apache.http.nio.NHttpClientConnection;
-import org.apache.http.nio.conn.ManagedNHttpClientConnection;
-import org.apache.http.nio.conn.NHttpClientConnectionManager;
-import org.apache.http.nio.conn.NHttpConnectionFactory;
-import org.apache.http.nio.conn.NoopIOSessionStrategy;
-import org.apache.http.nio.conn.SchemeIOSessionStrategy;
-import org.apache.http.nio.conn.ssl.SSLIOSessionStrategy;
-import org.apache.http.nio.pool.NIOConnFactory;
-import org.apache.http.nio.pool.SocketAddressResolver;
-import org.apache.http.nio.reactor.ConnectingIOReactor;
-import org.apache.http.nio.reactor.IOEventDispatch;
-import org.apache.http.nio.reactor.IOSession;
-import org.apache.http.pool.ConnPoolControl;
-import org.apache.http.pool.PoolStats;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.util.Args;
-import org.apache.http.util.Asserts;
-
-/**
- * {@code PoolingNHttpClientConnectionManager} maintains a pool of
- * {@link NHttpClientConnection}s and is able to service connection requests
- * from multiple execution threads. Connections are pooled on a per route
- * basis. A request for a route which already the manager has persistent
- * connections for available in the pool will be services by leasing
- * a connection from the pool rather than creating a brand new connection.
- * <p>
- * {@code PoolingNHttpClientConnectionManager} maintains a maximum limit
- * of connection on a per route basis and in total. Per default this
- * implementation will create no more than than 2 concurrent connections
- * per given route and no more 20 connections in total. For many real-world
- * applications these limits may prove too constraining, especially if they
- * use HTTP as a transport protocol for their services. Connection limits,
- * however, can be adjusted using {@link ConnPoolControl} methods.
- *
- * @since 4.0
- */
-@ThreadSafe
-public class PoolingNHttpClientConnectionManager
-       implements NHttpClientConnectionManager, ConnPoolControl<HttpRoute> {
-
-    private final Log log = LogFactory.getLog(getClass());
-
-    static final String IOSESSION_FACTORY_REGISTRY = "http.iosession-factory-registry";
-
-    private final ConnectingIOReactor ioreactor;
-    private final ConfigData configData;
-    private final CPool pool;
-    private final Registry<SchemeIOSessionStrategy> iosessionFactoryRegistry;
-
-    private static Registry<SchemeIOSessionStrategy> getDefaultRegistry() {
-        return RegistryBuilder.<SchemeIOSessionStrategy>create()
-                .register("http", NoopIOSessionStrategy.INSTANCE)
-                .register("https", SSLIOSessionStrategy.getDefaultStrategy())
-                .build();
-    }
-
-    public PoolingNHttpClientConnectionManager(final ConnectingIOReactor ioreactor) {
-        this(ioreactor, getDefaultRegistry());
-    }
-
-    public PoolingNHttpClientConnectionManager(
-            final ConnectingIOReactor ioreactor,
-            final Registry<SchemeIOSessionStrategy> iosessionFactoryRegistry) {
-        this(ioreactor, null, iosessionFactoryRegistry, null);
-    }
-
-    public PoolingNHttpClientConnectionManager(
-            final ConnectingIOReactor ioreactor,
-            final NHttpConnectionFactory<ManagedNHttpClientConnection> connFactory,
-            final DnsResolver dnsResolver) {
-        this(ioreactor, connFactory, getDefaultRegistry(), dnsResolver);
-    }
-
-    public PoolingNHttpClientConnectionManager(
-            final ConnectingIOReactor ioreactor,
-            final NHttpConnectionFactory<ManagedNHttpClientConnection> connFactory) {
-        this(ioreactor, connFactory, getDefaultRegistry(), null);
-    }
-
-    public PoolingNHttpClientConnectionManager(
-            final ConnectingIOReactor ioreactor,
-            final NHttpConnectionFactory<ManagedNHttpClientConnection> connFactory,
-            final Registry<SchemeIOSessionStrategy> iosessionFactoryRegistry) {
-        this(ioreactor, connFactory, iosessionFactoryRegistry, null);
-    }
-
-    public PoolingNHttpClientConnectionManager(
-            final ConnectingIOReactor ioreactor,
-            final NHttpConnectionFactory<ManagedNHttpClientConnection> connFactory,
-            final Registry<SchemeIOSessionStrategy> iosessionFactoryRegistry,
-            final DnsResolver dnsResolver) {
-        this(ioreactor, connFactory, iosessionFactoryRegistry, null, dnsResolver,
-            -1, TimeUnit.MILLISECONDS);
-    }
-
-    public PoolingNHttpClientConnectionManager(
-            final ConnectingIOReactor ioreactor,
-            final NHttpConnectionFactory<ManagedNHttpClientConnection> connFactory,
-            final Registry<SchemeIOSessionStrategy> iosessionFactoryRegistry,
-            final SchemePortResolver schemePortResolver,
-            final DnsResolver dnsResolver,
-            final long timeToLive, final TimeUnit tunit) {
-        super();
-        Args.notNull(ioreactor, "I/O reactor");
-        Args.notNull(iosessionFactoryRegistry, "I/O session factory registry");
-        this.ioreactor = ioreactor;
-        this.configData = new ConfigData();
-        this.pool = new CPool(ioreactor,
-            new InternalConnectionFactory(this.configData, connFactory),
-            new InternalAddressResolver(schemePortResolver, dnsResolver),
-            2, 20, timeToLive, tunit != null ? tunit : TimeUnit.MILLISECONDS);
-        this.iosessionFactoryRegistry = iosessionFactoryRegistry;
-    }
-
-    PoolingNHttpClientConnectionManager(
-            final ConnectingIOReactor ioreactor,
-            final CPool pool,
-            final Registry<SchemeIOSessionStrategy> iosessionFactoryRegistry) {
-        super();
-        this.ioreactor = ioreactor;
-        this.configData = new ConfigData();
-        this.pool = pool;
-        this.iosessionFactoryRegistry = iosessionFactoryRegistry;
-    }
-
-    @Override
-    protected void finalize() throws Throwable {
-        try {
-            shutdown();
-        } finally {
-            super.finalize();
-        }
-    }
-
-    @Override
-    public void execute(final IOEventDispatch eventDispatch) throws IOException {
-        this.ioreactor.execute(eventDispatch);
-    }
-
-    public void shutdown(final long waitMs) throws IOException {
-        this.log.debug("Connection manager is shutting down");
-        this.pool.shutdown(waitMs);
-        this.log.debug("Connection manager shut down");
-    }
-
-    @Override
-    public void shutdown() throws IOException {
-        this.log.debug("Connection manager is shutting down");
-        this.pool.shutdown(2000);
-        this.log.debug("Connection manager shut down");
-    }
-
-    private String format(final HttpRoute route, final Object state) {
-        final StringBuilder buf = new StringBuilder();
-        buf.append("[route: ").append(route).append("]");
-        if (state != null) {
-            buf.append("[state: ").append(state).append("]");
-        }
-        return buf.toString();
-    }
-
-    private String formatStats(final HttpRoute route) {
-        final StringBuilder buf = new StringBuilder();
-        final PoolStats totals = this.pool.getTotalStats();
-        final PoolStats stats = this.pool.getStats(route);
-        buf.append("[total kept alive: ").append(totals.getAvailable()).append("; ");
-        buf.append("route allocated: ").append(stats.getLeased() + stats.getAvailable());
-        buf.append(" of ").append(stats.getMax()).append("; ");
-        buf.append("total allocated: ").append(totals.getLeased() + totals.getAvailable());
-        buf.append(" of ").append(totals.getMax()).append("]");
-        return buf.toString();
-    }
-
-    private String format(final CPoolEntry entry) {
-        final StringBuilder buf = new StringBuilder();
-        buf.append("[id: ").append(entry.getId()).append("]");
-        buf.append("[route: ").append(entry.getRoute()).append("]");
-        final Object state = entry.getState();
-        if (state != null) {
-            buf.append("[state: ").append(state).append("]");
-        }
-        return buf.toString();
-    }
-
-    @Override
-    public Future<NHttpClientConnection> requestConnection(
-            final HttpRoute route,
-            final Object state,
-            final long connectTimeout,
-            final long leaseTimeout,
-            final TimeUnit tunit,
-            final FutureCallback<NHttpClientConnection> callback) {
-        Args.notNull(route, "HTTP route");
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("Connection request: " + format(route, state) + formatStats(route));
-        }
-        final BasicFuture<NHttpClientConnection> future = new BasicFuture<NHttpClientConnection>(callback);
-        final HttpHost host;
-        if (route.getProxyHost() != null) {
-            host = route.getProxyHost();
-        } else {
-            host = route.getTargetHost();
-        }
-        final SchemeIOSessionStrategy sf = this.iosessionFactoryRegistry.lookup(
-                host.getSchemeName());
-        if (sf == null) {
-            future.failed(new UnsupportedSchemeException(host.getSchemeName() +
-                    " protocol is not supported"));
-            return future;
-        }
-        this.pool.lease(route, state,
-                connectTimeout, leaseTimeout, tunit != null ? tunit : TimeUnit.MILLISECONDS,
-                new InternalPoolEntryCallback(future));
-        return future;
-    }
-
-    @Override
-    public void releaseConnection(
-            final NHttpClientConnection managedConn,
-            final Object state,
-            final long keepalive,
-            final TimeUnit tunit) {
-        Args.notNull(managedConn, "Managed connection");
-        synchronized (managedConn) {
-            final CPoolEntry entry = CPoolProxy.detach(managedConn);
-            if (entry == null) {
-                return;
-            }
-            if (this.log.isDebugEnabled()) {
-                this.log.debug("Releasing connection: " + format(entry) + formatStats(entry.getRoute()));
-            }
-            final NHttpClientConnection conn = entry.getConnection();
-            try {
-                if (conn.isOpen()) {
-                    entry.setState(state);
-                    entry.updateExpiry(keepalive, tunit != null ? tunit : TimeUnit.MILLISECONDS);
-                    if (this.log.isDebugEnabled()) {
-                        final String s;
-                        if (keepalive > 0) {
-                            s = "for " + (double) keepalive / 1000 + " seconds";
-                        } else {
-                            s = "indefinitely";
-                        }
-                        this.log.debug("Connection " + format(entry) + " can be kept alive " + s);
-                    }
-                }
-            } finally {
-                this.pool.release(entry, conn.isOpen() && entry.isRouteComplete());
-                if (this.log.isDebugEnabled()) {
-                    this.log.debug("Connection released: " + format(entry) + formatStats(entry.getRoute()));
-                }
-            }
-        }
-    }
-
-    private Lookup<SchemeIOSessionStrategy> getIOSessionFactoryRegistry(final HttpContext context) {
-        @SuppressWarnings("unchecked")
-        Lookup<SchemeIOSessionStrategy> reg = (Lookup<SchemeIOSessionStrategy>) context.getAttribute(
-                IOSESSION_FACTORY_REGISTRY);
-        if (reg == null) {
-            reg = this.iosessionFactoryRegistry;
-        }
-        return reg;
-    }
-
-    @Override
-    public void startRoute(
-            final NHttpClientConnection managedConn,
-            final HttpRoute route,
-            final HttpContext context) throws IOException {
-        Args.notNull(managedConn, "Managed connection");
-        Args.notNull(route, "HTTP route");
-        final HttpHost host;
-        if (route.getProxyHost() != null) {
-            host = route.getProxyHost();
-        } else {
-            host = route.getTargetHost();
-        }
-        final Lookup<SchemeIOSessionStrategy> reg = getIOSessionFactoryRegistry(context);
-        final SchemeIOSessionStrategy sf = reg.lookup(host.getSchemeName());
-        if (sf == null) {
-            throw new UnsupportedSchemeException(host.getSchemeName() +
-                    " protocol is not supported");
-        }
-        if (sf.isLayeringRequired()) {
-            synchronized (managedConn) {
-                final CPoolEntry entry = CPoolProxy.getPoolEntry(managedConn);
-                final ManagedNHttpClientConnection conn = entry.getConnection();
-                final IOSession ioSession = conn.getIOSession();
-                final IOSession currentSession = sf.upgrade(host, ioSession);
-                conn.bind(currentSession);
-            }
-        }
-    }
-
-    @Override
-    public void upgrade(
-            final NHttpClientConnection managedConn,
-            final HttpRoute route,
-            final HttpContext context) throws IOException {
-        Args.notNull(managedConn, "Managed connection");
-        Args.notNull(route, "HTTP route");
-        final HttpHost host  = route.getTargetHost();
-        final Lookup<SchemeIOSessionStrategy> reg = getIOSessionFactoryRegistry(context);
-        final SchemeIOSessionStrategy sf = reg.lookup(host.getSchemeName());
-        if (sf == null) {
-            throw new UnsupportedSchemeException(host.getSchemeName() +
-                    " protocol is not supported");
-        }
-        if (!sf.isLayeringRequired()) {
-            throw new UnsupportedSchemeException(host.getSchemeName() +
-                    " protocol does not support connection upgrade");
-        }
-        synchronized (managedConn) {
-            final CPoolEntry entry = CPoolProxy.getPoolEntry(managedConn);
-            final ManagedNHttpClientConnection conn = entry.getConnection();
-            final IOSession currentSession = sf.upgrade(host, conn.getIOSession());
-            conn.bind(currentSession);
-        }
-    }
-
-    @Override
-    public void routeComplete(
-            final NHttpClientConnection managedConn,
-            final HttpRoute route,
-            final HttpContext context) {
-        Args.notNull(managedConn, "Managed connection");
-        Args.notNull(route, "HTTP route");
-        synchronized (managedConn) {
-            final CPoolEntry entry = CPoolProxy.getPoolEntry(managedConn);
-            entry.markRouteComplete();
-        }
-    }
-
-    @Override
-    public boolean isRouteComplete(
-            final NHttpClientConnection managedConn) {
-        Args.notNull(managedConn, "Managed connection");
-        synchronized (managedConn) {
-            final CPoolEntry entry = CPoolProxy.getPoolEntry(managedConn);
-            return entry.isRouteComplete();
-        }
-    }
-
-    @Override
-    public void closeIdleConnections(final long idleTimeout, final TimeUnit tunit) {
-        if (this.log.isDebugEnabled()) {
-            this.log.debug("Closing connections idle longer than " + idleTimeout + " " + tunit);
-        }
-        this.pool.closeIdle(idleTimeout, tunit);
-    }
-
-    @Override
-    public void closeExpiredConnections() {
-        log.debug("Closing expired connections");
-        this.pool.closeExpired();
-    }
-
-    @Override
-    public int getMaxTotal() {
-        return this.pool.getMaxTotal();
-    }
-
-    @Override
-    public void setMaxTotal(final int max) {
-        this.pool.setMaxTotal(max);
-    }
-
-    @Override
-    public int getDefaultMaxPerRoute() {
-        return this.pool.getDefaultMaxPerRoute();
-    }
-
-    @Override
-    public void setDefaultMaxPerRoute(final int max) {
-        this.pool.setDefaultMaxPerRoute(max);
-    }
-
-    @Override
-    public int getMaxPerRoute(final HttpRoute route) {
-        return this.pool.getMaxPerRoute(route);
-    }
-
-    @Override
-    public void setMaxPerRoute(final HttpRoute route, final int max) {
-        this.pool.setMaxPerRoute(route, max);
-    }
-
-    @Override
-    public PoolStats getTotalStats() {
-        return this.pool.getTotalStats();
-    }
-
-    @Override
-    public PoolStats getStats(final HttpRoute route) {
-        return this.pool.getStats(route);
-    }
-
-    /**
-     * @since 4.1
-     */
-    public Set<HttpRoute> getRoutes() {
-        return this.pool.getRoutes();
-    }
-
-    public ConnectionConfig getDefaultConnectionConfig() {
-        return this.configData.getDefaultConnectionConfig();
-    }
-
-    public void setDefaultConnectionConfig(final ConnectionConfig defaultConnectionConfig) {
-        this.configData.setDefaultConnectionConfig(defaultConnectionConfig);
-    }
-
-    public ConnectionConfig getConnectionConfig(final HttpHost host) {
-        return this.configData.getConnectionConfig(host);
-    }
-
-    public void setConnectionConfig(final HttpHost host, final ConnectionConfig connectionConfig) {
-        this.configData.setConnectionConfig(host, connectionConfig);
-    }
-
-    class InternalPoolEntryCallback implements FutureCallback<CPoolEntry> {
-
-        private final BasicFuture<NHttpClientConnection> future;
-
-        public InternalPoolEntryCallback(
-                final BasicFuture<NHttpClientConnection> future) {
-            super();
-            this.future = future;
-        }
-
-        @Override
-        public void completed(final CPoolEntry entry) {
-            Asserts.check(entry.getConnection() != null, "Pool entry with no connection");
-            if (log.isDebugEnabled()) {
-                log.debug("Connection leased: " + format(entry) + formatStats(entry.getRoute()));
-            }
-            final NHttpClientConnection managedConn = CPoolProxy.newProxy(entry);
-            if (!this.future.completed(managedConn)) {
-                pool.release(entry, true);
-            }
-        }
-
-        @Override
-        public void failed(final Exception ex) {
-            if (log.isDebugEnabled()) {
-                log.debug("Connection request failed", ex);
-            }
-            this.future.failed(ex);
-        }
-
-        @Override
-        public void cancelled() {
-            log.debug("Connection request cancelled");
-            this.future.cancel(true);
-        }
-
-    }
-
-    static class ConfigData {
-
-        private final Map<HttpHost, ConnectionConfig> connectionConfigMap;
-        private volatile ConnectionConfig defaultConnectionConfig;
-
-        ConfigData() {
-            super();
-            this.connectionConfigMap = new ConcurrentHashMap<HttpHost, ConnectionConfig>();
-        }
-
-        public ConnectionConfig getDefaultConnectionConfig() {
-            return this.defaultConnectionConfig;
-        }
-
-        public void setDefaultConnectionConfig(final ConnectionConfig defaultConnectionConfig) {
-            this.defaultConnectionConfig = defaultConnectionConfig;
-        }
-
-        public ConnectionConfig getConnectionConfig(final HttpHost host) {
-            return this.connectionConfigMap.get(host);
-        }
-
-        public void setConnectionConfig(final HttpHost host, final ConnectionConfig connectionConfig) {
-            this.connectionConfigMap.put(host, connectionConfig);
-        }
-
-    }
-
-    static class InternalConnectionFactory implements NIOConnFactory<HttpRoute, ManagedNHttpClientConnection> {
-
-        private final ConfigData configData;
-        private final NHttpConnectionFactory<ManagedNHttpClientConnection> connFactory;
-
-        InternalConnectionFactory(
-                final ConfigData configData,
-                final NHttpConnectionFactory<ManagedNHttpClientConnection> connFactory) {
-            super();
-            this.configData = configData != null ? configData : new ConfigData();
-            this.connFactory = connFactory != null ? connFactory :
-                ManagedNHttpClientConnectionFactory.INSTANCE;
-        }
-
-        @Override
-        public ManagedNHttpClientConnection create(
-                final HttpRoute route, final IOSession iosession) throws IOException {
-            ConnectionConfig config = null;
-            if (route.getProxyHost() != null) {
-                config = this.configData.getConnectionConfig(route.getProxyHost());
-            }
-            if (config == null) {
-                config = this.configData.getConnectionConfig(route.getTargetHost());
-            }
-            if (config == null) {
-                config = this.configData.getDefaultConnectionConfig();
-            }
-            if (config == null) {
-                config = ConnectionConfig.DEFAULT;
-            }
-            final ManagedNHttpClientConnection conn = this.connFactory.create(iosession, config);
-            iosession.setAttribute(IOEventDispatch.CONNECTION_KEY, conn);
-            return conn;
-        }
-
-    }
-
-    static class InternalAddressResolver implements SocketAddressResolver<HttpRoute> {
-
-        private final SchemePortResolver schemePortResolver;
-        private final DnsResolver dnsResolver;
-
-        public InternalAddressResolver(
-                final SchemePortResolver schemePortResolver,
-                final DnsResolver dnsResolver) {
-            super();
-            this.schemePortResolver = schemePortResolver != null ? schemePortResolver :
-                DefaultSchemePortResolver.INSTANCE;
-            this.dnsResolver = dnsResolver != null ? dnsResolver :
-                    SystemDefaultDnsResolver.INSTANCE;
-        }
-
-        @Override
-        public SocketAddress resolveLocalAddress(final HttpRoute route) throws IOException {
-            return route.getLocalAddress() != null ? new InetSocketAddress(route.getLocalAddress(), 0) : null;
-        }
-
-        @Override
-        public SocketAddress resolveRemoteAddress(final HttpRoute route) throws IOException {
-            final HttpHost host;
-            if (route.getProxyHost() != null) {
-                host = route.getProxyHost();
-            } else {
-                host = route.getTargetHost();
-            }
-            final int port = this.schemePortResolver.resolve(host);
-            final InetAddress[] addresses = this.dnsResolver.resolve(host.getHostName());
-            return new InetSocketAddress(addresses[0], port);
-        }
-
-    }
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/Wire.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/Wire.java
deleted file mode 100644
index 8fe8437..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/Wire.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.conn;
-
-import java.nio.ByteBuffer;
-
-import org.apache.commons.logging.Log;
-
-class Wire {
-
-    private final Log log;
-    private final String id;
-
-    public Wire(final Log log, final String id) {
-        super();
-        this.log = log;
-        this.id = id;
-    }
-
-    private void wire(final String header, final byte[] b, final int pos, final int off) {
-        final StringBuilder buffer = new StringBuilder();
-        for (int i = 0; i < off; i++) {
-            final int ch = b[pos + i];
-            if (ch == 13) {
-                buffer.append("[\\r]");
-            } else if (ch == 10) {
-                    buffer.append("[\\n]\"");
-                    buffer.insert(0, "\"");
-                    buffer.insert(0, header);
-                    this.log.debug(this.id + " " + buffer.toString());
-                    buffer.setLength(0);
-            } else if ((ch < 32) || (ch > 127)) {
-                buffer.append("[0x");
-                buffer.append(Integer.toHexString(ch));
-                buffer.append("]");
-            } else {
-                buffer.append((char) ch);
-            }
-        }
-        if (buffer.length() > 0) {
-            buffer.append('\"');
-            buffer.insert(0, '\"');
-            buffer.insert(0, header);
-            this.log.debug(this.id + " " + buffer.toString());
-        }
-    }
-
-
-    public boolean isEnabled() {
-        return this.log.isDebugEnabled();
-    }
-
-    public void output(final byte[] b, final int pos, final int off) {
-        wire(">> ", b, pos, off);
-    }
-
-    public void input(final byte[] b, final int pos, final int off) {
-        wire("<< ", b, pos, off);
-    }
-
-    public void output(final byte[] b) {
-        output(b, 0, b.length);
-    }
-
-    public void input(final byte[] b) {
-        input(b, 0, b.length);
-    }
-
-    public void output(final int b) {
-        output(new byte[] {(byte) b});
-    }
-
-    public void input(final int b) {
-        input(new byte[] {(byte) b});
-    }
-
-    public void output(final ByteBuffer b) {
-        if (b.hasArray()) {
-            output(b.array(), b.arrayOffset() + b.position(), b.remaining());
-        } else {
-            final byte[] tmp = new byte[b.remaining()];
-            b.get(tmp);
-            output(tmp);
-        }
-    }
-
-    public void input(final ByteBuffer b) {
-        if (b.hasArray()) {
-            input(b.array(), b.arrayOffset() + b.position(), b.remaining());
-        } else {
-            final byte[] tmp = new byte[b.remaining()];
-            b.get(tmp);
-            input(tmp);
-        }
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/package-info.java b/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/package-info.java
deleted file mode 100644
index a5c262d..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/package-info.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-/**
- * Default implementations of asynchronous client connection
- * management functions.
- */
-package org.apache.http.impl.nio.conn;
diff --git a/httpasyncclient/src/main/java/org/apache/http/nio/client/HttpAsyncClient.java b/httpasyncclient/src/main/java/org/apache/http/nio/client/HttpAsyncClient.java
deleted file mode 100644
index fd84c4f..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/nio/client/HttpAsyncClient.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.client;
-
-import java.util.concurrent.Future;
-
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.concurrent.FutureCallback;
-import org.apache.http.nio.protocol.HttpAsyncRequestProducer;
-import org.apache.http.nio.protocol.HttpAsyncResponseConsumer;
-import org.apache.http.protocol.HttpContext;
-
-/**
- * This interface represents only the most basic contract for HTTP request
- * execution. It imposes no restrictions or particular details on the request
- * execution process and leaves the specifics of state management,
- * authentication and redirect handling up to individual implementations.
- *
- * @since 4.0
- */
-public interface HttpAsyncClient {
-
-    /**
-     * Initiates asynchronous HTTP request execution using the given context.
-     * <p>
-     * The request producer passed to this method will be used to generate
-     * a request message and stream out its content without buffering it
-     * in memory. The response consumer passed to this method will be used
-     * to process a response message without buffering its content in memory.
-     * <p>
-     * Please note it may be unsafe to interact with the context instance
-     * while the request is still being executed.
-     *
-     * @param <T> the result type of request execution.
-     * @param requestProducer request producer callback.
-     * @param responseConsumer response consumer callaback.
-     * @param context HTTP context
-     * @param callback future callback.
-     * @return future representing pending completion of the operation.
-     */
-    <T> Future<T> execute(
-            HttpAsyncRequestProducer requestProducer,
-            HttpAsyncResponseConsumer<T> responseConsumer,
-            HttpContext context,
-            FutureCallback<T> callback);
-
-    /**
-     * Initiates asynchronous HTTP request execution using the default
-     * context.
-     * <p>
-     * The request producer passed to this method will be used to generate
-     * a request message and stream out its content without buffering it
-     * in memory. The response consumer passed to this method will be used
-     * to process a response message without buffering its content in memory.
-     *
-     * @param <T> the result type of request execution.
-     * @param requestProducer request producer callback.
-     * @param responseConsumer response consumer callaback.
-     * @param callback future callback.
-     * @return future representing pending completion of the operation.
-     */
-    <T> Future<T> execute(
-            HttpAsyncRequestProducer requestProducer,
-            HttpAsyncResponseConsumer<T> responseConsumer,
-            FutureCallback<T> callback);
-
-    /**
-     * Initiates asynchronous HTTP request execution against the given target
-     * using the given context.
-     * <p>
-     * Please note it may be unsafe to interact with the context instance
-     * while the request is still being executed.
-     *
-     * @param target    the target host for the request.
-     *                  Implementations may accept {@code null}
-     *                  if they can still determine a route, for example
-     *                  to a default target or by inspecting the request.
-     * @param request   the request to execute
-     * @param context   the context to use for the execution, or
-     *                  {@code null} to use the default context
-     * @param callback future callback.
-     * @return future representing pending completion of the operation.
-     */
-    Future<HttpResponse> execute(
-            HttpHost target, HttpRequest request, HttpContext context,
-            FutureCallback<HttpResponse> callback);
-
-    /**
-     * Initiates asynchronous HTTP request execution against the given target.
-     *
-     * @param target    the target host for the request.
-     *                  Implementations may accept {@code null}
-     *                  if they can still determine a route, for example
-     *                  to a default target or by inspecting the request.
-     * @param request   the request to execute
-     * @param callback future callback.
-     * @return future representing pending completion of the operation.
-     */
-    Future<HttpResponse> execute(
-            HttpHost target, HttpRequest request,
-            FutureCallback<HttpResponse> callback);
-
-    /**
-     * Initiates asynchronous HTTP request execution using the given
-     * context.
-     * <p>
-     * Please note it may be unsafe to interact with the context instance
-     * while the request is still being executed.
-     *
-     * @param request   the request to execute
-     * @param context HTTP context
-     * @param callback future callback.
-     * @return future representing pending completion of the operation.
-     */
-    Future<HttpResponse> execute(
-            HttpUriRequest request, HttpContext context,
-            FutureCallback<HttpResponse> callback);
-
-    /**
-     * Initiates asynchronous HTTP request execution.
-     *
-     * @param request   the request to execute
-     * @param callback future callback.
-     * @return future representing pending completion of the operation.
-     */
-    Future<HttpResponse> execute(
-            HttpUriRequest request,
-            FutureCallback<HttpResponse> callback);
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/nio/client/HttpPipeliningClient.java b/httpasyncclient/src/main/java/org/apache/http/nio/client/HttpPipeliningClient.java
deleted file mode 100644
index 69382f5..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/nio/client/HttpPipeliningClient.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.client;
-
-import java.util.List;
-import java.util.concurrent.Future;
-
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.concurrent.FutureCallback;
-import org.apache.http.nio.protocol.HttpAsyncRequestProducer;
-import org.apache.http.nio.protocol.HttpAsyncResponseConsumer;
-import org.apache.http.protocol.HttpContext;
-
-/**
- * This interface represents only the most basic contract for HTTP request
- * execution. It imposes no restrictions or particular details on the request
- * execution process and leaves the specifics of state management,
- * authentication and redirect handling up to individual implementations.
- *
- * @since 4.1
- */
-public interface HttpPipeliningClient extends HttpAsyncClient {
-
-    /**
-     * Initiates pipelined execution of a sequence of requests.
-     * <p>
-     * The request producers passed to this method will be used to generate
-     * a request message and stream out its content without buffering it
-     * in memory. The response consumers passed to this method will be used
-     * to process a response message without buffering its content in memory.
-     * <p>
-     * Please note it may be unsafe to interact with the context instance
-     * while the request is still being executed.
-     *
-     * @param <T> the result type of request execution.
-     * @param target    the target host for the request.
-     * @param requestProducers list of request producers.
-     * @param responseConsumers list of response consumers.
-     * @param context HTTP context
-     * @param callback future callback.
-     * @return future representing pending completion of the operation.
-     */
-    <T> Future<List<T>> execute(
-            HttpHost target,
-            List<? extends HttpAsyncRequestProducer> requestProducers,
-            List<? extends HttpAsyncResponseConsumer<T>> responseConsumers,
-            HttpContext context,
-            FutureCallback<List<T>> callback);
-
-    /**
-     * Initiates pipelined execution of a sequence of requests.
-     * <p>
-     * The request producers passed to this method will be used to generate
-     * a request message and stream out its content without buffering it
-     * in memory. The response consumers passed to this method will be used
-     * to process a response message without buffering its content in memory.
-     *
-     * @param <T> the result type of request execution.
-     * @param target    the target host for the request.
-     * @param requestProducers list of request producers.
-     * @param responseConsumers list of response consumers.
-     * @param callback future callback.
-     * @return future representing pending completion of the operation.
-     */
-    <T> Future<List<T>> execute(
-            HttpHost target,
-            List<? extends HttpAsyncRequestProducer> requestProducers,
-            List<? extends HttpAsyncResponseConsumer<T>> responseConsumers,
-            FutureCallback<List<T>> callback);
-
-    /**
-     * Initiates pipelined execution of a sequence of requests against
-     * the given target using the given context.
-     * <p>
-     * Please note it may be unsafe to interact with the context instance
-     * while the request is still being executed.
-     *
-     * @param target    the target host for the requests.
-     *                  Implementations may accept {@code null}
-     *                  if they can still determine a route, for example
-     *                  to a default target or by inspecting the request.
-     * @param requests  the requests to execute
-     * @param context   the context to use for the execution, or
-     *                  {@code null} to use the default context
-     * @param callback future callback.
-     * @return future representing pending completion of the operation.
-     */
-    Future<List<HttpResponse>> execute(
-            HttpHost target,
-            List<HttpRequest> requests,
-            HttpContext context,
-            FutureCallback<List<HttpResponse>> callback);
-
-    /**
-     * Initiates pipelined execution of a sequence of requests against
-     * the given target.
-     *
-     * @param target    the target host for the requests.
-     *                  Implementations may accept {@code null}
-     *                  if they can still determine a route, for example
-     *                  to a default target or by inspecting the request.
-     * @param requests  the requests to execute
-     * @param callback future callback.
-     * @return future representing pending completion of the operation.
-     */
-    Future<List<HttpResponse>> execute(
-            HttpHost target,
-            List<HttpRequest> requests,
-            FutureCallback<List<HttpResponse>> callback);
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/nio/client/methods/AsyncByteConsumer.java b/httpasyncclient/src/main/java/org/apache/http/nio/client/methods/AsyncByteConsumer.java
deleted file mode 100644
index d62cdbe..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/nio/client/methods/AsyncByteConsumer.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.client.methods;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-import org.apache.http.HttpEntity;
-import org.apache.http.entity.ContentType;
-import org.apache.http.nio.ContentDecoder;
-import org.apache.http.nio.IOControl;
-import org.apache.http.nio.protocol.AbstractAsyncResponseConsumer;
-import org.apache.http.util.Asserts;
-
-/**
- * {@link org.apache.http.nio.protocol.HttpAsyncResponseConsumer} implementation that
- * provides convenience methods for processing of binary content entities enclosed
- * in an HTTP response.
- *
- * @since 4.0
- */
-public abstract class AsyncByteConsumer<T> extends AbstractAsyncResponseConsumer<T> {
-
-    private final ByteBuffer bbuf;
-
-    public AsyncByteConsumer(final int bufSize) {
-        super();
-        this.bbuf = ByteBuffer.allocate(bufSize);
-    }
-
-    public AsyncByteConsumer() {
-        this(8 * 1024);
-    }
-
-    /**
-     * Invoked to process a {@link ByteBuffer chunk} of content.
-     * The {@link IOControl} interface can be used to suspend input events
-     * if the consumer is temporarily unable to consume more content.
-     *
-     * @param buf chunk of content.
-     * @param ioctrl I/O control of the underlying connection.
-     * @throws IOException in case of an I/O error
-     */
-    protected abstract void onByteReceived(
-            ByteBuffer buf, IOControl ioctrl) throws IOException;
-
-    @Override
-    protected final void onEntityEnclosed(
-            final HttpEntity entity, final ContentType contentType) throws IOException {
-    }
-
-    @Override
-    protected final void onContentReceived(
-            final ContentDecoder decoder, final IOControl ioctrl) throws IOException {
-        Asserts.notNull(this.bbuf, "Byte buffer");
-        final int bytesRead = decoder.read(this.bbuf);
-        if (bytesRead <= 0) {
-            return;
-        }
-        this.bbuf.flip();
-        onByteReceived(this.bbuf, ioctrl);
-        this.bbuf.clear();
-    }
-
-    @Override
-    protected void releaseResources() {
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/nio/client/methods/AsyncCharConsumer.java b/httpasyncclient/src/main/java/org/apache/http/nio/client/methods/AsyncCharConsumer.java
deleted file mode 100644
index fa1660a..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/nio/client/methods/AsyncCharConsumer.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.client.methods;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.CharBuffer;
-import java.nio.charset.Charset;
-import java.nio.charset.CharsetDecoder;
-import java.nio.charset.CoderResult;
-
-import org.apache.http.HttpEntity;
-import org.apache.http.entity.ContentType;
-import org.apache.http.nio.ContentDecoder;
-import org.apache.http.nio.IOControl;
-import org.apache.http.nio.protocol.AbstractAsyncResponseConsumer;
-import org.apache.http.protocol.HTTP;
-import org.apache.http.util.Asserts;
-
-/**
- * {@link org.apache.http.nio.protocol.HttpAsyncResponseConsumer} implementation that
- * provides convenience methods for processing of textual content entities enclosed
- * in an HTTP response.
- *
- * @since 4.0
- */
-public abstract class AsyncCharConsumer<T> extends AbstractAsyncResponseConsumer<T> {
-
-    private final ByteBuffer bbuf;
-    private final CharBuffer cbuf;
-
-    private CharsetDecoder chardecoder;
-
-    public AsyncCharConsumer(final int bufSize) {
-        super();
-        this.bbuf = ByteBuffer.allocate(bufSize);
-        this.cbuf = CharBuffer.allocate(bufSize);
-    }
-
-    public AsyncCharConsumer() {
-        this(8 * 1024);
-    }
-
-    /**
-     * Invoked to process a {@link CharBuffer chunk} of content.
-     * The {@link IOControl} interface can be used to suspend input events
-     * if the consumer is temporarily unable to consume more content.
-     *
-     * @param buf chunk of content.
-     * @param ioctrl I/O control of the underlying connection.
-     * @throws IOException in case of an I/O error
-     */
-    protected abstract void onCharReceived(
-            CharBuffer buf, IOControl ioctrl) throws IOException;
-
-    /**
-     * Invoked to create a @{link CharsetDecoder} for contentType.
-     * This allows to use different default charsets for different content
-     * types and set appropriate coding error actions.
-     *
-     * @param contentType response Content-Type or null if not specified.
-     * @return content decoder.
-     *
-     * @since 4.1
-     */
-    protected CharsetDecoder createDecoder(final ContentType contentType) {
-        Charset charset = contentType != null ? contentType.getCharset() : null;
-        if (charset == null) {
-            charset = HTTP.DEF_CONTENT_CHARSET;
-        }
-        return charset.newDecoder();
-    }
-
-    @Override
-    protected final void onEntityEnclosed(
-            final HttpEntity entity, final ContentType contentType) throws IOException {
-        this.chardecoder = createDecoder(contentType != null ? contentType : ContentType.DEFAULT_TEXT);
-    }
-
-    @Override
-    protected final void onContentReceived(
-            final ContentDecoder decoder, final IOControl ioctrl) throws IOException {
-        Asserts.notNull(this.bbuf, "Byte buffer");
-
-        final int bytesRead = decoder.read(this.bbuf);
-        if (bytesRead <= 0) {
-            return;
-        }
-        this.bbuf.flip();
-        final boolean completed = decoder.isCompleted();
-        CoderResult result = this.chardecoder.decode(this.bbuf, this.cbuf, completed);
-        handleDecodingResult(result, ioctrl);
-        this.bbuf.compact();
-        if (completed) {
-            result = this.chardecoder.flush(this.cbuf);
-            handleDecodingResult(result, ioctrl);
-        }
-    }
-
-    private void handleDecodingResult(
-            final CoderResult result, final IOControl ioctrl) throws IOException {
-        if (result.isError()) {
-            result.throwException();
-        }
-        this.cbuf.flip();
-        if (this.cbuf.hasRemaining()) {
-            onCharReceived(this.cbuf, ioctrl);
-        }
-        this.cbuf.clear();
-    }
-
-    @Override
-    protected void releaseResources() {
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/nio/client/methods/BaseZeroCopyRequestProducer.java b/httpasyncclient/src/main/java/org/apache/http/nio/client/methods/BaseZeroCopyRequestProducer.java
deleted file mode 100644
index ae813b7..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/nio/client/methods/BaseZeroCopyRequestProducer.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.client.methods;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.net.URI;
-import java.nio.channels.FileChannel;
-
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpEntityEnclosingRequest;
-import org.apache.http.HttpException;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.client.utils.URIUtils;
-import org.apache.http.entity.BasicHttpEntity;
-import org.apache.http.entity.ContentType;
-import org.apache.http.nio.ContentEncoder;
-import org.apache.http.nio.ContentEncoderChannel;
-import org.apache.http.nio.FileContentEncoder;
-import org.apache.http.nio.IOControl;
-import org.apache.http.nio.protocol.HttpAsyncRequestProducer;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.util.Args;
-
-abstract class BaseZeroCopyRequestProducer implements HttpAsyncRequestProducer {
-
-    private final URI requestURI;
-    private final File file;
-    private final RandomAccessFile accessfile;
-    private final ContentType contentType;
-
-    private FileChannel fileChannel;
-    private long idx = -1;
-
-    protected BaseZeroCopyRequestProducer(
-            final URI requestURI,
-            final File file, final ContentType contentType) throws FileNotFoundException {
-        super();
-        Args.notNull(requestURI, "Request URI");
-        Args.notNull(file, "Source file");
-        this.requestURI = requestURI;
-        this.file = file;
-        this.accessfile = new RandomAccessFile(file, "r");
-        this.contentType = contentType;
-    }
-
-    private void closeChannel() throws IOException {
-        if (this.fileChannel != null) {
-            this.fileChannel.close();
-            this.fileChannel = null;
-        }
-    }
-
-    protected abstract HttpEntityEnclosingRequest createRequest(final URI requestURI, final HttpEntity entity);
-
-    @Override
-    public HttpRequest generateRequest() throws IOException, HttpException {
-        final BasicHttpEntity entity = new BasicHttpEntity();
-        entity.setChunked(false);
-        entity.setContentLength(this.file.length());
-        if (this.contentType != null) {
-            entity.setContentType(this.contentType.toString());
-        }
-        return createRequest(this.requestURI, entity);
-    }
-
-    @Override
-    public synchronized HttpHost getTarget() {
-        return URIUtils.extractHost(this.requestURI);
-    }
-
-    @Override
-    public synchronized void produceContent(
-            final ContentEncoder encoder, final IOControl ioctrl) throws IOException {
-        if (this.fileChannel == null) {
-            this.fileChannel = this.accessfile.getChannel();
-            this.idx = 0;
-        }
-        final long transferred;
-        if (encoder instanceof FileContentEncoder) {
-            transferred = ((FileContentEncoder)encoder).transfer(
-                    this.fileChannel, this.idx, Integer.MAX_VALUE);
-        } else {
-            transferred = this.fileChannel.transferTo(
-                    this.idx, Integer.MAX_VALUE, new ContentEncoderChannel(encoder));
-        }
-        if (transferred > 0) {
-            this.idx += transferred;
-        }
-
-        if (this.idx >= this.fileChannel.size()) {
-            encoder.complete();
-            closeChannel();
-        }
-    }
-
-    @Override
-    public void requestCompleted(final HttpContext context) {
-    }
-
-    @Override
-    public void failed(final Exception ex) {
-    }
-
-    @Override
-    public boolean isRepeatable() {
-        return true;
-    }
-
-    @Override
-    public synchronized void resetRequest() throws IOException {
-        closeChannel();
-    }
-
-    @Override
-    public synchronized void close() throws IOException {
-        try {
-            this.accessfile.close();
-        } catch (final IOException ignore) {
-        }
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/nio/client/methods/HttpAsyncMethods.java b/httpasyncclient/src/main/java/org/apache/http/nio/client/methods/HttpAsyncMethods.java
deleted file mode 100644
index 7fe5f56..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/nio/client/methods/HttpAsyncMethods.java
+++ /dev/null
@@ -1,427 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.client.methods;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.UnsupportedEncodingException;
-import java.net.URI;
-
-import org.apache.http.HttpEntityEnclosingRequest;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.HttpDelete;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpOptions;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.client.methods.HttpPut;
-import org.apache.http.client.methods.HttpTrace;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.client.utils.URIUtils;
-import org.apache.http.entity.ContentType;
-import org.apache.http.nio.entity.HttpAsyncContentProducer;
-import org.apache.http.nio.entity.NByteArrayEntity;
-import org.apache.http.nio.entity.NStringEntity;
-import org.apache.http.nio.protocol.BasicAsyncRequestProducer;
-import org.apache.http.nio.protocol.BasicAsyncResponseConsumer;
-import org.apache.http.nio.protocol.HttpAsyncRequestProducer;
-import org.apache.http.nio.protocol.HttpAsyncResponseConsumer;
-import org.apache.http.util.Args;
-
-/**
- * Factory methods for asynchronous request producers and response consumers.
- *
- * @since 4.0
- */
-public final class HttpAsyncMethods {
-
-    /**
-     * Creates asynchronous request generator for the given request message.
-     *
-     * @param target request target.
-     * @param request request message.
-     * @return asynchronous request generator
-     */
-    public static HttpAsyncRequestProducer create(final HttpHost target, final HttpRequest request) {
-        Args.notNull(target, "HTTP host");
-        Args.notNull(request, "HTTP request");
-        return new RequestProducerImpl(target, request);
-    }
-
-    /**
-     * Creates asynchronous request generator for the given request message.
-     *
-     * @param request request message.
-     * @return asynchronous request generator
-     */
-    public static HttpAsyncRequestProducer create(final HttpUriRequest request) {
-        Args.notNull(request, "HTTP request");
-        final HttpHost target = URIUtils.extractHost(request.getURI());
-        return new RequestProducerImpl(target, request);
-    }
-
-    /**
-     * Creates asynchronous {@code GET} request generator.
-     *
-     * @param requestURI request URI.
-     * @return asynchronous request generator
-     */
-    public static HttpAsyncRequestProducer createGet(final URI requestURI) {
-        return create(new HttpGet(requestURI));
-    }
-
-    /**
-     * Creates asynchronous {@code GET} request generator.
-     *
-     * @param requestURI request URI.
-     * @return asynchronous request generator
-     */
-    public static HttpAsyncRequestProducer createGet(final String requestURI) {
-        return create(new HttpGet(URI.create(requestURI)));
-    }
-
-    /**
-     * Creates asynchronous {@code HEAD} request generator.
-     *
-     * @param requestURI request URI.
-     * @return asynchronous request generator
-     */
-    public static HttpAsyncRequestProducer createHead(final URI requestURI) {
-        return create(new HttpGet(requestURI));
-    }
-
-    /**
-     * Creates asynchronous {@code HEAD} request generator.
-     *
-     * @param requestURI request URI.
-     * @return asynchronous request generator
-     */
-    public static HttpAsyncRequestProducer createHead(final String requestURI) {
-        return create(new HttpGet(URI.create(requestURI)));
-    }
-
-    /**
-     * Creates asynchronous {@code DELETE} request generator.
-     *
-     * @param requestURI request URI.
-     * @return asynchronous request generator
-     */
-    public static HttpAsyncRequestProducer createDelete(final URI requestURI) {
-        return create(new HttpDelete(requestURI));
-    }
-
-    /**
-     * Creates asynchronous {@code DELETE} request generator.
-     *
-     * @param requestURI request URI.
-     * @return asynchronous request generator
-     */
-    public static HttpAsyncRequestProducer createDelete(final String requestURI) {
-        return create(new HttpDelete(URI.create(requestURI)));
-    }
-
-    /**
-     * Creates asynchronous {@code OPTIONS} request generator.
-     *
-     * @param requestURI request URI.
-     * @return asynchronous request generator
-     */
-    public static HttpAsyncRequestProducer createOptions(final URI requestURI) {
-        return create(new HttpOptions(requestURI));
-    }
-
-    /**
-     * Creates asynchronous {@code OPTIONS} request generator.
-     *
-     * @param requestURI request URI.
-     * @return asynchronous request generator
-     */
-    public static HttpAsyncRequestProducer createOptions(final String requestURI) {
-        return create(new HttpOptions(URI.create(requestURI)));
-    }
-
-    /**
-     * Creates asynchronous {@code TRACE} request generator.
-     *
-     * @param requestURI request URI.
-     * @return asynchronous request generator
-     */
-    public static HttpAsyncRequestProducer createTrace(final URI requestURI) {
-        return create(new HttpTrace(requestURI));
-    }
-
-    /**
-     * Creates asynchronous {@code TRACE} request generator.
-     *
-     * @param requestURI request URI.
-     * @return asynchronous request generator
-     */
-    public static HttpAsyncRequestProducer createTrace(final String requestURI) {
-        return create(new HttpTrace(URI.create(requestURI)));
-    }
-
-    /**
-     * Creates asynchronous {@code POST} request generator.
-     *
-     * @param requestURI request URI.
-     * @param content request content.
-     * @param contentType request contentType.
-     * @return asynchronous request generator
-     */
-    public static HttpAsyncRequestProducer createPost(
-            final URI requestURI,
-            final String content,
-            final ContentType contentType) throws UnsupportedEncodingException {
-        final HttpPost httppost = new HttpPost(requestURI);
-        final NStringEntity entity = new NStringEntity(content, contentType);
-        httppost.setEntity(entity);
-        final HttpHost target = URIUtils.extractHost(requestURI);
-        return new RequestProducerImpl(target, httppost, entity);
-    }
-
-    /**
-     * Creates asynchronous {@code POST} request generator.
-     *
-     * @param requestURI request URI.
-     * @param content request content.
-     * @param contentType request contentType.
-     * @return asynchronous request generator
-     */
-    public static HttpAsyncRequestProducer createPost(
-            final String requestURI,
-            final String content,
-            final ContentType contentType) throws UnsupportedEncodingException {
-        return createPost(URI.create(requestURI), content, contentType);
-    }
-
-    /**
-     * Creates asynchronous {@code POST} request generator.
-     *
-     * @param requestURI request URI.
-     * @param content request content.
-     * @param contentType request contentType.
-     * @return asynchronous request generator
-     */
-    public static HttpAsyncRequestProducer createPost(
-            final URI requestURI,
-            final byte[] content,
-            final ContentType contentType) {
-        final HttpPost httppost = new HttpPost(requestURI);
-        final NByteArrayEntity entity = new NByteArrayEntity(content, contentType);
-        httppost.setEntity(entity);
-        final HttpHost target = URIUtils.extractHost(requestURI);
-        return new RequestProducerImpl(target, httppost, entity);
-    }
-
-    /**
-     * Creates asynchronous {@code POST} request generator.
-     *
-     * @param requestURI request URI.
-     * @param content request content.
-     * @param contentType request contentType.
-     * @return asynchronous request generator
-     */
-    public static HttpAsyncRequestProducer createPost(
-            final String requestURI,
-            final byte[] content,
-            final ContentType contentType) {
-        return createPost(URI.create(requestURI), content, contentType);
-    }
-
-    /**
-     * Creates asynchronous {@code PUT} request generator.
-     *
-     * @param requestURI request URI.
-     * @param content request content.
-     * @param contentType request contentType.
-     * @return asynchronous request generator
-     */
-    public static HttpAsyncRequestProducer createPut(
-            final URI requestURI,
-            final String content,
-            final ContentType contentType) throws UnsupportedEncodingException {
-        final HttpPut httpput = new HttpPut(requestURI);
-        final NStringEntity entity = new NStringEntity(content, contentType);
-        httpput.setEntity(entity);
-        final HttpHost target = URIUtils.extractHost(requestURI);
-        return new RequestProducerImpl(target, httpput, entity);
-    }
-
-    /**
-     * Creates asynchronous {@code PUT} request generator.
-     *
-     * @param requestURI request URI.
-     * @param content request content.
-     * @param contentType request contentType.
-     * @return asynchronous request generator
-     */
-    public static HttpAsyncRequestProducer createPut(
-            final String requestURI,
-            final String content,
-            final ContentType contentType) throws UnsupportedEncodingException {
-        return createPut(URI.create(requestURI), content, contentType);
-    }
-
-    /**
-     * Creates asynchronous {@code PUT} request generator.
-     *
-     * @param requestURI request URI.
-     * @param content request content.
-     * @param contentType request contentType.
-     * @return asynchronous request generator
-     */
-    public static HttpAsyncRequestProducer createPut(
-            final URI requestURI,
-            final byte[] content,
-            final ContentType contentType) {
-        final HttpPut httpput = new HttpPut(requestURI);
-        final NByteArrayEntity entity = new NByteArrayEntity(content, contentType);
-        httpput.setEntity(entity);
-        final HttpHost target = URIUtils.extractHost(requestURI);
-        return new RequestProducerImpl(target, httpput, entity);
-    }
-
-    /**
-     * Creates asynchronous {@code PUT} request generator.
-     *
-     * @param requestURI request URI.
-     * @param content request content.
-     * @param contentType request contentType.
-     * @return asynchronous request generator
-     */
-    public static HttpAsyncRequestProducer createPut(
-            final String requestURI,
-            final byte[] content,
-            final ContentType contentType) {
-        return createPut(URI.create(requestURI), content, contentType);
-    }
-
-    /**
-     * Creates asynchronous zero-copy {@code POST} request generator.
-     *
-     * @param requestURI request URI.
-     * @param content request content.
-     * @param contentType request contentType.
-     * @return asynchronous request generator
-     */
-    public static HttpAsyncRequestProducer createZeroCopyPost(
-            final URI requestURI,
-            final File content,
-            final ContentType contentType) throws FileNotFoundException {
-        return new ZeroCopyPost(requestURI, content, contentType);
-    }
-
-    /**
-     * Creates asynchronous zero-copy {@code POST} request generator.
-     *
-     * @param requestURI request URI.
-     * @param content request content.
-     * @param contentType request contentType.
-     * @return asynchronous request generator
-     */
-    public static HttpAsyncRequestProducer createZeroCopyPost(
-            final String requestURI,
-            final File content,
-            final ContentType contentType) throws FileNotFoundException {
-        return new ZeroCopyPost(URI.create(requestURI), content, contentType);
-    }
-
-    /**
-     * Creates asynchronous zero-copy {@code PUT} request generator.
-     *
-     * @param requestURI request URI.
-     * @param content request content.
-     * @param contentType request contentType.
-     * @return asynchronous request generator
-     */
-    public static HttpAsyncRequestProducer createZeroCopyPut(
-            final URI requestURI,
-            final File content,
-            final ContentType contentType) throws FileNotFoundException {
-        return new ZeroCopyPut(requestURI, content, contentType);
-    }
-
-    /**
-     * Creates asynchronous zero-copy {@code PUT} request generator.
-     *
-     * @param requestURI request URI.
-     * @param content request content.
-     * @param contentType request contentType.
-     * @return asynchronous request generator
-     */
-    public static HttpAsyncRequestProducer createZeroCopyPut(
-            final String requestURI,
-            final File content,
-            final ContentType contentType) throws FileNotFoundException {
-        return new ZeroCopyPut(URI.create(requestURI), content, contentType);
-    }
-
-    /**
-     * Creates basic response consumer that will buffer response content in memory.
-     * @return asynchronous response consumer.
-     */
-    public static HttpAsyncResponseConsumer<HttpResponse> createConsumer() {
-        return new BasicAsyncResponseConsumer();
-    }
-
-    /**
-     * Creates zero-copy response consumer that will stream response content
-     * directly to the given file.
-     * @return asynchronous response consumer.
-     */
-    public static HttpAsyncResponseConsumer<HttpResponse> createZeroCopyConsumer(
-            final File file) throws FileNotFoundException {
-        return new ZeroCopyConsumer<HttpResponse>(file) {
-
-            @Override
-            protected HttpResponse process(
-                    final HttpResponse response,
-                    final File file,
-                    final ContentType contentType) {
-                return response;
-            }
-
-        };
-    }
-
-    static class RequestProducerImpl extends BasicAsyncRequestProducer {
-
-        protected RequestProducerImpl(
-                final HttpHost target,
-                final HttpEntityEnclosingRequest request,
-                final HttpAsyncContentProducer producer) {
-            super(target, request, producer);
-        }
-
-        public RequestProducerImpl(final HttpHost target, final HttpRequest request) {
-            super(target, request);
-        }
-
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/nio/client/methods/ZeroCopyConsumer.java b/httpasyncclient/src/main/java/org/apache/http/nio/client/methods/ZeroCopyConsumer.java
deleted file mode 100644
index 24a556f..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/nio/client/methods/ZeroCopyConsumer.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.client.methods;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.nio.channels.FileChannel;
-
-import org.apache.http.Header;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.entity.ContentType;
-import org.apache.http.entity.FileEntity;
-import org.apache.http.nio.ContentDecoder;
-import org.apache.http.nio.ContentDecoderChannel;
-import org.apache.http.nio.FileContentDecoder;
-import org.apache.http.nio.IOControl;
-import org.apache.http.nio.protocol.AbstractAsyncResponseConsumer;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.util.Asserts;
-
-/**
- * {@link org.apache.http.nio.protocol.HttpAsyncResponseConsumer} implementation that
- * streams content entity enclosed in an HTTP response directly into a file
- * without an intermediate in-memory buffer.
- * <p>
- * This consumer can be useful for file downloads.
- *
- * @since 4.0
- */
-public abstract class ZeroCopyConsumer<T> extends AbstractAsyncResponseConsumer<T> {
-
-    private final File file;
-    private final RandomAccessFile accessfile;
-
-    private HttpResponse response;
-    private ContentType contentType;
-    private Header contentEncoding;
-    private FileChannel fileChannel;
-    private long idx = -1;
-
-    public ZeroCopyConsumer(final File file) throws FileNotFoundException {
-        super();
-        if (file == null) {
-            throw new IllegalArgumentException("File may nor be null");
-        }
-        this.file = file;
-        this.accessfile = new RandomAccessFile(this.file, "rw");
-    }
-
-    @Override
-    protected void onResponseReceived(final HttpResponse response) {
-        this.response = response;
-    }
-
-    @Override
-    protected void onEntityEnclosed(
-            final HttpEntity entity, final ContentType contentType) throws IOException {
-        this.contentType = contentType;
-        this.contentEncoding = entity.getContentEncoding();
-        this.fileChannel = this.accessfile.getChannel();
-        this.idx = 0;
-    }
-
-    @Override
-    protected void onContentReceived(
-            final ContentDecoder decoder, final IOControl ioctrl) throws IOException {
-        Asserts.notNull(this.fileChannel, "File channel");
-        final long transferred;
-        if (decoder instanceof FileContentDecoder) {
-            transferred = ((FileContentDecoder)decoder).transfer(
-                    this.fileChannel, this.idx, Integer.MAX_VALUE);
-        } else {
-            transferred = this.fileChannel.transferFrom(
-                    new ContentDecoderChannel(decoder), this.idx, Integer.MAX_VALUE);
-        }
-        if (transferred > 0) {
-            this.idx += transferred;
-        }
-        if (decoder.isCompleted()) {
-            this.fileChannel.close();
-        }
-    }
-
-    /**
-     * Invoked to process received file.
-     *
-     * @param response original response head.
-     * @param file file containing response content.
-     * @param contentType the cotnent type.
-     * @return result of the response processing
-     */
-    protected abstract T process(
-            HttpResponse response, File file, ContentType contentType) throws Exception;
-
-    @Override
-    protected T buildResult(final HttpContext context) throws Exception {
-        final FileEntity entity = new FileEntity(this.file, this.contentType);
-        entity.setContentEncoding(this.contentEncoding);
-        this.response.setEntity(entity);
-        return process(this.response, this.file, this.contentType);
-    }
-
-    @Override
-    protected void releaseResources() {
-        try {
-            this.accessfile.close();
-        } catch (final IOException ignore) {
-        }
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/nio/client/methods/ZeroCopyPost.java b/httpasyncclient/src/main/java/org/apache/http/nio/client/methods/ZeroCopyPost.java
deleted file mode 100644
index f061f9d..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/nio/client/methods/ZeroCopyPost.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.client.methods;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.net.URI;
-
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpEntityEnclosingRequest;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.ContentType;
-
-/**
- * {@link org.apache.http.nio.protocol.HttpAsyncRequestProducer} implementation
- * that generates an HTTP {@code POST} request enclosing content of a file.
- * The request content will be streamed out directly from the underlying file
- * without an intermediate in-memory buffer.
- *
- * @since 4.0
- */
-public class ZeroCopyPost extends BaseZeroCopyRequestProducer {
-
-    public ZeroCopyPost(
-            final URI requestURI,
-            final File content,
-            final ContentType contentType) throws FileNotFoundException {
-        super(requestURI, content, contentType);
-    }
-
-    public ZeroCopyPost(
-            final String requestURI,
-            final File content,
-            final ContentType contentType) throws FileNotFoundException {
-        super(URI.create(requestURI), content, contentType);
-    }
-
-    @Override
-    protected HttpEntityEnclosingRequest createRequest(final URI requestURI, final HttpEntity entity) {
-        final HttpPost httppost = new HttpPost(requestURI);
-        httppost.setEntity(entity);
-        return httppost;
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/nio/client/methods/ZeroCopyPut.java b/httpasyncclient/src/main/java/org/apache/http/nio/client/methods/ZeroCopyPut.java
deleted file mode 100644
index ae257d7..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/nio/client/methods/ZeroCopyPut.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.client.methods;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.net.URI;
-
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpEntityEnclosingRequest;
-import org.apache.http.client.methods.HttpPut;
-import org.apache.http.entity.ContentType;
-
-/**
- * {@link org.apache.http.nio.protocol.HttpAsyncRequestProducer} implementation
- * that generates an HTTP {@code PUT} request enclosing content of a file.
- * The request content will be streamed out directly from the underlying file
- * without an intermediate in-memory buffer.
- *
- * @since 4.0
- */
-public class ZeroCopyPut extends BaseZeroCopyRequestProducer {
-
-    public ZeroCopyPut(
-            final URI requestURI,
-            final File content,
-            final ContentType contentType) throws FileNotFoundException {
-        super(requestURI, content, contentType);
-    }
-
-    public ZeroCopyPut(
-            final String requestURI,
-            final File content,
-            final ContentType contentType) throws FileNotFoundException {
-        super(URI.create(requestURI), content, contentType);
-    }
-
-    @Override
-    protected HttpEntityEnclosingRequest createRequest(final URI requestURI, final HttpEntity entity) {
-        final HttpPut httpput = new HttpPut(requestURI);
-        httpput.setEntity(entity);
-        return httpput;
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/nio/client/methods/package-info.java b/httpasyncclient/src/main/java/org/apache/http/nio/client/methods/package-info.java
deleted file mode 100644
index 9fa081d..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/nio/client/methods/package-info.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-/**
- * Asynchronous HTTP method implementations.
- */
-package org.apache.http.nio.client.methods;
diff --git a/httpasyncclient/src/main/java/org/apache/http/nio/client/package-info.java b/httpasyncclient/src/main/java/org/apache/http/nio/client/package-info.java
deleted file mode 100644
index 7ce425c..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/nio/client/package-info.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-/**
- * Asynchronous HTTP client communication APIs.
- */
-package org.apache.http.nio.client;
diff --git a/httpasyncclient/src/main/java/org/apache/http/nio/client/util/HttpAsyncClientUtils.java b/httpasyncclient/src/main/java/org/apache/http/nio/client/util/HttpAsyncClientUtils.java
deleted file mode 100644
index 42e5bec..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/nio/client/util/HttpAsyncClientUtils.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.client.util;
-
-import java.io.IOException;
-
-import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
-
-/**
- * Static helpers for dealing with {@link org.apache.http.nio.client.HttpAsyncClient}.
- */
-public class HttpAsyncClientUtils {
-
-    private HttpAsyncClientUtils() {
-    }
-
-    /**
-     * Unconditionally close a httpAsyncClient. Shuts down the underlying
-     * connection manager and releases the resources.
-     * <p>
-     * Example Code:
-     *
-     * <pre>
-     * HttpAsyncClient httpAsyncClient = null;
-     * try {
-     *   httpAsyncClient = ...;
-     * } catch (Exception e) {
-     *   // error handling
-     * } finally {
-     *   HttpAsyncClientUtils.closeQuietly(httpAsyncClient);
-     * }
-     * </pre>
-     *
-     * @param httpAsyncClient
-     *            the HttpAsyncClient to close, may be null or already closed.
-     */
-    public static void closeQuietly(final CloseableHttpAsyncClient httpAsyncClient) {
-        if (httpAsyncClient != null) {
-            try {
-                httpAsyncClient.close();
-            } catch (final IOException ignore) {
-            }
-        }
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/nio/client/util/package-info.java b/httpasyncclient/src/main/java/org/apache/http/nio/client/util/package-info.java
deleted file mode 100644
index 440881b..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/nio/client/util/package-info.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-/**
- * Asynchronous client utility classes.
- */
-package org.apache.http.nio.client.util;
diff --git a/httpasyncclient/src/main/java/org/apache/http/nio/conn/ManagedNHttpClientConnection.java b/httpasyncclient/src/main/java/org/apache/http/nio/conn/ManagedNHttpClientConnection.java
deleted file mode 100644
index d25343d..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/nio/conn/ManagedNHttpClientConnection.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.conn;
-
-import javax.net.ssl.SSLSession;
-
-import org.apache.http.HttpInetConnection;
-import org.apache.http.nio.NHttpClientConnection;
-import org.apache.http.nio.reactor.IOSession;
-
-/**
- * Represents a managed connection whose state and life cycle is managed by
- * a connection manager. This interface extends {@link NHttpClientConnection}
- * with methods to bind the connection to an arbitrary {@link IOSession} and
- * to obtain SSL session details.
- *
- * @since 4.0
- */
-public interface ManagedNHttpClientConnection extends NHttpClientConnection, HttpInetConnection {
-
-    /**
-     * Returns connection ID which is expected to be unique
-     * for the life span of the connection manager.
-     */
-    String getId();
-
-    /**
-     * Binds connection to the given I/O session.
-     */
-    void bind(IOSession iosession);
-
-    /**
-     * Returns the underlying I/O session.
-     */
-    IOSession getIOSession();
-
-    /**
-     * Obtains the SSL session of the underlying connection, if any.
-     *
-     * @return  the underlying SSL session if available,
-     *          {@code null} otherwise
-     */
-    SSLSession getSSLSession();
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpClientConnectionManager.java b/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpClientConnectionManager.java
deleted file mode 100644
index a886389..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpClientConnectionManager.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.conn;
-
-import java.io.IOException;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.http.concurrent.FutureCallback;
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.nio.NHttpClientConnection;
-import org.apache.http.nio.reactor.IOEventDispatch;
-import org.apache.http.protocol.HttpContext;
-
-/**
- * Represents a manager of persistent client connections.
- * <p>
- * The purpose of an HTTP connection manager is to serve as a factory for new
- * HTTP connections, manage persistent connections and synchronize access to
- * persistent connections making sure that only one thread of execution can
- * have access to a connection at a time.
- * <p>
- * Implementations of this interface must be thread-safe. Access to shared
- * data must be synchronized as methods of this interface may be executed
- * from multiple threads.
- *
- * @since 4.0
- */
-public interface NHttpClientConnectionManager {
-
-    /**
-     * Returns a {@link Future} for a {@link NHttpClientConnection}.
-     * <p>
-     * Please note that the consumer of that connection is responsible
-     * for fully establishing the route the to the connection target
-     * by calling {@link #startRoute(org.apache.http.nio.NHttpClientConnection,
-     *   org.apache.http.conn.routing.HttpRoute,
-     *   org.apache.http.protocol.HttpContext) startRoute} in order to start
-     * the process of connection initialization, optionally calling
-     * {@link #upgrade(org.apache.http.nio.NHttpClientConnection,
-     *   org.apache.http.conn.routing.HttpRoute,
-     *   org.apache.http.protocol.HttpContext) upgrade} method to upgrade
-     * the connection after having executed {@code CONNECT} method to
-     * all intermediate proxy hops and and finally calling
-     * {@link #routeComplete(org.apache.http.nio.NHttpClientConnection,
-     *   org.apache.http.conn.routing.HttpRoute,
-     *   org.apache.http.protocol.HttpContext) routeComplete} to mark the route
-     * as fully completed.
-     *
-     * @param route HTTP route of the requested connection.
-     * @param state expected state of the connection or {@code null}
-     *              if the connection is not expected to carry any state.
-     * @param connectTimeout connect timeout.
-     * @param connectionRequestTimeout  connection request timeout.
-     * @param timeUnit time unit of the previous two timeout values.
-     * @param callback future callback.
-     */
-    Future<NHttpClientConnection> requestConnection(
-            HttpRoute route,
-            Object state,
-            long connectTimeout,
-            long connectionRequestTimeout,
-            TimeUnit timeUnit,
-            FutureCallback<NHttpClientConnection> callback);
-
-    /**
-     * Releases the connection back to the manager making it potentially
-     * re-usable by other consumers. Optionally, the maximum period
-     * of how long the manager should keep the connection alive can be
-     * defined using {@code validDuration} and {@code timeUnit}
-     * parameters.
-     *
-     * @param conn      the managed connection to release.
-     * @param validDuration the duration of time this connection is valid for reuse.
-     * @param timeUnit the time unit.
-     *
-     * @see #closeExpiredConnections()
-     */
-    void releaseConnection(
-            NHttpClientConnection conn, Object newState, long validDuration, TimeUnit timeUnit);
-
-    /**
-     * Starts the process of connection initialization. Connection route may consist of several
-     * intermediate hops and may require a protocol upgrade. Once the route is fully established
-     * the {@link #routeComplete(org.apache.http.nio.NHttpClientConnection,
-     *   org.apache.http.conn.routing.HttpRoute,
-     *   org.apache.http.protocol.HttpContext) routeComplete} method must be called.
-     *
-     * @param conn the managed connection to initialize.
-     * @param route the connection route.
-     * @param context the context
-     */
-    void startRoute(
-            NHttpClientConnection conn,
-            HttpRoute route,
-            HttpContext context) throws IOException;
-
-    /**
-     * Upgrades the underlying connection I/O session to TLS/SSL (or another layering
-     * protocol) after having executed {@code CONNECT} method to all
-     * intermediate proxy hops.
-     *
-     * @param conn the managed connection to upgrade.
-     * @param route the connection route.
-     * @param context the context
-     */
-    void upgrade(
-            NHttpClientConnection conn,
-            HttpRoute route,
-            HttpContext context) throws IOException;
-
-    /**
-     * Marks the connection as fully established with all its intermediate
-     * hops completed.
-     *
-     * @param conn the managed connection to mark as route complete.
-     * @param route the connection route.
-     * @param context the context
-     */
-    void routeComplete(
-            NHttpClientConnection conn,
-            HttpRoute route,
-            HttpContext context);
-
-    /**
-     * Determines if the given connection has been fully established and
-     * marked as route complete.
-     *
-     * @param conn the managed connection.
-     */
-    boolean isRouteComplete(NHttpClientConnection conn);
-
-    /**
-     * Closes idle connections in the pool.
-     * <p>
-     * Open connections in the pool that have not been used for the
-     * timespan given by the argument will be closed.
-     * Currently allocated connections are not subject to this method.
-     * Times will be checked with milliseconds precision
-     *
-     * All expired connections will also be closed.
-     *
-     * @param idletime  the idle time of connections to be closed
-     * @param tunit     the unit for the {@code idletime}
-     *
-     * @see #closeExpiredConnections()
-     */
-    void closeIdleConnections(long idletime, TimeUnit tunit);
-
-    /**
-     * Closes all expired connections in the pool.
-     * <p>
-     * Open connections in the pool that have not been used for
-     * the timespan defined when the connection was released will be closed.
-     * Currently allocated connections are not subject to this method.
-     * Times will be checked with milliseconds precision.
-     */
-    void closeExpiredConnections();
-
-    /**
-     * Starts the underlying I/O reactor and initiates the dispatch of
-     * I/O event notifications to the given {@link IOEventDispatch}.
-     */
-    void execute(IOEventDispatch eventDispatch) throws IOException;
-
-    /**
-     * Shuts down this connection manager and releases allocated resources.
-     * This includes closing all connections, whether they are currently
-     * used or not.
-     */
-    void shutdown() throws IOException;
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpConnectionFactory.java b/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpConnectionFactory.java
deleted file mode 100644
index 0b87925..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpConnectionFactory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.conn;
-
-import org.apache.http.config.ConnectionConfig;
-import org.apache.http.nio.NHttpConnection;
-import org.apache.http.nio.reactor.IOSession;
-
-/**
- * Generic {@link NHttpConnection} factory.
- *
- * @since 4.0
- */
-public interface NHttpConnectionFactory<T extends NHttpConnection> {
-
-    T create(IOSession iosession, ConnectionConfig config);
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/nio/conn/NoopIOSessionStrategy.java b/httpasyncclient/src/main/java/org/apache/http/nio/conn/NoopIOSessionStrategy.java
deleted file mode 100644
index e88053b..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/nio/conn/NoopIOSessionStrategy.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.conn;
-
-import org.apache.http.HttpHost;
-import org.apache.http.nio.reactor.IOSession;
-
-/**
- * Noop implementation for protocol schemes that have no transport level
- * security.
- *
- * @since 4.0
- */
-public class NoopIOSessionStrategy implements SchemeIOSessionStrategy {
-
-    public static final NoopIOSessionStrategy INSTANCE = new NoopIOSessionStrategy();
-
-    @Override
-    public IOSession upgrade(final HttpHost host, final IOSession iosession) {
-        return iosession;
-    }
-
-    @Override
-    public boolean isLayeringRequired() {
-        return false;
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/nio/conn/SchemeIOSessionStrategy.java b/httpasyncclient/src/main/java/org/apache/http/nio/conn/SchemeIOSessionStrategy.java
deleted file mode 100644
index b9b1037..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/nio/conn/SchemeIOSessionStrategy.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.conn;
-
-import org.apache.http.HttpHost;
-import org.apache.http.nio.reactor.IOSession;
-
-import java.io.IOException;
-
-/**
- * I/O session layering strategy for complex protocol schemes, which employ
- * a transport level security protocol to secure HTTP communication
- * (in other words those schemes 'layer' HTTP on top of a transport level
- * protocol such as TLS/SSL).
- *
- * @since 4.0
- */
-public interface SchemeIOSessionStrategy {
-
-    /**
-     * Determines whether or not protocol layering is required. If this method
-     * returns {@code false} the {@link #upgrade(org.apache.http.HttpHost,
-     * org.apache.http.nio.reactor.IOSession) upgrade} method  is expected
-     * to have no effect and should not be called.
-     */
-    boolean isLayeringRequired();
-
-    /**
-     * Decorates the original {@link IOSession} with a transport level security
-     * protocol implementation.
-     * @param host the target host.
-     * @param iosession the I/O session.
-     * @return upgraded I/O session.
-     */
-    IOSession upgrade(HttpHost host, IOSession iosession) throws IOException;
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/nio/conn/package-info.java b/httpasyncclient/src/main/java/org/apache/http/nio/conn/package-info.java
deleted file mode 100644
index 0562ff8..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/nio/conn/package-info.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-/**
- * Asynchronous client connection management APIs.
- */
-package org.apache.http.nio.conn;
diff --git a/httpasyncclient/src/main/java/org/apache/http/nio/conn/ssl/SSLIOSessionStrategy.java b/httpasyncclient/src/main/java/org/apache/http/nio/conn/ssl/SSLIOSessionStrategy.java
deleted file mode 100644
index 29d6b47..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/nio/conn/ssl/SSLIOSessionStrategy.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.http.nio.conn.ssl;
-
-import java.io.IOException;
-import java.security.cert.Certificate;
-import java.security.cert.X509Certificate;
-
-import javax.net.ssl.HostnameVerifier;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLEngine;
-import javax.net.ssl.SSLException;
-import javax.net.ssl.SSLPeerUnverifiedException;
-import javax.net.ssl.SSLSession;
-import javax.security.auth.x500.X500Principal;
-
-import org.apache.http.HttpHost;
-import org.apache.http.conn.ssl.AllowAllHostnameVerifier;
-import org.apache.http.conn.ssl.BrowserCompatHostnameVerifier;
-import org.apache.http.conn.ssl.DefaultHostnameVerifier;
-import org.apache.http.conn.ssl.StrictHostnameVerifier;
-import org.apache.http.conn.ssl.X509HostnameVerifier;
-import org.apache.http.conn.util.PublicSuffixMatcherLoader;
-import org.apache.http.nio.conn.SchemeIOSessionStrategy;
-import org.apache.http.nio.reactor.IOSession;
-import org.apache.http.nio.reactor.ssl.SSLIOSession;
-import org.apache.http.nio.reactor.ssl.SSLMode;
-import org.apache.http.nio.reactor.ssl.SSLSetupHandler;
-import org.apache.http.ssl.SSLContexts;
-import org.apache.http.util.Args;
-import org.apache.http.util.Asserts;
-import org.apache.http.util.TextUtils;
-
-/**
- * TLS/SSL transport level security strategy.
- *
- * @since 4.0
- */
-public class SSLIOSessionStrategy implements SchemeIOSessionStrategy {
-
-    @Deprecated
-    public static final X509HostnameVerifier ALLOW_ALL_HOSTNAME_VERIFIER =
-            new AllowAllHostnameVerifier();
-
-    @Deprecated
-    public static final X509HostnameVerifier BROWSER_COMPATIBLE_HOSTNAME_VERIFIER =
-            new BrowserCompatHostnameVerifier();
-
-    @Deprecated
-    public static final X509HostnameVerifier STRICT_HOSTNAME_VERIFIER =
-            new StrictHostnameVerifier();
-
-    private static String[] split(final String s) {
-        if (TextUtils.isBlank(s)) {
-            return null;
-        }
-        return s.split(" *, *");
-    }
-
-    /**
-     * @since 4.1
-     */
-    public static HostnameVerifier getDefaultHostnameVerifier() {
-        return new DefaultHostnameVerifier(PublicSuffixMatcherLoader.getDefault());
-    }
-
-    public static SSLIOSessionStrategy getDefaultStrategy() {
-        return new SSLIOSessionStrategy(
-                SSLContexts.createDefault(),
-                getDefaultHostnameVerifier());
-    }
-
-    public static SSLIOSessionStrategy getSystemDefaultStrategy() {
-        return new SSLIOSessionStrategy(
-                SSLContexts.createSystemDefault(),
-                split(System.getProperty("https.protocols")),
-                split(System.getProperty("https.cipherSuites")),
-                getDefaultHostnameVerifier());
-    }
-
-    private final SSLContext sslContext;
-    private final String[] supportedProtocols;
-    private final String[] supportedCipherSuites;
-    private final HostnameVerifier hostnameVerifier;
-
-    /**
-     * @deprecated (4.1) use {@link SSLIOSessionStrategy#SSLIOSessionStrategy(
-     *   javax.net.ssl.SSLContext, String[], String[], javax.net.ssl.HostnameVerifier)}
-     */
-    @Deprecated
-    public SSLIOSessionStrategy(
-            final SSLContext sslContext,
-            final String[] supportedProtocols,
-            final String[] supportedCipherSuites,
-            final X509HostnameVerifier hostnameVerifier) {
-        this(sslContext, supportedProtocols, supportedCipherSuites, (HostnameVerifier) hostnameVerifier);
-    }
-
-    /**
-     * @deprecated (4.1)
-     */
-    @Deprecated
-    public SSLIOSessionStrategy(
-            final SSLContext sslcontext,
-            final X509HostnameVerifier hostnameVerifier) {
-        this(sslcontext, null, null, (HostnameVerifier) hostnameVerifier);
-    }
-
-    /**
-     * @since 4.1
-     */
-    public SSLIOSessionStrategy(
-            final SSLContext sslContext,
-            final String[] supportedProtocols,
-            final String[] supportedCipherSuites,
-            final HostnameVerifier hostnameVerifier) {
-        super();
-        this.sslContext = Args.notNull(sslContext, "SSL context");
-        this.supportedProtocols = supportedProtocols;
-        this.supportedCipherSuites = supportedCipherSuites;
-        this.hostnameVerifier = hostnameVerifier != null ? hostnameVerifier : getDefaultHostnameVerifier();
-    }
-
-    /**
-     * @since 4.1
-     */
-    public SSLIOSessionStrategy(
-            final SSLContext sslcontext,
-            final HostnameVerifier hostnameVerifier) {
-        this(sslcontext, null, null, hostnameVerifier);
-    }
-
-    public SSLIOSessionStrategy(final SSLContext sslcontext) {
-        this(sslcontext, null, null, getDefaultHostnameVerifier());
-    }
-
-    @Override
-    public SSLIOSession upgrade(final HttpHost host, final IOSession iosession) throws IOException {
-        Asserts.check(!(iosession instanceof SSLIOSession), "I/O session is already upgraded to TLS/SSL");
-        final SSLIOSession ssliosession = new SSLIOSession(
-            iosession,
-            SSLMode.CLIENT,
-            host,
-            this.sslContext,
-            new SSLSetupHandler() {
-
-                @Override
-                public void initalize(
-                        final SSLEngine sslengine) throws SSLException {
-                    if (supportedProtocols != null) {
-                        sslengine.setEnabledProtocols(supportedProtocols);
-                    }
-                    if (supportedCipherSuites != null) {
-                        sslengine.setEnabledCipherSuites(supportedCipherSuites);
-                    }
-                    initializeEngine(sslengine);
-                }
-
-                @Override
-                public void verify(
-                        final IOSession iosession,
-                        final SSLSession sslsession) throws SSLException {
-                    verifySession(host, iosession, sslsession);
-                }
-
-        });
-        iosession.setAttribute(SSLIOSession.SESSION_KEY, ssliosession);
-        ssliosession.initialize();
-        return ssliosession;
-    }
-
-    protected void initializeEngine(final SSLEngine engine) {
-    }
-
-    protected void verifySession(
-            final HttpHost host,
-            final IOSession iosession,
-            final SSLSession sslsession) throws SSLException {
-        if (!this.hostnameVerifier.verify(host.getHostName(), sslsession)) {
-            final Certificate[] certs = sslsession.getPeerCertificates();
-            final X509Certificate x509 = (X509Certificate) certs[0];
-            final X500Principal x500Principal = x509.getSubjectX500Principal();
-            throw new SSLPeerUnverifiedException("Host name '" + host.getHostName() + "' does not match " +
-                    "the certificate subject provided by the peer (" + x500Principal.toString() + ")");
-        }
-    }
-
-    @Override
-    public boolean isLayeringRequired() {
-        return true;
-    }
-
-}
diff --git a/httpasyncclient/src/main/java/org/apache/http/nio/conn/ssl/package-info.java b/httpasyncclient/src/main/java/org/apache/http/nio/conn/ssl/package-info.java
deleted file mode 100644
index bc2a5b5..0000000
--- a/httpasyncclient/src/main/java/org/apache/http/nio/conn/ssl/package-info.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-/**
- * Asynchronous client TLS/SSL support.
- */
-package org.apache.http.nio.conn.ssl;
diff --git a/httpasyncclient/src/main/resources/org/apache/http/nio/client/version.properties b/httpasyncclient/src/main/resources/org/apache/http/nio/client/version.properties
deleted file mode 100644
index 2c67ce8..0000000
--- a/httpasyncclient/src/main/resources/org/apache/http/nio/client/version.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-info.module    = HttpAsyncClient
-info.release   = ${pom.version}
-info.timestamp = ${mvn.timestamp}
-# timestamp requires Maven 2.1
diff --git a/httpasyncclient/src/test/java/org/apache/http/impl/nio/conn/CPoolUtils.java b/httpasyncclient/src/test/java/org/apache/http/impl/nio/conn/CPoolUtils.java
deleted file mode 100644
index 0148327..0000000
--- a/httpasyncclient/src/test/java/org/apache/http/impl/nio/conn/CPoolUtils.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.conn;
-
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.nio.NHttpClientConnection;
-import org.apache.http.nio.conn.ManagedNHttpClientConnection;
-import org.apache.http.pool.PoolEntry;
-
-public class CPoolUtils {
-
-    public static PoolEntry<HttpRoute, ManagedNHttpClientConnection> getPoolEntry(final NHttpClientConnection managedConn) {
-        return CPoolProxy.getPoolEntry(managedConn);
-    }
-
-}
diff --git a/httpasyncclient/src/test/java/org/apache/http/impl/nio/conn/TestPoolingHttpClientAsyncConnectionManager.java b/httpasyncclient/src/test/java/org/apache/http/impl/nio/conn/TestPoolingHttpClientAsyncConnectionManager.java
deleted file mode 100644
index 8d6e8f2..0000000
--- a/httpasyncclient/src/test/java/org/apache/http/impl/nio/conn/TestPoolingHttpClientAsyncConnectionManager.java
+++ /dev/null
@@ -1,601 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.impl.nio.conn;
-
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.util.Calendar;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.commons.logging.Log;
-import org.apache.http.HttpHost;
-import org.apache.http.concurrent.FutureCallback;
-import org.apache.http.config.ConnectionConfig;
-import org.apache.http.config.Registry;
-import org.apache.http.config.RegistryBuilder;
-import org.apache.http.conn.DnsResolver;
-import org.apache.http.conn.SchemePortResolver;
-import org.apache.http.conn.UnsupportedSchemeException;
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager.ConfigData;
-import org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager.InternalAddressResolver;
-import org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager.InternalConnectionFactory;
-import org.apache.http.nio.NHttpClientConnection;
-import org.apache.http.nio.conn.ManagedNHttpClientConnection;
-import org.apache.http.nio.conn.NHttpConnectionFactory;
-import org.apache.http.nio.conn.SchemeIOSessionStrategy;
-import org.apache.http.nio.reactor.ConnectingIOReactor;
-import org.apache.http.nio.reactor.IOSession;
-import org.apache.http.nio.reactor.SessionRequest;
-import org.apache.http.protocol.BasicHttpContext;
-import org.apache.http.protocol.HttpContext;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.Matchers;
-import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.MockitoAnnotations;
-
-public class TestPoolingHttpClientAsyncConnectionManager {
-
-    @Mock
-    private ConnectingIOReactor ioreactor;
-    @Mock
-    private CPool pool;
-    @Mock
-    private SchemeIOSessionStrategy noopStrategy;
-    @Mock
-    private SchemeIOSessionStrategy sslStrategy;
-    @Mock
-    private SchemePortResolver schemePortResolver;
-    @Mock
-    private DnsResolver dnsResolver;
-    @Mock
-    private FutureCallback<NHttpClientConnection> connCallback;
-    @Captor
-    private ArgumentCaptor<FutureCallback<CPoolEntry>> poolEntryCallbackCaptor;
-    @Mock
-    private ManagedNHttpClientConnection conn;
-    @Mock
-    private NHttpConnectionFactory<ManagedNHttpClientConnection> connFactory;
-    @Mock
-    private SessionRequest sessionRequest;
-    @Mock
-    private IOSession iosession;
-
-    private Registry<SchemeIOSessionStrategy> layeringStrategyRegistry;
-    private PoolingNHttpClientConnectionManager connman;
-
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-        Mockito.when(sslStrategy.isLayeringRequired()).thenReturn(Boolean.TRUE);
-
-        layeringStrategyRegistry = RegistryBuilder.<SchemeIOSessionStrategy>create()
-            .register("http", noopStrategy)
-            .register("https", sslStrategy)
-            .build();
-        connman = new PoolingNHttpClientConnectionManager(
-            ioreactor, pool, layeringStrategyRegistry);
-    }
-
-    @Test
-    public void testShutdown() throws Exception {
-        connman.shutdown();
-
-        Mockito.verify(pool).shutdown(2000);
-    }
-
-    @Test
-    public void testShutdownMs() throws Exception {
-        connman.shutdown(500);
-
-        Mockito.verify(pool).shutdown(500);
-    }
-
-    @Test
-    public void testRequestReleaseConnection() throws Exception {
-        final HttpHost target = new HttpHost("localhost");
-        final HttpRoute route = new HttpRoute(target);
-        final Future<NHttpClientConnection> future = connman.requestConnection(
-            route, "some state", 1000L, 2000L, TimeUnit.MILLISECONDS, connCallback);
-        Assert.assertNotNull(future);
-
-        Mockito.verify(pool).lease(
-                Matchers.same(route),
-                Matchers.eq("some state"),
-                Matchers.eq(1000L),
-                Matchers.eq(2000L),
-                Matchers.eq(TimeUnit.MILLISECONDS),
-                poolEntryCallbackCaptor.capture());
-        final FutureCallback<CPoolEntry> callaback = poolEntryCallbackCaptor.getValue();
-        final Log log = Mockito.mock(Log.class);
-        final CPoolEntry poolentry = new CPoolEntry(log, "some-id", route, conn, -1, TimeUnit.MILLISECONDS);
-        poolentry.markRouteComplete();
-        callaback.completed(poolentry);
-
-        Assert.assertTrue(future.isDone());
-        final NHttpClientConnection managedConn = future.get();
-        Mockito.verify(connCallback).completed(Matchers.<NHttpClientConnection>any());
-
-        Mockito.when(conn.isOpen()).thenReturn(Boolean.TRUE);
-        connman.releaseConnection(managedConn, "new state", 5, TimeUnit.SECONDS);
-
-        Mockito.verify(pool).release(poolentry, true);
-        Assert.assertEquals("new state", poolentry.getState());
-        final Calendar cal = Calendar.getInstance();
-        cal.setTimeInMillis(poolentry.getUpdated());
-        cal.add(Calendar.SECOND, 5);
-        Assert.assertEquals(cal.getTimeInMillis(), poolentry.getExpiry());
-    }
-
-    @Test
-    public void testReleaseConnectionIncompleteRoute() throws Exception {
-        final HttpHost target = new HttpHost("localhost");
-        final HttpRoute route = new HttpRoute(target);
-        final Future<NHttpClientConnection> future = connman.requestConnection(
-            route, "some state", 1000L, 2000L, TimeUnit.MILLISECONDS, connCallback);
-        Assert.assertNotNull(future);
-
-        Mockito.verify(pool).lease(
-                Matchers.same(route),
-                Matchers.eq("some state"),
-                Matchers.eq(1000L),
-                Matchers.eq(2000L),
-                Matchers.eq(TimeUnit.MILLISECONDS),
-                poolEntryCallbackCaptor.capture());
-        final FutureCallback<CPoolEntry> callaback = poolEntryCallbackCaptor.getValue();
-        final Log log = Mockito.mock(Log.class);
-        final CPoolEntry poolentry = new CPoolEntry(log, "some-id", route, conn, -1, TimeUnit.MILLISECONDS);
-        callaback.completed(poolentry);
-
-        Assert.assertTrue(future.isDone());
-        final NHttpClientConnection managedConn = future.get();
-        Mockito.verify(connCallback).completed(Matchers.<NHttpClientConnection>any());
-
-        Mockito.when(conn.isOpen()).thenReturn(Boolean.TRUE);
-        connman.releaseConnection(managedConn, "new state", 5, TimeUnit.SECONDS);
-
-        Mockito.verify(pool).release(poolentry, false);
-    }
-
-    @Test
-    public void testRequestConnectionFutureCancelled() throws Exception {
-        final HttpHost target = new HttpHost("localhost");
-        final HttpRoute route = new HttpRoute(target);
-        final Future<NHttpClientConnection> future = connman.requestConnection(
-            route, "some state", 1000L, 2000L, TimeUnit.MILLISECONDS, null);
-        Assert.assertNotNull(future);
-        future.cancel(true);
-
-        Mockito.verify(pool).lease(
-                Matchers.same(route),
-                Matchers.eq("some state"),
-                Matchers.eq(1000L),
-                Matchers.eq(2000L),
-                Matchers.eq(TimeUnit.MILLISECONDS),
-                poolEntryCallbackCaptor.capture());
-        final FutureCallback<CPoolEntry> callaback = poolEntryCallbackCaptor.getValue();
-        final Log log = Mockito.mock(Log.class);
-        final CPoolEntry poolentry = new CPoolEntry(log, "some-id", route, conn, -1, TimeUnit.MILLISECONDS);
-        poolentry.markRouteComplete();
-        callaback.completed(poolentry);
-
-        Mockito.verify(pool).release(poolentry, true);
-    }
-
-    @Test(expected=ExecutionException.class)
-    public void testRequestConnectionFailed() throws Exception {
-        final HttpHost target = new HttpHost("localhost");
-        final HttpRoute route = new HttpRoute(target);
-        final Future<NHttpClientConnection> future = connman.requestConnection(
-            route, "some state", 1000L, 2000L, TimeUnit.MILLISECONDS, null);
-        Assert.assertNotNull(future);
-
-        Mockito.verify(pool).lease(
-                Matchers.same(route),
-                Matchers.eq("some state"),
-                Matchers.eq(1000L),
-                Matchers.eq(2000L),
-                Matchers.eq(TimeUnit.MILLISECONDS),
-                poolEntryCallbackCaptor.capture());
-        final FutureCallback<CPoolEntry> callaback = poolEntryCallbackCaptor.getValue();
-        callaback.failed(new Exception());
-
-        Assert.assertTrue(future.isDone());
-        future.get();
-    }
-
-    @Test
-    public void testRequestConnectionCancelled() throws Exception {
-        final HttpHost target = new HttpHost("localhost");
-        final HttpRoute route = new HttpRoute(target);
-        final Future<NHttpClientConnection> future = connman.requestConnection(
-            route, "some state", 1000L, 2000L, TimeUnit.MILLISECONDS, null);
-        Assert.assertNotNull(future);
-
-        Mockito.verify(pool).lease(
-                Matchers.same(route),
-                Matchers.eq("some state"),
-                Matchers.eq(1000L),
-                Matchers.eq(2000L),
-                Matchers.eq(TimeUnit.MILLISECONDS),
-                poolEntryCallbackCaptor.capture());
-        final FutureCallback<CPoolEntry> callaback = poolEntryCallbackCaptor.getValue();
-        callaback.cancelled();
-
-        Assert.assertTrue(future.isDone());
-        Assert.assertTrue(future.isCancelled());
-        Assert.assertNull(future.get());
-    }
-
-    @Test
-    public void testConnectionInitialize() throws Exception {
-        final HttpHost target = new HttpHost("somehost", -1, "http");
-        final HttpRoute route = new HttpRoute(target);
-        final HttpContext context = new BasicHttpContext();
-
-        final Log log = Mockito.mock(Log.class);
-        final CPoolEntry poolentry = new CPoolEntry(log, "some-id", route, conn, -1, TimeUnit.MILLISECONDS);
-        final NHttpClientConnection managedConn = CPoolProxy.newProxy(poolentry);
-
-        Mockito.when(conn.getIOSession()).thenReturn(iosession);
-        Mockito.when(sslStrategy.upgrade(target, iosession)).thenReturn(iosession);
-
-        connman.startRoute(managedConn, route, context);
-
-        Mockito.verify(noopStrategy, Mockito.never()).upgrade(target, iosession);
-        Mockito.verify(conn, Mockito.never()).bind(iosession);
-
-        Assert.assertFalse(connman.isRouteComplete(managedConn));
-    }
-
-    @Test
-    public void testConnectionInitializeHttps() throws Exception {
-        final HttpHost target = new HttpHost("somehost", 443, "https");
-        final HttpRoute route = new HttpRoute(target, null, true);
-        final HttpContext context = new BasicHttpContext();
-
-        final Log log = Mockito.mock(Log.class);
-        final CPoolEntry poolentry = new CPoolEntry(log, "some-id", route, conn, -1, TimeUnit.MILLISECONDS);
-        poolentry.markRouteComplete();
-        final NHttpClientConnection managedConn = CPoolProxy.newProxy(poolentry);
-
-        Mockito.when(conn.getIOSession()).thenReturn(iosession);
-        Mockito.when(sslStrategy.upgrade(target, iosession)).thenReturn(iosession);
-
-        connman.startRoute(managedConn, route, context);
-
-        Mockito.verify(sslStrategy).upgrade(target, iosession);
-        Mockito.verify(conn).bind(iosession);
-    }
-
-    @Test
-    public void testConnectionInitializeContextSpecific() throws Exception {
-        final HttpHost target = new HttpHost("somehost", 80, "http11");
-        final HttpRoute route = new HttpRoute(target);
-        final HttpContext context = new BasicHttpContext();
-
-        final Registry<SchemeIOSessionStrategy> reg = RegistryBuilder.<SchemeIOSessionStrategy>create()
-                .register("http11", noopStrategy)
-                .build();
-        context.setAttribute(PoolingNHttpClientConnectionManager.IOSESSION_FACTORY_REGISTRY, reg);
-
-        final Log log = Mockito.mock(Log.class);
-        final CPoolEntry poolentry = new CPoolEntry(log, "some-id", route, conn, -1, TimeUnit.MILLISECONDS);
-        final NHttpClientConnection managedConn = CPoolProxy.newProxy(poolentry);
-
-        Mockito.when(conn.getIOSession()).thenReturn(iosession);
-        Mockito.when(sslStrategy.upgrade(target, iosession)).thenReturn(iosession);
-
-        connman.startRoute(managedConn, route, context);
-
-        Mockito.verify(noopStrategy, Mockito.never()).upgrade(target, iosession);
-        Mockito.verify(conn, Mockito.never()).bind(iosession);
-
-        Assert.assertFalse(connman.isRouteComplete(managedConn));
-    }
-
-    @Test(expected=UnsupportedSchemeException.class)
-    public void testConnectionInitializeUnknownScheme() throws Exception {
-        final HttpHost target = new HttpHost("somehost", -1, "whatever");
-        final HttpRoute route = new HttpRoute(target, null, true);
-        final HttpContext context = new BasicHttpContext();
-
-        final Log log = Mockito.mock(Log.class);
-        final CPoolEntry poolentry = new CPoolEntry(log, "some-id", route, conn, -1, TimeUnit.MILLISECONDS);
-        poolentry.markRouteComplete();
-        final NHttpClientConnection managedConn = CPoolProxy.newProxy(poolentry);
-
-        Mockito.when(conn.getIOSession()).thenReturn(iosession);
-        Mockito.when(sslStrategy.upgrade(target, iosession)).thenReturn(iosession);
-
-        connman.startRoute(managedConn, route, context);
-    }
-
-    @Test
-    public void testConnectionUpgrade() throws Exception {
-        final HttpHost target = new HttpHost("somehost", 443, "https");
-        final HttpRoute route = new HttpRoute(target);
-        final HttpContext context = new BasicHttpContext();
-
-        final Log log = Mockito.mock(Log.class);
-        final CPoolEntry poolentry = new CPoolEntry(log, "some-id", route, conn, -1, TimeUnit.MILLISECONDS);
-        poolentry.markRouteComplete();
-        final NHttpClientConnection managedConn = CPoolProxy.newProxy(poolentry);
-
-        Mockito.when(conn.getIOSession()).thenReturn(iosession);
-        Mockito.when(sslStrategy.upgrade(target, iosession)).thenReturn(iosession);
-
-        connman.upgrade(managedConn, route, context);
-
-        Mockito.verify(sslStrategy).upgrade(target, iosession);
-        Mockito.verify(conn).bind(iosession);
-    }
-
-    @Test(expected=UnsupportedSchemeException.class)
-    public void testConnectionUpgradeUnknownScheme() throws Exception {
-        final HttpHost target = new HttpHost("somehost", -1, "whatever");
-        final HttpRoute route = new HttpRoute(target);
-        final HttpContext context = new BasicHttpContext();
-
-        final Log log = Mockito.mock(Log.class);
-        final CPoolEntry poolentry = new CPoolEntry(log, "some-id", route, conn, -1, TimeUnit.MILLISECONDS);
-        poolentry.markRouteComplete();
-        final NHttpClientConnection managedConn = CPoolProxy.newProxy(poolentry);
-
-        Mockito.when(conn.getIOSession()).thenReturn(iosession);
-        Mockito.when(sslStrategy.upgrade(target, iosession)).thenReturn(iosession);
-
-        connman.upgrade(managedConn, route, context);
-    }
-
-    @Test(expected=UnsupportedSchemeException.class)
-    public void testConnectionUpgradeIllegalScheme() throws Exception {
-        final HttpHost target = new HttpHost("somehost", 80, "http");
-        final HttpRoute route = new HttpRoute(target);
-        final HttpContext context = new BasicHttpContext();
-
-        final Log log = Mockito.mock(Log.class);
-        final CPoolEntry poolentry = new CPoolEntry(log, "some-id", route, conn, -1, TimeUnit.MILLISECONDS);
-        poolentry.markRouteComplete();
-        final NHttpClientConnection managedConn = CPoolProxy.newProxy(poolentry);
-
-        Mockito.when(conn.getIOSession()).thenReturn(iosession);
-        Mockito.when(sslStrategy.upgrade(target, iosession)).thenReturn(iosession);
-
-        connman.upgrade(managedConn, route, context);
-    }
-
-    @Test
-    public void testConnectionRouteComplete() throws Exception {
-        final HttpHost target = new HttpHost("somehost", 80, "http");
-        final HttpRoute route = new HttpRoute(target);
-        final HttpContext context = new BasicHttpContext();
-
-        final Log log = Mockito.mock(Log.class);
-        final CPoolEntry poolentry = new CPoolEntry(log, "some-id", route, conn, -1, TimeUnit.MILLISECONDS);
-        poolentry.markRouteComplete();
-        final NHttpClientConnection managedConn = CPoolProxy.newProxy(poolentry);
-
-        Mockito.when(conn.getIOSession()).thenReturn(iosession);
-        Mockito.when(sslStrategy.upgrade(target, iosession)).thenReturn(iosession);
-
-        connman.startRoute(managedConn, route, context);
-        connman.routeComplete(managedConn, route, context);
-
-        Assert.assertTrue(connman.isRouteComplete(managedConn));
-    }
-
-    @Test
-    public void testDelegationToCPool() throws Exception {
-        connman.closeExpiredConnections();
-        Mockito.verify(pool).closeExpired();
-
-        connman.closeIdleConnections(3, TimeUnit.SECONDS);
-        Mockito.verify(pool).closeIdle(3, TimeUnit.SECONDS);
-
-        connman.getMaxTotal();
-        Mockito.verify(pool).getMaxTotal();
-
-        connman.getDefaultMaxPerRoute();
-        Mockito.verify(pool).getDefaultMaxPerRoute();
-
-        final HttpRoute route = new HttpRoute(new HttpHost("somehost", 80));
-        connman.getMaxPerRoute(route);
-        Mockito.verify(pool).getMaxPerRoute(route);
-
-        connman.setMaxTotal(200);
-        Mockito.verify(pool).setMaxTotal(200);
-
-        connman.setDefaultMaxPerRoute(100);
-        Mockito.verify(pool).setDefaultMaxPerRoute(100);
-
-        connman.setMaxPerRoute(route, 150);
-        Mockito.verify(pool).setMaxPerRoute(route, 150);
-
-        connman.getTotalStats();
-        Mockito.verify(pool).getTotalStats();
-
-        connman.getStats(route);
-        Mockito.verify(pool).getStats(route);
-    }
-
-    @Test
-    public void testInternalConnFactoryCreate() throws Exception {
-        final ConfigData configData = new ConfigData();
-        final InternalConnectionFactory internalConnFactory = new InternalConnectionFactory(
-            configData, connFactory);
-
-        final HttpRoute route = new HttpRoute(new HttpHost("somehost", 80));
-        internalConnFactory.create(route, iosession);
-
-        Mockito.verify(sslStrategy, Mockito.never()).upgrade(Matchers.eq(new HttpHost("somehost", 80)),
-                Matchers.<IOSession>any());
-        Mockito.verify(connFactory).create(Matchers.same(iosession), Matchers.<ConnectionConfig>any());
-    }
-
-    @Test
-    public void testInternalConnFactoryCreateViaProxy() throws Exception {
-        final ConfigData configData = new ConfigData();
-        final InternalConnectionFactory internalConnFactory = new InternalConnectionFactory(
-            configData, connFactory);
-
-        final HttpHost target = new HttpHost("somehost", 80);
-        final HttpHost proxy = new HttpHost("someproxy", 8888);
-        final HttpRoute route = new HttpRoute(target, null, proxy, false);
-
-        final ConnectionConfig config = ConnectionConfig.custom().build();
-        configData.setConnectionConfig(proxy, config);
-
-        internalConnFactory.create(route, iosession);
-
-        Mockito.verify(connFactory).create(iosession, config);
-    }
-
-    @Test
-    public void testInternalConnFactoryCreateDirect() throws Exception {
-        final ConfigData configData = new ConfigData();
-        final InternalConnectionFactory internalConnFactory = new InternalConnectionFactory(
-            configData, connFactory);
-
-        final HttpHost target = new HttpHost("somehost", 80);
-        final HttpRoute route = new HttpRoute(target);
-
-        final ConnectionConfig config = ConnectionConfig.custom().build();
-        configData.setConnectionConfig(target, config);
-
-        internalConnFactory.create(route, iosession);
-
-        Mockito.verify(connFactory).create(iosession, config);
-    }
-
-    @Test
-    public void testInternalConnFactoryCreateDefaultConfig() throws Exception {
-        final ConfigData configData = new ConfigData();
-        final InternalConnectionFactory internalConnFactory = new InternalConnectionFactory(
-            configData, connFactory);
-
-        final HttpHost target = new HttpHost("somehost", 80);
-        final HttpRoute route = new HttpRoute(target);
-
-        final ConnectionConfig config = ConnectionConfig.custom().build();
-        configData.setDefaultConnectionConfig(config);
-
-        internalConnFactory.create(route, iosession);
-
-        Mockito.verify(connFactory).create(iosession, config);
-    }
-
-    @Test
-    public void testInternalConnFactoryCreateGlobalDefaultConfig() throws Exception {
-        final ConfigData configData = new ConfigData();
-        final InternalConnectionFactory internalConnFactory = new InternalConnectionFactory(
-            configData, connFactory);
-
-        final HttpHost target = new HttpHost("somehost", 80);
-        final HttpRoute route = new HttpRoute(target);
-
-        configData.setDefaultConnectionConfig(null);
-
-        internalConnFactory.create(route, iosession);
-
-        Mockito.verify(connFactory).create(iosession, ConnectionConfig.DEFAULT);
-    }
-
-    @Test
-    public void testResolveLocalAddress() throws Exception {
-        final InternalAddressResolver addressResolver = new InternalAddressResolver(
-                schemePortResolver, dnsResolver);
-
-        final HttpHost target = new HttpHost("localhost");
-        final byte[] ip = new byte[] {10, 0, 0, 10};
-        final HttpRoute route = new HttpRoute(target, InetAddress.getByAddress(ip), false);
-        final InetSocketAddress address = (InetSocketAddress) addressResolver.resolveLocalAddress(route);
-
-        Assert.assertNotNull(address);
-        Assert.assertEquals(InetAddress.getByAddress(ip), address.getAddress());
-        Assert.assertEquals(0, address.getPort());
-    }
-
-    @Test
-    public void testResolveLocalAddressNull() throws Exception {
-        final InternalAddressResolver addressResolver = new InternalAddressResolver(
-                schemePortResolver, dnsResolver);
-
-        final HttpHost target = new HttpHost("localhost");
-        final HttpRoute route = new HttpRoute(target);
-        final InetSocketAddress address = (InetSocketAddress) addressResolver.resolveLocalAddress(route);
-
-        Assert.assertNull(address);
-    }
-
-    @Test
-    public void testResolveRemoteAddress() throws Exception {
-        final InternalAddressResolver addressResolver = new InternalAddressResolver(
-                schemePortResolver, dnsResolver);
-
-        final HttpHost target = new HttpHost("somehost", 80);
-        final HttpRoute route = new HttpRoute(target);
-
-        Mockito.when(schemePortResolver.resolve(target)).thenReturn(123);
-        final byte[] ip = new byte[] {10, 0, 0, 10};
-        Mockito.when(dnsResolver.resolve("somehost")).thenReturn(new InetAddress[] {InetAddress.getByAddress(ip)});
-
-        final InetSocketAddress address = (InetSocketAddress) addressResolver.resolveRemoteAddress(route);
-
-        Assert.assertNotNull(address);
-        Assert.assertEquals(InetAddress.getByAddress(ip), address.getAddress());
-        Assert.assertEquals(123, address.getPort());
-    }
-
-    @Test
-    public void testResolveRemoteAddressViaProxy() throws Exception {
-        final InternalAddressResolver addressResolver = new InternalAddressResolver(
-                schemePortResolver, dnsResolver);
-
-        final HttpHost target = new HttpHost("somehost", 80);
-        final HttpHost proxy = new HttpHost("someproxy");
-        final HttpRoute route = new HttpRoute(target, null, proxy, false);
-
-        Mockito.when(schemePortResolver.resolve(proxy)).thenReturn(8888);
-        final byte[] ip = new byte[] {10, 0, 0, 10};
-        Mockito.when(dnsResolver.resolve("someproxy")).thenReturn(new InetAddress[] {InetAddress.getByAddress(ip)});
-
-        final InetSocketAddress address = (InetSocketAddress) addressResolver.resolveRemoteAddress(route);
-
-        Assert.assertNotNull(address);
-        Assert.assertEquals(InetAddress.getByAddress(ip), address.getAddress());
-        Assert.assertEquals(8888, address.getPort());
-    }
-
-}
diff --git a/httpasyncclient/src/test/java/org/apache/http/localserver/AbstractAsyncTest.java b/httpasyncclient/src/test/java/org/apache/http/localserver/AbstractAsyncTest.java
deleted file mode 100644
index 980b1e9..0000000
--- a/httpasyncclient/src/test/java/org/apache/http/localserver/AbstractAsyncTest.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.http.localserver;
-
-import java.net.InetSocketAddress;
-import java.net.URL;
-import java.util.concurrent.TimeUnit;
-
-import javax.net.ssl.SSLContext;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.http.ExceptionLogger;
-import org.apache.http.HttpHost;
-import org.apache.http.config.Registry;
-import org.apache.http.config.RegistryBuilder;
-import org.apache.http.conn.ssl.DefaultHostnameVerifier;
-import org.apache.http.impl.nio.bootstrap.HttpServer;
-import org.apache.http.impl.nio.bootstrap.ServerBootstrap;
-import org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager;
-import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor;
-import org.apache.http.impl.nio.reactor.IOReactorConfig;
-import org.apache.http.nio.conn.NoopIOSessionStrategy;
-import org.apache.http.nio.conn.SchemeIOSessionStrategy;
-import org.apache.http.nio.conn.ssl.SSLIOSessionStrategy;
-import org.apache.http.nio.reactor.ListenerEndpoint;
-import org.apache.http.ssl.SSLContextBuilder;
-import org.junit.After;
-import org.junit.Before;
-
-public abstract class AbstractAsyncTest {
-
-    public enum ProtocolScheme { http, https };
-
-    protected final ProtocolScheme scheme;
-
-    protected ServerBootstrap serverBootstrap;
-    protected HttpServer server;
-    protected PoolingNHttpClientConnectionManager connMgr;
-
-    public AbstractAsyncTest(final ProtocolScheme scheme) {
-        this.scheme = scheme;
-    }
-
-    public AbstractAsyncTest() {
-        this(ProtocolScheme.http);
-    }
-
-    public String getSchemeName() {
-        return this.scheme.name();
-    }
-
-    protected SSLContext createServerSSLContext() throws Exception {
-        final URL keyStoreURL = getClass().getResource("/test.keystore");
-        final String storePassword = "nopassword";
-        return SSLContextBuilder.create()
-                .loadTrustMaterial(keyStoreURL, storePassword.toCharArray())
-                .loadKeyMaterial(keyStoreURL, storePassword.toCharArray(), storePassword.toCharArray())
-                .build();
-    }
-
-    protected SSLContext createClientSSLContext() throws Exception {
-        final URL keyStoreURL = getClass().getResource("/test.keystore");
-        final String storePassword = "nopassword";
-        return SSLContextBuilder.create()
-                .loadTrustMaterial(keyStoreURL, storePassword.toCharArray())
-                .build();
-    }
-
-    public HttpHost startServer() throws Exception {
-        this.server = this.serverBootstrap.create();
-        this.server.start();
-
-        final ListenerEndpoint endpoint = this.server.getEndpoint();
-        endpoint.waitFor();
-
-        final InetSocketAddress address = (InetSocketAddress) endpoint.getAddress();
-        return new HttpHost("localhost", address.getPort(), this.scheme.name());
-    }
-
-    @Before
-    public void setUp() throws Exception {
-        this.serverBootstrap = ServerBootstrap.bootstrap();
-        final IOReactorConfig ioReactorConfig = IOReactorConfig.custom()
-                .setSoTimeout(15000)
-                .build();
-        this.serverBootstrap.setServerInfo("TEST/1.1");
-        this.serverBootstrap.setIOReactorConfig(ioReactorConfig);
-        this.serverBootstrap.setExceptionLogger(new ExceptionLogger() {
-
-            private final Log log = LogFactory.getLog(AbstractAsyncTest.class);
-
-            @Override
-            public void log(final Exception ex) {
-                log.error(ex.getMessage(), ex);
-            }
-        });
-        if (this.scheme.equals(ProtocolScheme.https)) {
-            this.serverBootstrap.setSslContext(createServerSSLContext());
-        }
-
-        final RegistryBuilder<SchemeIOSessionStrategy> builder = RegistryBuilder.create();
-        builder.register("http", NoopIOSessionStrategy.INSTANCE);
-        if (this.scheme.equals(ProtocolScheme.https)) {
-            builder.register("https", new SSLIOSessionStrategy(
-                    createClientSSLContext(),
-                    new DefaultHostnameVerifier()));
-        }
-        final Registry<SchemeIOSessionStrategy> registry =  builder.build();
-        final DefaultConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(ioReactorConfig);
-        this.connMgr = new PoolingNHttpClientConnectionManager(ioReactor, registry);
-    }
-
-    @After
-    public void shutDown() throws Exception {
-        if (this.server != null) {
-            this.server.shutdown(10, TimeUnit.SECONDS);
-        }
-    }
-
-}
diff --git a/httpasyncclient/src/test/java/org/apache/http/localserver/BasicAuthTokenExtractor.java b/httpasyncclient/src/test/java/org/apache/http/localserver/BasicAuthTokenExtractor.java
deleted file mode 100644
index 3bb93c6..0000000
--- a/httpasyncclient/src/test/java/org/apache/http/localserver/BasicAuthTokenExtractor.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.http.localserver;
-
-import org.apache.commons.codec.BinaryDecoder;
-import org.apache.commons.codec.DecoderException;
-import org.apache.commons.codec.binary.Base64;
-import org.apache.http.Header;
-import org.apache.http.HttpException;
-import org.apache.http.HttpRequest;
-import org.apache.http.ProtocolException;
-import org.apache.http.auth.AUTH;
-import org.apache.http.util.EncodingUtils;
-
-public class BasicAuthTokenExtractor {
-
-    public String extract(final HttpRequest request) throws HttpException {
-        String auth = null;
-
-        final Header h = request.getFirstHeader(AUTH.WWW_AUTH_RESP);
-        if (h != null) {
-            final String s = h.getValue();
-            if (s != null) {
-                auth = s.trim();
-            }
-        }
-
-        if (auth != null) {
-            final int i = auth.indexOf(' ');
-            if (i == -1) {
-                throw new ProtocolException("Invalid Authorization header: " + auth);
-            }
-            final String authscheme = auth.substring(0, i);
-            if (authscheme.equalsIgnoreCase("basic")) {
-                final String s = auth.substring(i + 1).trim();
-                try {
-                    final byte[] credsRaw = EncodingUtils.getAsciiBytes(s);
-                    final BinaryDecoder codec = new Base64();
-                    auth = EncodingUtils.getAsciiString(codec.decode(credsRaw));
-                } catch (final DecoderException ex) {
-                    throw new ProtocolException("Malformed BASIC credentials");
-                }
-            }
-        }
-        return auth;
-    }
-
-}
diff --git a/httpasyncclient/src/test/java/org/apache/http/localserver/EchoHandler.java b/httpasyncclient/src/test/java/org/apache/http/localserver/EchoHandler.java
deleted file mode 100644
index 21b6d54..0000000
--- a/httpasyncclient/src/test/java/org/apache/http/localserver/EchoHandler.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.http.localserver;
-
-import java.io.IOException;
-import java.util.Locale;
-
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpEntityEnclosingRequest;
-import org.apache.http.HttpException;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.MethodNotSupportedException;
-import org.apache.http.nio.entity.NByteArrayEntity;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.protocol.HttpRequestHandler;
-import org.apache.http.util.EntityUtils;
-
-/**
- * A handler that echos the incoming request entity.
- */
-public class EchoHandler
-    implements HttpRequestHandler {
-
-    // public default constructor
-
-    /**
-     * Handles a request by echoing the incoming request entity.
-     * If there is no request entity, an empty document is returned.
-     *
-     * @param request   the request
-     * @param response  the response
-     * @param context   the context
-     *
-     * @throws HttpException    in case of a problem
-     * @throws IOException      in case of an IO problem
-     */
-    @Override
-    public void handle(final HttpRequest request,
-                       final HttpResponse response,
-                       final HttpContext context)
-        throws HttpException, IOException {
-
-        final String method = request.getRequestLine().getMethod().toUpperCase(Locale.ROOT);
-        if (!"GET".equals(method) &&
-            !"POST".equals(method) &&
-            !"PUT".equals(method)
-            ) {
-            throw new MethodNotSupportedException
-                (method + " not supported by " + getClass().getName());
-        }
-
-        HttpEntity entity = null;
-        if (request instanceof HttpEntityEnclosingRequest) {
-            entity = ((HttpEntityEnclosingRequest)request).getEntity();
-        }
-
-        // For some reason, just putting the incoming entity into
-        // the response will not work. We have to buffer the message.
-        final byte[] data;
-        if (entity == null) {
-            data = new byte [0];
-        } else {
-            data = EntityUtils.toByteArray(entity);
-        }
-
-        final NByteArrayEntity bae = new NByteArrayEntity(data);
-        if (entity != null) {
-            bae.setContentType(entity.getContentType());
-        }
-        response.setEntity(bae);
-    }
-
-}
diff --git a/httpasyncclient/src/test/java/org/apache/http/localserver/HttpAsyncTestBase.java b/httpasyncclient/src/test/java/org/apache/http/localserver/HttpAsyncTestBase.java
deleted file mode 100644
index dd05d98..0000000
--- a/httpasyncclient/src/test/java/org/apache/http/localserver/HttpAsyncTestBase.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.http.localserver;
-
-import org.apache.http.HttpHost;
-import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
-import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
-import org.junit.After;
-import org.junit.Before;
-
-public abstract class HttpAsyncTestBase extends AbstractAsyncTest{
-
-    protected HttpAsyncClientBuilder clientBuilder;
-    protected CloseableHttpAsyncClient httpclient;
-
-    public HttpAsyncTestBase() {
-        super();
-    }
-
-    public HttpAsyncTestBase(final ProtocolScheme scheme) {
-        super(scheme);
-    }
-
-    public HttpHost start() throws Exception {
-        final HttpHost serverEndpoint = startServer();
-
-        this.httpclient = this.clientBuilder.build();
-        this.httpclient.start();
-
-        return serverEndpoint;
-    }
-
-    @Before @Override
-    public void setUp() throws Exception {
-        super.setUp();
-        this.clientBuilder = HttpAsyncClientBuilder.create();
-        this.clientBuilder.setConnectionManager(this.connMgr);
-    }
-
-    @After  @Override
-    public void shutDown() throws Exception {
-        if (this.httpclient != null) {
-            this.httpclient.close();
-        }
-        super.shutDown();
-    }
-
-}
diff --git a/httpasyncclient/src/test/java/org/apache/http/localserver/RandomHandler.java b/httpasyncclient/src/test/java/org/apache/http/localserver/RandomHandler.java
deleted file mode 100644
index 966b500..0000000
--- a/httpasyncclient/src/test/java/org/apache/http/localserver/RandomHandler.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.http.localserver;
-
-import java.io.IOException;
-import java.util.Locale;
-
-import org.apache.http.Consts;
-import org.apache.http.HttpException;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.MethodNotSupportedException;
-import org.apache.http.entity.ContentType;
-import org.apache.http.nio.entity.NByteArrayEntity;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.protocol.HttpRequestHandler;
-
-/**
- * A handler that generates random data.
- */
-public class RandomHandler implements HttpRequestHandler {
-
-    private final static byte[] RANGE;
-    static {
-        RANGE = ("abcdefghijklmnopqrstuvwxyz" +
-                "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789"
-        ).getBytes(Consts.ASCII);
-    }
-
-    /**
-     * Handles a request by generating random data.
-     * The length of the response can be specified in the request URI
-     * as a number after the last /. For example /random/whatever/20
-     * will generate 20 random bytes in the printable ASCII range.
-     * If the request URI ends with /, a random number of random bytes
-     * is generated, but at least one.
-     *
-     * @param request   the request
-     * @param response  the response
-     * @param context   the context
-     *
-     * @throws HttpException    in case of a problem
-     * @throws IOException      in case of an IO problem
-     */
-    @Override
-    public void handle(final HttpRequest request,
-                       final HttpResponse response,
-                       final HttpContext context)
-        throws HttpException, IOException {
-
-        final String method = request.getRequestLine().getMethod().toUpperCase(Locale.ROOT);
-        if (!"GET".equals(method) && !"HEAD".equals(method)) {
-            throw new MethodNotSupportedException
-                (method + " not supported by " + getClass().getName());
-        }
-
-        final String uri = request.getRequestLine().getUri();
-        final int  slash = uri.lastIndexOf('/');
-        int length = -1;
-        if (slash < uri.length()-1) {
-            try {
-                // no more than Integer, 2 GB ought to be enough for anybody
-                length = Integer.parseInt(uri.substring(slash+1));
-
-                if (length < 0) {
-                    response.setStatusCode(HttpStatus.SC_BAD_REQUEST);
-                    response.setReasonPhrase("LENGTH " + length);
-                }
-            } catch (final NumberFormatException nfx) {
-                response.setStatusCode(HttpStatus.SC_BAD_REQUEST);
-                response.setReasonPhrase(nfx.toString());
-            }
-        } else {
-            // random length, but make sure at least something is sent
-            length = 1 + (int)(Math.random() * 79.0);
-        }
-
-        if (length >= 0) {
-            final byte[] data = new byte[length];
-            for (int i = 0; i < length; i++) {
-                double value = 0.0;
-                // we get 5 random characters out of one random value
-                if (i%5 == 0) {
-                    value = Math.random();
-                }
-                value = value * RANGE.length;
-                final int d = (int) value;
-                value = value - d;
-                data[i] = RANGE[d];
-            }
-            final NByteArrayEntity bae = new NByteArrayEntity(data, ContentType.DEFAULT_TEXT);
-            response.setEntity(bae);
-        }
-    }
-
-}
diff --git a/httpasyncclient/src/test/java/org/apache/http/localserver/RequestBasicAuth.java b/httpasyncclient/src/test/java/org/apache/http/localserver/RequestBasicAuth.java
deleted file mode 100644
index 5723bd6..0000000
--- a/httpasyncclient/src/test/java/org/apache/http/localserver/RequestBasicAuth.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.http.localserver;
-
-import java.io.IOException;
-
-import org.apache.http.HttpException;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpRequestInterceptor;
-import org.apache.http.protocol.HttpContext;
-
-public class RequestBasicAuth implements HttpRequestInterceptor {
-
-    private final BasicAuthTokenExtractor authTokenExtractor;
-
-    public RequestBasicAuth() {
-        super();
-        this.authTokenExtractor = new BasicAuthTokenExtractor();
-    }
-
-    @Override
-    public void process(
-            final HttpRequest request,
-            final HttpContext context) throws HttpException, IOException {
-        context.setAttribute("creds", this.authTokenExtractor.extract(request));
-    }
-
-}
diff --git a/httpasyncclient/src/test/java/org/apache/http/localserver/ResponseBasicUnauthorized.java b/httpasyncclient/src/test/java/org/apache/http/localserver/ResponseBasicUnauthorized.java
deleted file mode 100644
index a1c58d8..0000000
--- a/httpasyncclient/src/test/java/org/apache/http/localserver/ResponseBasicUnauthorized.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.http.localserver;
-
-import java.io.IOException;
-
-import org.apache.http.HttpException;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpResponseInterceptor;
-import org.apache.http.HttpStatus;
-import org.apache.http.auth.AUTH;
-import org.apache.http.protocol.HttpContext;
-
-public class ResponseBasicUnauthorized implements HttpResponseInterceptor {
-
-    @Override
-    public void process(
-            final HttpResponse response,
-            final HttpContext context) throws HttpException, IOException {
-        if (response.getStatusLine().getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {
-            response.addHeader(AUTH.WWW_AUTH, "Basic realm=\"test realm\"");
-        }
-    }
-
-}
diff --git a/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestClientAuthentication.java b/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestClientAuthentication.java
deleted file mode 100644
index 774f95f..0000000
--- a/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestClientAuthentication.java
+++ /dev/null
@@ -1,474 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.client.integration;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-
-import org.apache.http.Consts;
-import org.apache.http.localserver.HttpAsyncTestBase;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpException;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpInetConnection;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.HttpVersion;
-import org.apache.http.ProtocolVersion;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.Credentials;
-import org.apache.http.auth.UsernamePasswordCredentials;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.client.methods.HttpPut;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.impl.client.BasicCredentialsProvider;
-import org.apache.http.impl.client.TargetAuthenticationStrategy;
-import org.apache.http.localserver.BasicAuthTokenExtractor;
-import org.apache.http.localserver.RequestBasicAuth;
-import org.apache.http.localserver.ResponseBasicUnauthorized;
-import org.apache.http.message.BasicHeader;
-import org.apache.http.message.BasicHttpResponse;
-import org.apache.http.nio.entity.NByteArrayEntity;
-import org.apache.http.nio.entity.NStringEntity;
-import org.apache.http.nio.protocol.BasicAsyncRequestHandler;
-import org.apache.http.nio.protocol.BasicAsyncResponseProducer;
-import org.apache.http.nio.protocol.HttpAsyncExchange;
-import org.apache.http.nio.protocol.HttpAsyncExpectationVerifier;
-import org.apache.http.protocol.HTTP;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.protocol.HttpCoreContext;
-import org.apache.http.protocol.HttpRequestHandler;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-@RunWith(Parameterized.class)
-public class TestClientAuthentication extends HttpAsyncTestBase {
-
-    @Parameterized.Parameters(name = "{0}")
-    public static Collection<Object[]> protocols() {
-        return Arrays.asList(new Object[][]{
-                {ProtocolScheme.http},
-                {ProtocolScheme.https},
-        });
-    }
-
-    public TestClientAuthentication(final ProtocolScheme scheme) {
-        super(scheme);
-    }
-
-    @Before @Override
-    public void setUp() throws Exception {
-        super.setUp();
-        this.serverBootstrap.addInterceptorFirst(new RequestBasicAuth());
-        this.serverBootstrap.addInterceptorLast(new ResponseBasicUnauthorized());
-    }
-
-    static class AuthHandler implements HttpRequestHandler {
-
-        private final boolean keepAlive;
-
-        AuthHandler(final boolean keepAlive) {
-            super();
-            this.keepAlive = keepAlive;
-        }
-
-        AuthHandler() {
-            this(true);
-        }
-
-        @Override
-        public void handle(
-                final HttpRequest request,
-                final HttpResponse response,
-                final HttpContext context) throws HttpException, IOException {
-            final String creds = (String) context.getAttribute("creds");
-            if (creds == null || !creds.equals("test:test")) {
-                response.setStatusCode(HttpStatus.SC_UNAUTHORIZED);
-            } else {
-                response.setStatusCode(HttpStatus.SC_OK);
-                final NStringEntity entity = new NStringEntity("success", Consts.ASCII);
-                response.setEntity(entity);
-            }
-            response.setHeader(HTTP.CONN_DIRECTIVE,
-                    this.keepAlive ? HTTP.CONN_KEEP_ALIVE : HTTP.CONN_CLOSE);
-        }
-
-    }
-
-    static class TestTargetAuthenticationStrategy extends TargetAuthenticationStrategy {
-
-        private int count;
-
-        public TestTargetAuthenticationStrategy() {
-            super();
-            this.count = 0;
-        }
-
-        @Override
-        public boolean isAuthenticationRequested(
-                final HttpHost authhost,
-                final HttpResponse response,
-                final HttpContext context) {
-            final boolean res = super.isAuthenticationRequested(authhost, response, context);
-            if (res) {
-                synchronized (this) {
-                    this.count++;
-                }
-            }
-            return res;
-        }
-
-        public int getCount() {
-            synchronized (this) {
-                return this.count;
-            }
-        }
-
-    }
-
-    static class AuthExpectationVerifier implements HttpAsyncExpectationVerifier {
-
-        private final BasicAuthTokenExtractor authTokenExtractor;
-
-        public AuthExpectationVerifier() {
-            super();
-            this.authTokenExtractor = new BasicAuthTokenExtractor();
-        }
-
-        @Override
-        public void verify(
-                final HttpAsyncExchange httpexchange,
-                final HttpContext context) throws HttpException, IOException {
-            final HttpRequest request = httpexchange.getRequest();
-            ProtocolVersion ver = request.getRequestLine().getProtocolVersion();
-            if (!ver.lessEquals(HttpVersion.HTTP_1_1)) {
-                ver = HttpVersion.HTTP_1_1;
-            }
-            final String creds = this.authTokenExtractor.extract(request);
-            if (creds == null || !creds.equals("test:test")) {
-                final HttpResponse response = new BasicHttpResponse(ver, HttpStatus.SC_UNAUTHORIZED, "UNAUTHORIZED");
-                httpexchange.submitResponse(new BasicAsyncResponseProducer(response));
-            } else {
-                httpexchange.submitResponse();
-            }
-        }
-
-    }
-
-    static class TestCredentialsProvider implements CredentialsProvider {
-
-        private final Credentials creds;
-        private AuthScope authscope;
-
-        TestCredentialsProvider(final Credentials creds) {
-            super();
-            this.creds = creds;
-        }
-
-        @Override
-        public void clear() {
-        }
-
-        @Override
-        public Credentials getCredentials(final AuthScope authscope) {
-            this.authscope = authscope;
-            return this.creds;
-        }
-
-        @Override
-        public void setCredentials(final AuthScope authscope, final Credentials credentials) {
-        }
-
-        public AuthScope getAuthScope() {
-            return this.authscope;
-        }
-
-    }
-
-    @Test
-    public void testBasicAuthenticationNoCreds() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(new AuthHandler()));
-        final HttpHost target = start();
-
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(null);
-        final HttpClientContext context = HttpClientContext.create();
-        context.setCredentialsProvider(credsProvider);
-        final HttpGet httpget = new HttpGet("/");
-        final Future<HttpResponse> future = this.httpclient.execute(target, httpget, context, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-        Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getStatusLine().getStatusCode());
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
-    }
-
-    @Test
-    public void testBasicAuthenticationFailure() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(new AuthHandler()));
-        final HttpHost target = start();
-
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "all-wrong"));
-        final HttpClientContext context = HttpClientContext.create();
-        context.setCredentialsProvider(credsProvider);
-        final HttpGet httpget = new HttpGet("/");
-        final Future<HttpResponse> future = this.httpclient.execute(target, httpget, context, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-        Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getStatusLine().getStatusCode());
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
-    }
-
-    @Test
-    public void testBasicAuthenticationSuccess() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(new AuthHandler()));
-        final HttpHost target = start();
-
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test"));
-        final HttpClientContext context = HttpClientContext.create();
-        context.setCredentialsProvider(credsProvider);
-        final HttpGet httpget = new HttpGet("/");
-        final Future<HttpResponse> future = this.httpclient.execute(target, httpget, context, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-        Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
-    }
-
-    @Test
-    public void testBasicAuthenticationSuccessNonPersistentConnection() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(new AuthHandler(false)));
-        final HttpHost target = start();
-
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test"));
-        final HttpClientContext context = HttpClientContext.create();
-        context.setCredentialsProvider(credsProvider);
-
-        final HttpGet httpget = new HttpGet("/");
-        final Future<HttpResponse> future = this.httpclient.execute(target, httpget, context, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-        Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
-    }
-
-    @Test
-    public void testBasicAuthenticationSuccessWithNonRepeatableExpectContinue() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(new AuthHandler()));
-        this.serverBootstrap.setExpectationVerifier(new AuthExpectationVerifier());
-        final HttpHost target = start();
-
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test"));
-        final HttpClientContext context = HttpClientContext.create();
-        context.setCredentialsProvider(credsProvider);
-        final HttpPut httpput = new HttpPut("/");
-
-        final NByteArrayEntity entity = new NByteArrayEntity(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }) {
-
-            @Override
-            public boolean isRepeatable() {
-                return false;
-            }
-
-        };
-
-        httpput.setEntity(entity);
-        httpput.setConfig(RequestConfig.custom().setExpectContinueEnabled(true).build());
-
-        final Future<HttpResponse> future = this.httpclient.execute(target, httpput, context, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-        Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
-    }
-
-    @Test(expected=ExecutionException.class)
-    public void testBasicAuthenticationFailureWithNonRepeatableEntityExpectContinueOff() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(new AuthHandler()));
-        final HttpHost target = start();
-
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test"));
-        final HttpClientContext context = HttpClientContext.create();
-        context.setCredentialsProvider(credsProvider);
-        final HttpPut httpput = new HttpPut("/");
-
-        final NByteArrayEntity requestEntity = new NByteArrayEntity(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }) {
-
-            @Override
-            public boolean isRepeatable() {
-                return false;
-            }
-
-        };
-
-        httpput.setEntity(requestEntity);
-        httpput.setConfig(RequestConfig.custom().setExpectContinueEnabled(false).build());
-
-        try {
-            final Future<HttpResponse> future = this.httpclient.execute(target, httpput, context, null);
-            future.get();
-            Assert.fail("ExecutionException should have been thrown");
-        } catch (final ExecutionException ex) {
-            final Throwable cause = ex.getCause();
-            Assert.assertNotNull(cause);
-            throw ex;
-        }
-    }
-
-    @Test
-    public void testBasicAuthenticationSuccessOnRepeatablePost() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(new AuthHandler()));
-        final HttpHost target = start();
-
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test"));
-        final HttpClientContext context = HttpClientContext.create();
-        context.setCredentialsProvider(credsProvider);
-        final HttpPost httppost = new HttpPost("/");
-        httppost.setEntity(new NStringEntity("some important stuff", Consts.ISO_8859_1));
-
-        final Future<HttpResponse> future = this.httpclient.execute(target, httppost, context, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-        Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
-    }
-
-    @Test
-    public void testBasicAuthenticationCredentialsCaching() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(new AuthHandler()));
-        final TestTargetAuthenticationStrategy authStrategy = new TestTargetAuthenticationStrategy();
-        this.clientBuilder.setTargetAuthenticationStrategy(authStrategy);
-        final HttpHost target = start();
-
-        final BasicCredentialsProvider credsProvider = new BasicCredentialsProvider();
-        credsProvider.setCredentials(AuthScope.ANY,
-                new UsernamePasswordCredentials("test", "test"));
-        final HttpClientContext context = HttpClientContext.create();
-        context.setCredentialsProvider(credsProvider);
-
-        final HttpGet httpget1 = new HttpGet("/");
-        final Future<HttpResponse> future1 = this.httpclient.execute(target, httpget1, context, null);
-        final HttpResponse response1 = future1.get();
-        Assert.assertNotNull(response1);
-        Assert.assertEquals(HttpStatus.SC_OK, response1.getStatusLine().getStatusCode());
-
-        final HttpGet httpget2 = new HttpGet("/");
-        final Future<HttpResponse> future2 = this.httpclient.execute(target, httpget2, context, null);
-        final HttpResponse response2 = future2.get();
-        Assert.assertNotNull(response2);
-        Assert.assertEquals(HttpStatus.SC_OK, response2.getStatusLine().getStatusCode());
-
-        Assert.assertEquals(1, authStrategy.getCount());
-    }
-
-    @Test
-    public void testAuthenticationUserinfoInRequestSuccess() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(new AuthHandler()));
-        final HttpHost target = start();
-
-        final HttpGet httpget = new HttpGet("http://test:test@" +  target.toHostString() + "/");
-        final Future<HttpResponse> future = this.httpclient.execute(target, httpget, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-        final HttpEntity entity = response.getEntity();
-        Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
-        Assert.assertNotNull(entity);
-    }
-
-    @Test
-    public void testAuthenticationUserinfoInRequestFailure() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(new AuthHandler()));
-        final HttpHost target = start();
-
-        final HttpGet httpget = new HttpGet("http://test:all-wrong@" +  target.toHostString() + "/");
-
-        final Future<HttpResponse> future = this.httpclient.execute(target, httpget, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-        final HttpEntity entity = response.getEntity();
-        Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getStatusLine().getStatusCode());
-        Assert.assertNotNull(entity);
-    }
-
-    private class RedirectHandler implements HttpRequestHandler {
-
-        public RedirectHandler() {
-            super();
-        }
-
-        @Override
-        public void handle(
-                final HttpRequest request,
-                final HttpResponse response,
-                final HttpContext context) throws HttpException, IOException {
-            final HttpInetConnection conn = (HttpInetConnection) context.getAttribute(HttpCoreContext.HTTP_CONNECTION);
-            final int port = conn.getLocalPort();
-            response.setStatusCode(HttpStatus.SC_MOVED_PERMANENTLY);
-            response.addHeader(new BasicHeader("Location", getSchemeName() + "://test:test@localhost:" + port + "/"));
-        }
-
-    }
-
-    @Test
-    public void testAuthenticationUserinfoInRedirectSuccess() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(new AuthHandler()));
-        this.serverBootstrap.registerHandler("/thatway", new BasicAsyncRequestHandler(new RedirectHandler()));
-        final HttpHost target = start();
-
-        final HttpGet httpget = new HttpGet(target.getSchemeName() + "://test:test@" +  target.toHostString() + "/thatway");
-        final Future<HttpResponse> future = this.httpclient.execute(target, httpget, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-        final HttpEntity entity = response.getEntity();
-        Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
-        Assert.assertNotNull(entity);
-    }
-
-}
\ No newline at end of file
diff --git a/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestClientAuthenticationFallBack.java b/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestClientAuthenticationFallBack.java
deleted file mode 100644
index d6fcc07..0000000
--- a/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestClientAuthenticationFallBack.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.client.integration;
-
-import java.io.IOException;
-import java.util.concurrent.Future;
-
-import org.apache.http.Consts;
-import org.apache.http.localserver.HttpAsyncTestBase;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpException;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpResponseInterceptor;
-import org.apache.http.HttpStatus;
-import org.apache.http.auth.AUTH;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.Credentials;
-import org.apache.http.auth.UsernamePasswordCredentials;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.localserver.RequestBasicAuth;
-import org.apache.http.nio.protocol.BasicAsyncRequestHandler;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.protocol.HttpRequestHandler;
-import org.apache.http.util.EntityUtils;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-public class TestClientAuthenticationFallBack extends HttpAsyncTestBase {
-
-    @Before
-    @Override
-    public void setUp() throws Exception {
-        super.setUp();
-        this.serverBootstrap.addInterceptorFirst(new RequestBasicAuth());
-        this.serverBootstrap.addInterceptorLast(new ResponseBasicUnauthorized());
-    }
-
-    public class ResponseBasicUnauthorized implements HttpResponseInterceptor {
-
-        @Override
-        public void process(
-                final HttpResponse response,
-                final HttpContext context) throws HttpException, IOException {
-            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {
-                response.addHeader(AUTH.WWW_AUTH, "Digest realm=\"test realm\" invalid");
-                response.addHeader(AUTH.WWW_AUTH, "Basic realm=\"test realm\"");
-            }
-        }
-
-    }
-
-    static class AuthHandler implements HttpRequestHandler {
-
-        @Override
-        public void handle(
-                final HttpRequest request,
-                final HttpResponse response,
-                final HttpContext context) throws HttpException, IOException {
-            final String creds = (String) context.getAttribute("creds");
-            if (creds == null || !creds.equals("test:test")) {
-                response.setStatusCode(HttpStatus.SC_UNAUTHORIZED);
-            } else {
-                response.setStatusCode(HttpStatus.SC_OK);
-                final StringEntity entity = new StringEntity("success", Consts.ASCII);
-                response.setEntity(entity);
-            }
-        }
-
-    }
-
-    static class TestCredentialsProvider implements CredentialsProvider {
-
-        private final Credentials creds;
-        private AuthScope authscope;
-
-        TestCredentialsProvider(final Credentials creds) {
-            super();
-            this.creds = creds;
-        }
-
-        @Override
-        public void clear() {
-        }
-
-        @Override
-        public Credentials getCredentials(final AuthScope authscope) {
-            this.authscope = authscope;
-            return this.creds;
-        }
-
-        @Override
-        public void setCredentials(final AuthScope authscope, final Credentials credentials) {
-        }
-
-        public AuthScope getAuthScope() {
-            return this.authscope;
-        }
-
-    }
-
-    @Test
-    public void testBasicAuthenticationSuccess() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(new AuthHandler()));
-        final HttpHost target = start();
-
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test"));
-        final HttpClientContext context = HttpClientContext.create();
-        context.setCredentialsProvider(credsProvider);
-
-        final HttpGet httpget = new HttpGet("/");
-
-        final Future<HttpResponse> future = this.httpclient.execute(target, httpget, context, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-        final HttpEntity entity = response.getEntity();
-        Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
-        Assert.assertNotNull(entity);
-        EntityUtils.consume(entity);
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
-    }
-
-}
diff --git a/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestClientReauthentication.java b/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestClientReauthentication.java
deleted file mode 100644
index 40bf2bb..0000000
--- a/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestClientReauthentication.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.client.integration;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.concurrent.Future;
-import java.util.concurrent.atomic.AtomicLong;
-
-import org.apache.http.Consts;
-import org.apache.http.localserver.HttpAsyncTestBase;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpException;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpResponseInterceptor;
-import org.apache.http.HttpStatus;
-import org.apache.http.auth.AUTH;
-import org.apache.http.auth.AuthScheme;
-import org.apache.http.auth.AuthSchemeProvider;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.Credentials;
-import org.apache.http.auth.UsernamePasswordCredentials;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.config.Registry;
-import org.apache.http.config.RegistryBuilder;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.auth.BasicScheme;
-import org.apache.http.impl.auth.BasicSchemeFactory;
-import org.apache.http.impl.client.TargetAuthenticationStrategy;
-import org.apache.http.localserver.RequestBasicAuth;
-import org.apache.http.nio.protocol.BasicAsyncRequestHandler;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.protocol.HttpRequestHandler;
-import org.apache.http.util.EntityUtils;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-public class TestClientReauthentication extends HttpAsyncTestBase {
-
-    @Before @Override
-    public void setUp() throws Exception {
-        super.setUp();
-        this.serverBootstrap.addInterceptorFirst(new RequestBasicAuth());
-        this.serverBootstrap.addInterceptorLast(new ResponseBasicUnauthorized());
-    }
-
-    public class ResponseBasicUnauthorized implements HttpResponseInterceptor {
-
-        @Override
-        public void process(
-                final HttpResponse response,
-                final HttpContext context) throws HttpException, IOException {
-            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {
-                response.addHeader(AUTH.WWW_AUTH, "MyBasic realm=\"test realm\"");
-            }
-        }
-
-    }
-
-    static class AuthHandler implements HttpRequestHandler {
-
-        private final AtomicLong count = new AtomicLong(0);
-
-        @Override
-        public void handle(
-                final HttpRequest request,
-                final HttpResponse response,
-                final HttpContext context) throws HttpException, IOException {
-            final String creds = (String) context.getAttribute("creds");
-            if (creds == null || !creds.equals("test:test")) {
-                response.setStatusCode(HttpStatus.SC_UNAUTHORIZED);
-            } else {
-                // Make client re-authenticate on each fourth request
-                if (this.count.incrementAndGet() % 4 == 0) {
-                    response.setStatusCode(HttpStatus.SC_UNAUTHORIZED);
-                } else {
-                    response.setStatusCode(HttpStatus.SC_OK);
-                    final StringEntity entity = new StringEntity("success", Consts.ASCII);
-                    response.setEntity(entity);
-                }
-            }
-        }
-
-    }
-
-    static class TestCredentialsProvider implements CredentialsProvider {
-
-        private final Credentials creds;
-        private AuthScope authscope;
-
-        TestCredentialsProvider(final Credentials creds) {
-            super();
-            this.creds = creds;
-        }
-
-        @Override
-        public void clear() {
-        }
-
-        @Override
-        public Credentials getCredentials(final AuthScope authscope) {
-            this.authscope = authscope;
-            return this.creds;
-        }
-
-        @Override
-        public void setCredentials(final AuthScope authscope, final Credentials credentials) {
-        }
-
-        public AuthScope getAuthScope() {
-            return this.authscope;
-        }
-
-    }
-
-    @Test
-    public void testBasicAuthenticationSuccess() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(new AuthHandler()));
-
-        final BasicSchemeFactory myBasicAuthSchemeFactory = new BasicSchemeFactory() {
-
-            @Override
-            public AuthScheme create(final HttpContext context) {
-                return new BasicScheme() {
-                    private static final long serialVersionUID = 1L;
-
-                    @Override
-                    public String getSchemeName() {
-                        return "MyBasic";
-                    }
-
-                };
-            }
-
-        };
-
-        final TargetAuthenticationStrategy myAuthStrategy = new TargetAuthenticationStrategy() {
-
-            @Override
-            protected boolean isCachable(final AuthScheme authScheme) {
-                return "MyBasic".equalsIgnoreCase(authScheme.getSchemeName());
-            }
-
-        };
-
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test"));
-
-        final Registry<AuthSchemeProvider> authSchemeRegistry = RegistryBuilder.<AuthSchemeProvider>create()
-            .register("MyBasic", myBasicAuthSchemeFactory)
-            .build();
-        this.clientBuilder.setDefaultAuthSchemeRegistry(authSchemeRegistry);
-        this.clientBuilder.setTargetAuthenticationStrategy(myAuthStrategy);
-        final HttpHost target = start();
-
-        final RequestConfig config = RequestConfig.custom()
-                .setTargetPreferredAuthSchemes(Arrays.asList("MyBasic"))
-                .build();
-        final HttpClientContext context = HttpClientContext.create();
-        context.setCredentialsProvider(credsProvider);
-
-        for (int i = 0; i < 10; i++) {
-            final HttpGet httpget = new HttpGet("/");
-            httpget.setConfig(config);
-            final Future<HttpResponse> future = this.httpclient.execute(target, httpget, context, null);
-            final HttpResponse response = future.get();
-            Assert.assertNotNull(response);
-            final HttpEntity entity = response.getEntity();
-            Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
-            Assert.assertNotNull(entity);
-            EntityUtils.consume(entity);
-        }
-    }
-
-}
diff --git a/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestHttpAsync.java b/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestHttpAsync.java
deleted file mode 100644
index 8a9a5d7..0000000
--- a/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestHttpAsync.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.client.integration;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.Queue;
-import java.util.Random;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-
-import org.apache.http.localserver.HttpAsyncTestBase;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
-import org.apache.http.impl.nio.client.HttpAsyncClients;
-import org.apache.http.localserver.EchoHandler;
-import org.apache.http.localserver.RandomHandler;
-import org.apache.http.nio.ContentDecoder;
-import org.apache.http.nio.IOControl;
-import org.apache.http.nio.client.methods.HttpAsyncMethods;
-import org.apache.http.nio.client.util.HttpAsyncClientUtils;
-import org.apache.http.nio.entity.NByteArrayEntity;
-import org.apache.http.nio.protocol.BasicAsyncRequestHandler;
-import org.apache.http.nio.protocol.BasicAsyncResponseConsumer;
-import org.apache.http.nio.protocol.HttpAsyncRequestProducer;
-import org.apache.http.util.EntityUtils;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-@RunWith(Parameterized.class)
-public class TestHttpAsync extends HttpAsyncTestBase {
-
-    @Parameterized.Parameters(name = "{0}")
-    public static Collection<Object[]> protocols() {
-        return Arrays.asList(new Object[][]{
-                { ProtocolScheme.http },
-                { ProtocolScheme.https },
-        });
-    }
-
-    public TestHttpAsync(final ProtocolScheme scheme) {
-        super(scheme);
-    }
-
-    @Before @Override
-    public void setUp() throws Exception {
-        super.setUp();
-        this.serverBootstrap.registerHandler("/echo/*", new BasicAsyncRequestHandler(new EchoHandler()));
-        this.serverBootstrap.registerHandler("/random/*", new BasicAsyncRequestHandler(new RandomHandler()));
-    }
-
-    @Test
-    public void testSingleGet() throws Exception {
-        final HttpHost target = start();
-        final HttpGet httpget = new HttpGet("/random/2048");
-        final Future<HttpResponse> future = this.httpclient.execute(target, httpget, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-        Assert.assertEquals(200, response.getStatusLine().getStatusCode());
-    }
-
-    @Test
-    public void testSinglePost() throws Exception {
-        final HttpHost target = start();
-        final byte[] b1 = new byte[1024];
-        final Random rnd = new Random(System.currentTimeMillis());
-        rnd.nextBytes(b1);
-
-        final HttpPost httppost = new HttpPost("/echo/stuff");
-        httppost.setEntity(new NByteArrayEntity(b1));
-
-        final Future<HttpResponse> future = this.httpclient.execute(target, httppost, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-        Assert.assertEquals(200, response.getStatusLine().getStatusCode());
-        final HttpEntity entity = response.getEntity();
-        Assert.assertNotNull(entity);
-        final byte[] b2 = EntityUtils.toByteArray(entity);
-        Assert.assertArrayEquals(b1, b2);
-    }
-
-    @Test
-    public void testHttpAsyncMethods() throws Exception {
-        final HttpHost target = start();
-        final byte[] b1 = new byte[1024];
-        final Random rnd = new Random(System.currentTimeMillis());
-        rnd.nextBytes(b1);
-
-        final Future<HttpResponse> future = this.httpclient.execute(
-            HttpAsyncMethods.createPost(target + "/echo/post", b1, null),
-            new BasicAsyncResponseConsumer(),
-            null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-        Assert.assertEquals(200, response.getStatusLine().getStatusCode());
-        final HttpEntity entity = response.getEntity();
-        Assert.assertNotNull(entity);
-        final byte[] b2 = EntityUtils.toByteArray(entity);
-        Assert.assertArrayEquals(b1, b2);
-    }
-
-    @Test
-    public void testMultiplePostsOverMultipleConnections() throws Exception {
-        final HttpHost target = start();
-        final byte[] b1 = new byte[1024];
-        final Random rnd = new Random(System.currentTimeMillis());
-        rnd.nextBytes(b1);
-
-        final int reqCount = 20;
-
-        this.connMgr.setDefaultMaxPerRoute(reqCount);
-        this.connMgr.setMaxTotal(100);
-
-        final Queue<Future<HttpResponse>> queue = new LinkedList<Future<HttpResponse>>();
-
-        for (int i = 0; i < reqCount; i++) {
-            final HttpPost httppost = new HttpPost("/echo/stuff");
-            httppost.setEntity(new NByteArrayEntity(b1));
-            queue.add(this.httpclient.execute(target, httppost, null));
-        }
-
-        while (!queue.isEmpty()) {
-            final Future<HttpResponse> future = queue.remove();
-            final HttpResponse response = future.get();
-            Assert.assertNotNull(response);
-            Assert.assertEquals(200, response.getStatusLine().getStatusCode());
-            final HttpEntity entity = response.getEntity();
-            Assert.assertNotNull(entity);
-            final byte[] b2 = EntityUtils.toByteArray(entity);
-            Assert.assertArrayEquals(b1, b2);
-        }
-    }
-
-    @Test
-    public void testMultiplePostsOverSingleConnection() throws Exception {
-        final HttpHost target = start();
-        final byte[] b1 = new byte[1024];
-        final Random rnd = new Random(System.currentTimeMillis());
-        rnd.nextBytes(b1);
-
-        final int reqCount = 20;
-
-        this.connMgr.setDefaultMaxPerRoute(1);
-        this.connMgr.setMaxTotal(100);
-
-        final Queue<Future<HttpResponse>> queue = new LinkedList<Future<HttpResponse>>();
-
-        for (int i = 0; i < reqCount; i++) {
-            final HttpPost httppost = new HttpPost("/echo/stuff");
-            httppost.setEntity(new NByteArrayEntity(b1));
-            queue.add(this.httpclient.execute(target, httppost, null));
-        }
-
-        while (!queue.isEmpty()) {
-            final Future<HttpResponse> future = queue.remove();
-            final HttpResponse response = future.get();
-            Assert.assertNotNull(response);
-            Assert.assertEquals(200, response.getStatusLine().getStatusCode());
-            final HttpEntity entity = response.getEntity();
-            Assert.assertNotNull(entity);
-            final byte[] b2 = EntityUtils.toByteArray(entity);
-            Assert.assertArrayEquals(b1, b2);
-        }
-    }
-
-    @Test
-    public void testRequestFailure() throws Exception {
-        final HttpHost target = start();
-        final HttpGet httpget = new HttpGet("/random/2048");
-        final HttpAsyncRequestProducer requestProducer = HttpAsyncMethods.create(target, httpget) ;
-        final BasicAsyncResponseConsumer responseConsumer = new BasicAsyncResponseConsumer() {
-
-            @Override
-            public void onContentReceived(final ContentDecoder decoder, final IOControl ioctrl)
-                    throws IOException {
-                throw new IOException("Kaboom");
-            }
-
-        };
-        final Future<HttpResponse> future = this.httpclient.execute(requestProducer, responseConsumer, null);
-        try {
-            future.get();
-            Assert.fail("ExecutionException expected");
-        } catch (final ExecutionException ex) {
-            final Throwable t = ex.getCause();
-            Assert.assertNotNull(t);
-            Assert.assertTrue(t instanceof IOException);
-            Assert.assertEquals("Kaboom", t.getMessage());
-        }
-    }
-
-    @Test
-    public void testSharedPool() throws Exception {
-        final HttpHost target = start();
-        final HttpGet httpget = new HttpGet("/random/2048");
-        final Future<HttpResponse> future = this.httpclient.execute(target, httpget, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-        Assert.assertEquals(200, response.getStatusLine().getStatusCode());
-
-
-        final CloseableHttpAsyncClient httpclient2 = HttpAsyncClients.custom()
-                .setConnectionManager(this.connMgr)
-                .setConnectionManagerShared(true)
-                .build();
-        try {
-            httpclient2.start();
-            final HttpGet httpget2 = new HttpGet("/random/2048");
-            final Future<HttpResponse> future2 = httpclient2.execute(target, httpget2, null);
-            final HttpResponse response2 = future2.get();
-            Assert.assertNotNull(response2);
-            Assert.assertEquals(200, response2.getStatusLine().getStatusCode());
-
-        } finally {
-            httpclient2.close();
-        }
-
-        final HttpGet httpget3 = new HttpGet("/random/2048");
-        final Future<HttpResponse> future3 = this.httpclient.execute(target, httpget3, null);
-        final HttpResponse response3 = future3.get();
-        Assert.assertNotNull(response3);
-        Assert.assertEquals(200, response3.getStatusLine().getStatusCode());
-    }
-
-    @Test
-    public void testClientCloseloseQuietly() throws Exception {
-        final HttpHost target = start();
-        final HttpGet httpget = new HttpGet("/random/2048");
-        final Future<HttpResponse> future = this.httpclient.execute(target, httpget, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-        Assert.assertEquals(200, response.getStatusLine().getStatusCode());
-
-        HttpAsyncClientUtils.closeQuietly(this.httpclient);
-        // Close it twice
-        HttpAsyncClientUtils.closeQuietly(this.httpclient);
-    }
-
-}
diff --git a/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestHttpAsyncMinimal.java b/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestHttpAsyncMinimal.java
deleted file mode 100644
index 3993d10..0000000
--- a/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestHttpAsyncMinimal.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.client.integration;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.Queue;
-import java.util.Random;
-import java.util.concurrent.Future;
-
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
-import org.apache.http.impl.nio.client.HttpAsyncClients;
-import org.apache.http.localserver.AbstractAsyncTest;
-import org.apache.http.localserver.EchoHandler;
-import org.apache.http.localserver.RandomHandler;
-import org.apache.http.nio.entity.NByteArrayEntity;
-import org.apache.http.nio.protocol.BasicAsyncRequestHandler;
-import org.apache.http.util.EntityUtils;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-@RunWith(Parameterized.class)
-public class TestHttpAsyncMinimal extends AbstractAsyncTest {
-
-    @Parameterized.Parameters(name = "{0}")
-    public static Collection<Object[]> protocols() {
-        return Arrays.asList(new Object[][]{
-                {ProtocolScheme.http},
-                {ProtocolScheme.https},
-        });
-    }
-
-    protected CloseableHttpAsyncClient httpclient;
-
-    public TestHttpAsyncMinimal(final ProtocolScheme scheme) {
-        super(scheme);
-    }
-
-    @Before @Override
-    public void setUp() throws Exception {
-        super.setUp();
-        this.serverBootstrap.registerHandler("/echo/*", new BasicAsyncRequestHandler(new EchoHandler()));
-        this.serverBootstrap.registerHandler("/random/*", new BasicAsyncRequestHandler(new RandomHandler()));
-
-        this.httpclient = HttpAsyncClients.createMinimal(this.connMgr);
-    }
-
-    @After @Override
-    public void shutDown() throws Exception {
-        if (this.httpclient != null) {
-            this.httpclient.close();
-        }
-        super.shutDown();
-    }
-
-    public HttpHost start() throws Exception {
-        final HttpHost serverEndpoint = startServer();
-
-        this.httpclient.start();
-
-        return serverEndpoint;
-    }
-
-    @Test
-    public void testSingleGet() throws Exception {
-        final HttpHost target = start();
-        final HttpGet httpget = new HttpGet("/random/2048");
-        final Future<HttpResponse> future = this.httpclient.execute(target, httpget, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-        Assert.assertEquals(200, response.getStatusLine().getStatusCode());
-    }
-
-    @Test
-    public void testSinglePost() throws Exception {
-        final HttpHost target = start();
-        final byte[] b1 = new byte[1024];
-        final Random rnd = new Random(System.currentTimeMillis());
-        rnd.nextBytes(b1);
-
-        final HttpPost httppost = new HttpPost("/echo/stuff");
-        httppost.setEntity(new NByteArrayEntity(b1));
-
-        final Future<HttpResponse> future = this.httpclient.execute(target, httppost, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-        Assert.assertEquals(200, response.getStatusLine().getStatusCode());
-        final HttpEntity entity = response.getEntity();
-        Assert.assertNotNull(entity);
-        final byte[] b2 = EntityUtils.toByteArray(entity);
-        Assert.assertArrayEquals(b1, b2);
-    }
-
-    @Test
-    public void testMultiplePostsOverMultipleConnections() throws Exception {
-        final HttpHost target = start();
-        final byte[] b1 = new byte[1024];
-        final Random rnd = new Random(System.currentTimeMillis());
-        rnd.nextBytes(b1);
-
-        final int reqCount = 20;
-
-        this.connMgr.setDefaultMaxPerRoute(reqCount);
-        this.connMgr.setMaxTotal(100);
-
-        final Queue<Future<HttpResponse>> queue = new LinkedList<Future<HttpResponse>>();
-
-        for (int i = 0; i < reqCount; i++) {
-            final HttpPost httppost = new HttpPost("/echo/stuff");
-            httppost.setEntity(new NByteArrayEntity(b1));
-            queue.add(this.httpclient.execute(target, httppost, null));
-        }
-
-        while (!queue.isEmpty()) {
-            final Future<HttpResponse> future = queue.remove();
-            final HttpResponse response = future.get();
-            Assert.assertNotNull(response);
-            Assert.assertEquals(200, response.getStatusLine().getStatusCode());
-            final HttpEntity entity = response.getEntity();
-            Assert.assertNotNull(entity);
-            final byte[] b2 = EntityUtils.toByteArray(entity);
-            Assert.assertArrayEquals(b1, b2);
-        }
-    }
-
-    @Test
-    public void testMultiplePostsOverSingleConnection() throws Exception {
-        final HttpHost target = start();
-        final byte[] b1 = new byte[1024];
-        final Random rnd = new Random(System.currentTimeMillis());
-        rnd.nextBytes(b1);
-
-        final int reqCount = 20;
-
-        this.connMgr.setDefaultMaxPerRoute(1);
-        this.connMgr.setMaxTotal(100);
-
-        final Queue<Future<HttpResponse>> queue = new LinkedList<Future<HttpResponse>>();
-
-        for (int i = 0; i < reqCount; i++) {
-            final HttpPost httppost = new HttpPost("/echo/stuff");
-            httppost.setEntity(new NByteArrayEntity(b1));
-            queue.add(this.httpclient.execute(target, httppost, null));
-        }
-
-        while (!queue.isEmpty()) {
-            final Future<HttpResponse> future = queue.remove();
-            final HttpResponse response = future.get();
-            Assert.assertNotNull(response);
-            Assert.assertEquals(200, response.getStatusLine().getStatusCode());
-            final HttpEntity entity = response.getEntity();
-            Assert.assertNotNull(entity);
-            final byte[] b2 = EntityUtils.toByteArray(entity);
-            Assert.assertArrayEquals(b1, b2);
-        }
-    }
-
-}
diff --git a/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestHttpAsyncPipelining.java b/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestHttpAsyncPipelining.java
deleted file mode 100644
index 04d80b2..0000000
--- a/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestHttpAsyncPipelining.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.client.integration;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.Queue;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-
-import org.apache.http.ConnectionClosedException;
-import org.apache.http.HttpEntityEnclosingRequest;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.nio.client.CloseableHttpPipeliningClient;
-import org.apache.http.impl.nio.client.HttpAsyncClients;
-import org.apache.http.localserver.AbstractAsyncTest;
-import org.apache.http.localserver.EchoHandler;
-import org.apache.http.localserver.RandomHandler;
-import org.apache.http.nio.client.methods.HttpAsyncMethods;
-import org.apache.http.nio.protocol.BasicAsyncRequestHandler;
-import org.apache.http.nio.protocol.HttpAsyncRequestProducer;
-import org.apache.http.nio.protocol.HttpAsyncResponseConsumer;
-import org.apache.http.util.EntityUtils;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-@RunWith(Parameterized.class)
-public class TestHttpAsyncPipelining extends AbstractAsyncTest {
-
-    @Parameterized.Parameters(name = "{0}")
-    public static Collection<Object[]> protocols() {
-        return Arrays.asList(new Object[][]{
-                {ProtocolScheme.http},
-                {ProtocolScheme.https},
-        });
-    }
-
-    protected CloseableHttpPipeliningClient httpclient;
-
-    public TestHttpAsyncPipelining(final ProtocolScheme scheme) {
-        super(scheme);
-    }
-
-    @Before @Override
-    public void setUp() throws Exception {
-        super.setUp();
-        this.serverBootstrap.registerHandler("/echo/*", new BasicAsyncRequestHandler(new EchoHandler()));
-        this.serverBootstrap.registerHandler("/random/*", new BasicAsyncRequestHandler(new RandomHandler()));
-
-        this.httpclient = HttpAsyncClients.createPipelining(this.connMgr);
-    }
-
-    @After @Override
-    public void shutDown() throws Exception {
-        if (this.httpclient != null) {
-            this.httpclient.close();
-        }
-        super.shutDown();
-    }
-
-    public HttpHost start() throws Exception {
-        final HttpHost serverEndpoint = startServer();
-
-        this.connMgr.setDefaultMaxPerRoute(1);
-        this.httpclient.start();
-
-        return serverEndpoint;
-    }
-
-    @Test
-    public void testPipelinedGets() throws Exception {
-        final HttpHost target = start();
-
-        final Queue<Future<List<HttpResponse>>> queue = new ConcurrentLinkedQueue<Future<List<HttpResponse>>>();
-        for (int i = 0; i < 10; i++) {
-            final HttpRequest httpget1 = new HttpGet("/random/512");
-            final HttpRequest httpget2 = new HttpGet("/random/1024");
-            final HttpRequest httpget3 = new HttpGet("/random/2048");
-            queue.add(this.httpclient.execute(target, Arrays.asList(httpget1, httpget2, httpget3), null));
-        }
-
-        while (!queue.isEmpty()) {
-            final Future<List<HttpResponse>> future = queue.remove();
-            final List<HttpResponse> responses = future.get();
-            Assert.assertNotNull(responses);
-            Assert.assertEquals(3, responses.size());
-            final HttpResponse response1 = responses.get(0);
-            Assert.assertEquals(200, response1.getStatusLine().getStatusCode());
-            final byte[] bytes1 = EntityUtils.toByteArray(response1.getEntity());
-            Assert.assertNotNull(bytes1);
-            Assert.assertEquals(512, bytes1.length);
-            final HttpResponse response2 = responses.get(1);
-            Assert.assertEquals(200, response2.getStatusLine().getStatusCode());
-            final byte[] bytes2 = EntityUtils.toByteArray(response2.getEntity());
-            Assert.assertNotNull(bytes2);
-            Assert.assertEquals(1024, bytes2.length);
-            final HttpResponse response3 = responses.get(2);
-            Assert.assertEquals(200, response3.getStatusLine().getStatusCode());
-            final byte[] bytes3 = EntityUtils.toByteArray(response3.getEntity());
-            Assert.assertNotNull(bytes3);
-            Assert.assertEquals(2048, bytes3.length);
-        }
-
-    }
-
-    @Test
-    public void testPipelinedPostsAndGets() throws Exception {
-        final HttpHost target = start();
-
-        final Queue<Future<List<HttpResponse>>> queue = new ConcurrentLinkedQueue<Future<List<HttpResponse>>>();
-        for (int i = 0; i < 10; i++) {
-            final HttpEntityEnclosingRequest httppost1 = new HttpPost("/echo/");
-            httppost1.setEntity(new StringEntity("this and that"));
-            final HttpRequest httpget2 = new HttpGet("/echo/");
-            final HttpEntityEnclosingRequest httppost3 = new HttpPost("/echo/");
-            httppost3.setEntity(new StringEntity("all sorts of things"));
-            queue.add(this.httpclient.execute(target, Arrays.asList(httppost1, httpget2, httppost3), null));
-        }
-
-        while (!queue.isEmpty()) {
-            final Future<List<HttpResponse>> future = queue.remove();
-            final List<HttpResponse> responses = future.get();
-            Assert.assertNotNull(responses);
-            Assert.assertEquals(3, responses.size());
-            final HttpResponse response1 = responses.get(0);
-            Assert.assertEquals(200, response1.getStatusLine().getStatusCode());
-            final String s1 = EntityUtils.toString(response1.getEntity());
-            Assert.assertNotNull(s1);
-            Assert.assertEquals("this and that", s1);
-            final HttpResponse response2 = responses.get(1);
-            Assert.assertEquals(200, response2.getStatusLine().getStatusCode());
-            final String s2 = EntityUtils.toString(response2.getEntity());
-            Assert.assertNotNull(s2);
-            Assert.assertEquals("", s2);
-            final HttpResponse response3 = responses.get(2);
-            Assert.assertEquals(200, response3.getStatusLine().getStatusCode());
-            final String s3 = EntityUtils.toString(response3.getEntity());
-            Assert.assertNotNull(s3);
-            Assert.assertEquals("all sorts of things", s3);
-        }
-
-    }
-
-    @Test @Ignore(value = "Fails on Windows")
-    public void testPipelinedRequestsUnexpectedConnectionClosure() throws Exception {
-        final HttpHost target = start();
-
-        for (int i = 0; i < 20; i++) {
-            final HttpAsyncRequestProducer p1 = HttpAsyncMethods.create(target, new HttpGet("/random/512"));
-            final HttpAsyncRequestProducer p2 = HttpAsyncMethods.create(target, new HttpGet("/pampa"));
-            final HttpAsyncRequestProducer p3 = HttpAsyncMethods.create(target, new HttpGet("/random/512"));
-            final HttpAsyncRequestProducer p4 = HttpAsyncMethods.create(target, new HttpGet("/random/512"));
-            final List<HttpAsyncRequestProducer> requestProducers = new ArrayList<HttpAsyncRequestProducer>();
-            requestProducers.add(p1);
-            requestProducers.add(p2);
-            requestProducers.add(p3);
-            requestProducers.add(p4);
-
-            final HttpAsyncResponseConsumer<HttpResponse> c1 = HttpAsyncMethods.createConsumer();
-            final HttpAsyncResponseConsumer<HttpResponse> c2 = HttpAsyncMethods.createConsumer();
-            final HttpAsyncResponseConsumer<HttpResponse> c3 = HttpAsyncMethods.createConsumer();
-            final HttpAsyncResponseConsumer<HttpResponse> c4 = HttpAsyncMethods.createConsumer();
-            final List<HttpAsyncResponseConsumer<HttpResponse>> responseConsumers = new ArrayList<HttpAsyncResponseConsumer<HttpResponse>>();
-            responseConsumers.add(c1);
-            responseConsumers.add(c2);
-            responseConsumers.add(c3);
-            responseConsumers.add(c4);
-
-            final Future<List<HttpResponse>> future = this.httpclient.execute(
-                    target,
-                    requestProducers,
-                    responseConsumers,
-                    null, null);
-            try {
-                future.get();
-            } catch (final ExecutionException ex) {
-                final Throwable cause = ex.getCause();
-                Assert.assertNotNull(cause);
-                Assert.assertTrue(cause instanceof ConnectionClosedException);
-            }
-            Assert.assertTrue(c1.isDone());
-            Assert.assertNotNull(c1.getResult());
-            Assert.assertTrue(c2.isDone());
-            Assert.assertNotNull(c2.getResult());
-            Assert.assertTrue(c3.isDone());
-            Assert.assertNull(c3.getResult());
-            Assert.assertTrue(c4.isDone());
-            Assert.assertNull(c4.getResult());
-        }
-
-    }
-
-}
diff --git a/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestHttpAsyncPrematureTermination.java b/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestHttpAsyncPrematureTermination.java
deleted file mode 100644
index 1977e27..0000000
--- a/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestHttpAsyncPrematureTermination.java
+++ /dev/null
@@ -1,395 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.client.integration;
-
-import java.io.IOException;
-import java.net.UnknownHostException;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.apache.http.HttpConnection;
-import org.apache.http.HttpException;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.concurrent.FutureCallback;
-import org.apache.http.entity.ContentType;
-import org.apache.http.impl.nio.client.HttpAsyncClients;
-import org.apache.http.localserver.EchoHandler;
-import org.apache.http.localserver.HttpAsyncTestBase;
-import org.apache.http.localserver.RandomHandler;
-import org.apache.http.nio.ContentDecoder;
-import org.apache.http.nio.ContentEncoder;
-import org.apache.http.nio.IOControl;
-import org.apache.http.nio.client.methods.HttpAsyncMethods;
-import org.apache.http.nio.entity.NStringEntity;
-import org.apache.http.nio.protocol.BasicAsyncRequestConsumer;
-import org.apache.http.nio.protocol.BasicAsyncRequestHandler;
-import org.apache.http.nio.protocol.BasicAsyncRequestProducer;
-import org.apache.http.nio.protocol.BasicAsyncResponseProducer;
-import org.apache.http.nio.protocol.HttpAsyncExchange;
-import org.apache.http.nio.protocol.HttpAsyncRequestConsumer;
-import org.apache.http.nio.protocol.HttpAsyncRequestHandler;
-import org.apache.http.nio.protocol.HttpAsyncRequestProducer;
-import org.apache.http.nio.protocol.HttpAsyncResponseConsumer;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.protocol.HttpCoreContext;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class TestHttpAsyncPrematureTermination extends HttpAsyncTestBase {
-
-    @Test
-    public void testConnectionTerminatedProcessingRequest() throws Exception {
-        this.serverBootstrap.registerHandler("*", new HttpAsyncRequestHandler<HttpRequest>() {
-
-            @Override
-            public HttpAsyncRequestConsumer<HttpRequest> processRequest(
-                    final HttpRequest request,
-                    final HttpContext context) throws HttpException, IOException {
-                final HttpConnection conn = (HttpConnection) context.getAttribute(
-                        HttpCoreContext.HTTP_CONNECTION);
-                conn.shutdown();
-                return new BasicAsyncRequestConsumer();
-            }
-
-            @Override
-            public void handle(
-                    final HttpRequest request,
-                    final HttpAsyncExchange httpExchange,
-                    final HttpContext context) throws HttpException, IOException {
-                final HttpResponse response = httpExchange.getResponse();
-                response.setEntity(new NStringEntity("all is well", ContentType.TEXT_PLAIN));
-                httpExchange.submitResponse();
-            }
-
-        });
-
-        final HttpHost target = start();
-        final HttpGet httpget = new HttpGet("/");
-
-        final CountDownLatch latch = new CountDownLatch(1);
-
-        final FutureCallback<HttpResponse> callback = new FutureCallback<HttpResponse>() {
-
-            @Override
-            public void cancelled() {
-                latch.countDown();
-            }
-
-            @Override
-            public void failed(final Exception ex) {
-                latch.countDown();
-            }
-
-            @Override
-            public void completed(final HttpResponse response) {
-                Assert.fail();
-            }
-
-        };
-
-        this.httpclient.execute(target, httpget, callback);
-        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testConnectionTerminatedHandlingRequest() throws Exception {
-        this.serverBootstrap.registerHandler("*", new HttpAsyncRequestHandler<HttpRequest>() {
-
-            @Override
-            public HttpAsyncRequestConsumer<HttpRequest> processRequest(
-                    final HttpRequest request,
-                    final HttpContext context) throws HttpException, IOException {
-                return new BasicAsyncRequestConsumer();
-            }
-
-            @Override
-            public void handle(
-                    final HttpRequest request,
-                    final HttpAsyncExchange httpExchange,
-                    final HttpContext context) throws HttpException, IOException {
-                final HttpConnection conn = (HttpConnection) context.getAttribute(
-                        HttpCoreContext.HTTP_CONNECTION);
-                conn.shutdown();
-                final HttpResponse response = httpExchange.getResponse();
-                response.setEntity(new NStringEntity("all is well", ContentType.TEXT_PLAIN));
-                httpExchange.submitResponse();
-            }
-
-        });
-
-        final HttpHost target = start();
-        final HttpGet httpget = new HttpGet("/");
-
-        final CountDownLatch latch = new CountDownLatch(1);
-
-        final FutureCallback<HttpResponse> callback = new FutureCallback<HttpResponse>() {
-
-            @Override
-            public void cancelled() {
-                latch.countDown();
-            }
-
-            @Override
-            public void failed(final Exception ex) {
-                latch.countDown();
-            }
-
-            @Override
-            public void completed(final HttpResponse response) {
-                Assert.fail();
-            }
-
-        };
-
-        this.httpclient.execute(target, httpget, callback);
-        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testConnectionTerminatedSendingResponse() throws Exception {
-        this.serverBootstrap.registerHandler("*", new HttpAsyncRequestHandler<HttpRequest>() {
-
-            @Override
-            public HttpAsyncRequestConsumer<HttpRequest> processRequest(
-                    final HttpRequest request,
-                    final HttpContext context) throws HttpException, IOException {
-                return new BasicAsyncRequestConsumer();
-            }
-
-            @Override
-            public void handle(
-                    final HttpRequest request,
-                    final HttpAsyncExchange httpExchange,
-                    final HttpContext context) throws HttpException, IOException {
-                final HttpResponse response = httpExchange.getResponse();
-                response.setEntity(new NStringEntity("all is well", ContentType.TEXT_PLAIN));
-                httpExchange.submitResponse(new BasicAsyncResponseProducer(response) {
-
-                    @Override
-                    public synchronized void produceContent(
-                            final ContentEncoder encoder,
-                            final IOControl ioctrl) throws IOException {
-                        ioctrl.shutdown();
-                    }
-
-                });
-            }
-
-        });
-
-        final HttpHost target = start();
-        final HttpGet httpget = new HttpGet("/");
-
-        final CountDownLatch latch = new CountDownLatch(1);
-
-        final FutureCallback<HttpResponse> callback = new FutureCallback<HttpResponse>() {
-
-            @Override
-            public void cancelled() {
-                latch.countDown();
-            }
-
-            @Override
-            public void failed(final Exception ex) {
-                latch.countDown();
-            }
-
-            @Override
-            public void completed(final HttpResponse response) {
-                Assert.fail();
-            }
-
-        };
-
-        this.httpclient.execute(target, httpget, callback);
-        Assert.assertTrue(latch.await(5, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void testConnectionRequestFailure() throws Exception {
-        this.httpclient = HttpAsyncClients.custom()
-                .setConnectionManager(this.connMgr)
-                .build();
-        this.httpclient.start();
-
-        final HttpGet get = new HttpGet("http://stuff.invalid/");
-        final HttpAsyncRequestProducer producer = HttpAsyncMethods.create(get);
-
-        final AtomicBoolean closed = new AtomicBoolean(false);
-        final AtomicBoolean cancelled = new AtomicBoolean(false);
-        final AtomicBoolean failed = new AtomicBoolean(false);
-
-        final HttpAsyncResponseConsumer<?> consumer = new HttpAsyncResponseConsumer<Object>() {
-
-            @Override
-            public void close() throws IOException {
-                closed.set(true);
-            }
-
-            @Override
-            public boolean cancel() {
-                cancelled.set(true);
-                return false;
-            }
-
-            @Override
-            public void failed(final Exception ex) {
-                failed.set(true);
-            }
-
-            @Override
-            public void responseReceived(
-                    final HttpResponse response) throws IOException, HttpException {
-                throw new IllegalStateException();
-            }
-
-            @Override
-            public void consumeContent(
-                    final ContentDecoder decoder, final IOControl ioctrl) throws IOException {
-                throw new IllegalStateException();
-            }
-
-            @Override
-            public void responseCompleted(final HttpContext context) {
-                throw new IllegalStateException();
-            }
-
-            @Override
-            public Exception getException() {
-                return null;
-            }
-
-            @Override
-            public String getResult() {
-                return null;
-            }
-
-            @Override
-            public boolean isDone() {
-                return false;
-            }
-        };
-
-        final Future<?> future = this.httpclient.execute(producer, consumer, null, null);
-        try {
-            future.get();
-            Assert.fail();
-        } catch (final ExecutionException e) {
-            Assert.assertTrue(e.toString(), e.getCause() instanceof UnknownHostException);
-        }
-        this.connMgr.shutdown(1000);
-
-        Assert.assertTrue(closed.get());
-        Assert.assertFalse(cancelled.get());
-        Assert.assertTrue(failed.get());
-    }
-
-    @Test
-    public void testConsumerIsDone() throws Exception {
-        this.serverBootstrap.registerHandler("/echo/*", new BasicAsyncRequestHandler(new EchoHandler()));
-        this.serverBootstrap.registerHandler("/random/*", new BasicAsyncRequestHandler(new RandomHandler()));
-
-        final HttpHost target = start();
-
-        final AtomicInteger producerClosed = new AtomicInteger(0);
-        final AtomicInteger consumerClosed = new AtomicInteger(0);
-
-        final HttpAsyncRequestProducer producer = new BasicAsyncRequestProducer(target, new HttpGet("/")) {
-
-            @Override
-            public synchronized void close() throws IOException {
-                producerClosed.incrementAndGet();
-                super.close();
-            }
-        };
-
-        final HttpAsyncResponseConsumer<?> consumer = new HttpAsyncResponseConsumer<Object>() {
-
-            @Override
-            public void close() throws IOException {
-                consumerClosed.incrementAndGet();
-            }
-
-            @Override
-            public boolean cancel() {
-                return false;
-            }
-
-            @Override
-            public void failed(final Exception ex) {
-            }
-
-            @Override
-            public void responseReceived(
-                    final HttpResponse response) throws IOException, HttpException {
-            }
-
-            @Override
-            public void consumeContent(
-                    final ContentDecoder decoder, final IOControl ioctrl) throws IOException {
-            }
-
-            @Override
-            public void responseCompleted(final HttpContext context) {
-            }
-
-            @Override
-            public Exception getException() {
-                return null;
-            }
-
-            @Override
-            public String getResult() {
-                return null;
-            }
-
-            @Override
-            public boolean isDone() {
-                return true; // cancels fetching the response-body
-            }
-        };
-
-        final Future<?> future = this.httpclient.execute(producer, consumer, null, null);
-        future.get();
-
-        connMgr.shutdown(1000);
-
-        Assert.assertTrue(future.isCancelled());
-        Assert.assertTrue(future.isCancelled());
-
-        Assert.assertEquals(1, producerClosed.get());
-        Assert.assertEquals(1, consumerClosed.get());
-    }
-
-}
diff --git a/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestRedirects.java b/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestRedirects.java
deleted file mode 100644
index 75341d4..0000000
--- a/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestRedirects.java
+++ /dev/null
@@ -1,856 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.client.integration;
-
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.Queue;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.http.Header;
-import org.apache.http.localserver.HttpAsyncTestBase;
-import org.apache.http.HttpException;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpInetConnection;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.ProtocolException;
-import org.apache.http.ProtocolVersion;
-import org.apache.http.client.CircularRedirectException;
-import org.apache.http.client.CookieStore;
-import org.apache.http.client.RedirectException;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.client.utils.URIBuilder;
-import org.apache.http.cookie.SM;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.client.BasicCookieStore;
-import org.apache.http.impl.cookie.BasicClientCookie;
-import org.apache.http.impl.nio.bootstrap.HttpServer;
-import org.apache.http.localserver.RandomHandler;
-import org.apache.http.message.BasicHeader;
-import org.apache.http.nio.entity.NStringEntity;
-import org.apache.http.nio.protocol.BasicAsyncRequestHandler;
-import org.apache.http.nio.reactor.ListenerEndpoint;
-import org.apache.http.protocol.HTTP;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.protocol.HttpCoreContext;
-import org.apache.http.protocol.HttpRequestHandler;
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-/**
- * Redirection test cases.
- */
-@RunWith(Parameterized.class)
-public class TestRedirects extends HttpAsyncTestBase {
-
-    @Parameterized.Parameters(name = "{0}")
-    public static Collection<Object[]> protocols() {
-        return Arrays.asList(new Object[][]{
-                {ProtocolScheme.http},
-                {ProtocolScheme.https},
-        });
-    }
-
-    public TestRedirects(final ProtocolScheme scheme) {
-        super(scheme);
-    }
-
-    static class BasicRedirectService implements HttpRequestHandler {
-
-        private final String schemeName;
-        private final int statuscode;
-
-        public BasicRedirectService(final String schemeName, final int statuscode) {
-            super();
-            this.schemeName = schemeName;
-            this.statuscode = statuscode;
-        }
-
-        @Override
-        public void handle(
-                final HttpRequest request,
-                final HttpResponse response,
-                final HttpContext context) throws HttpException, IOException {
-            final HttpInetConnection conn = (HttpInetConnection) context.getAttribute(
-                    HttpCoreContext.HTTP_CONNECTION);
-            final ProtocolVersion ver = request.getRequestLine().getProtocolVersion();
-            final String uri = request.getRequestLine().getUri();
-            if (uri.equals("/oldlocation/")) {
-                final String redirectUrl = this.schemeName + "://localhost:" + conn.getLocalPort() + "/newlocation/";
-                response.setStatusLine(ver, this.statuscode);
-                response.addHeader(new BasicHeader("Location", redirectUrl));
-                response.addHeader(new BasicHeader("Connection", "close"));
-            } else if (uri.equals("/newlocation/")) {
-                response.setStatusLine(ver, HttpStatus.SC_OK);
-                final StringEntity entity = new StringEntity("Successful redirect");
-                response.setEntity(entity);
-            } else {
-                response.setStatusLine(ver, HttpStatus.SC_NOT_FOUND);
-            }
-        }
-    }
-
-    static class CircularRedirectService implements HttpRequestHandler {
-
-        public CircularRedirectService() {
-            super();
-        }
-
-        @Override
-        public void handle(
-                final HttpRequest request,
-                final HttpResponse response,
-                final HttpContext context) throws HttpException, IOException {
-            final ProtocolVersion ver = request.getRequestLine().getProtocolVersion();
-            final String uri = request.getRequestLine().getUri();
-            if (uri.startsWith("/circular-oldlocation")) {
-                response.setStatusLine(ver, HttpStatus.SC_MOVED_TEMPORARILY);
-                response.addHeader(new BasicHeader("Location", "/circular-location2"));
-            } else if (uri.startsWith("/circular-location2")) {
-                response.setStatusLine(ver, HttpStatus.SC_MOVED_TEMPORARILY);
-                response.addHeader(new BasicHeader("Location", "/circular-oldlocation"));
-            } else {
-                response.setStatusLine(ver, HttpStatus.SC_NOT_FOUND);
-            }
-        }
-    }
-
-    static class RelativeRedirectService implements HttpRequestHandler {
-
-        public RelativeRedirectService() {
-            super();
-        }
-
-        @Override
-        public void handle(
-                final HttpRequest request,
-                final HttpResponse response,
-                final HttpContext context) throws HttpException, IOException {
-            final ProtocolVersion ver = request.getRequestLine().getProtocolVersion();
-            final String uri = request.getRequestLine().getUri();
-            if (uri.equals("/oldlocation/")) {
-                response.setStatusLine(ver, HttpStatus.SC_MOVED_TEMPORARILY);
-                response.addHeader(new BasicHeader("Location", "/relativelocation/"));
-            } else if (uri.equals("/relativelocation/")) {
-                response.setStatusLine(ver, HttpStatus.SC_OK);
-                final StringEntity entity = new StringEntity("Successful redirect");
-                response.setEntity(entity);
-            } else {
-                response.setStatusLine(ver, HttpStatus.SC_NOT_FOUND);
-            }
-        }
-    }
-
-    static class RelativeRedirectService2 implements HttpRequestHandler {
-
-        public RelativeRedirectService2() {
-            super();
-        }
-
-        @Override
-        public void handle(
-                final HttpRequest request,
-                final HttpResponse response,
-                final HttpContext context) throws HttpException, IOException {
-            final ProtocolVersion ver = request.getRequestLine().getProtocolVersion();
-            final String uri = request.getRequestLine().getUri();
-            if (uri.equals("/test/oldlocation")) {
-                response.setStatusLine(ver, HttpStatus.SC_MOVED_TEMPORARILY);
-                response.addHeader(new BasicHeader("Location", "relativelocation"));
-            } else if (uri.equals("/test/relativelocation")) {
-                response.setStatusLine(ver, HttpStatus.SC_OK);
-                final StringEntity entity = new StringEntity("Successful redirect");
-                response.setEntity(entity);
-            } else {
-                response.setStatusLine(ver, HttpStatus.SC_NOT_FOUND);
-            }
-        }
-    }
-
-    static class BogusRedirectService implements HttpRequestHandler {
-
-        private final String schemeName;
-        private final String url;
-        private final boolean absolute;
-
-        public BogusRedirectService(final String schemeName, final String url, final boolean absolute) {
-            super();
-            this.schemeName = schemeName;
-            this.url = url;
-            this.absolute = absolute;
-        }
-
-        @Override
-        public void handle(
-                final HttpRequest request,
-                final HttpResponse response,
-                final HttpContext context) throws HttpException, IOException {
-            final HttpInetConnection conn = (HttpInetConnection) context.getAttribute(
-                    HttpCoreContext.HTTP_CONNECTION);
-            String redirectUrl = this.url;
-            if (!this.absolute) {
-                redirectUrl = this.schemeName + "://localhost:" + conn.getLocalPort() + redirectUrl;
-            }
-
-            final ProtocolVersion ver = request.getRequestLine().getProtocolVersion();
-            final String uri = request.getRequestLine().getUri();
-            if (uri.equals("/oldlocation/")) {
-                response.setStatusLine(ver, HttpStatus.SC_MOVED_TEMPORARILY);
-                response.addHeader(new BasicHeader("Location", redirectUrl));
-            } else if (uri.equals("/relativelocation/")) {
-                response.setStatusLine(ver, HttpStatus.SC_OK);
-                final StringEntity entity = new StringEntity("Successful redirect");
-                response.setEntity(entity);
-            } else {
-                response.setStatusLine(ver, HttpStatus.SC_NOT_FOUND);
-            }
-        }
-    }
-
-    private static class RomeRedirectService implements HttpRequestHandler {
-
-        public RomeRedirectService() {
-            super();
-        }
-
-        @Override
-        public void handle(
-                final HttpRequest request,
-                final HttpResponse response,
-                final HttpContext context) throws HttpException, IOException {
-            final String uri = request.getRequestLine().getUri();
-            if (uri.equals("/rome")) {
-                response.setStatusCode(HttpStatus.SC_OK);
-                final StringEntity entity = new StringEntity("Successful redirect");
-                response.setEntity(entity);
-            } else {
-                response.setStatusCode(HttpStatus.SC_MOVED_TEMPORARILY);
-                response.addHeader(new BasicHeader("Location", "/rome"));
-            }
-        }
-    }
-
-    @Test
-    public void testBasicRedirect300() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(
-                new BasicRedirectService(getSchemeName(), HttpStatus.SC_MULTIPLE_CHOICES)));
-        final HttpHost target = start();
-
-        final HttpClientContext context = HttpClientContext.create();
-
-        final HttpGet httpget = new HttpGet("/oldlocation/");
-
-        final Future<HttpResponse> future = this.httpclient.execute(target, httpget, context, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-
-        final HttpRequest reqWrapper = context.getRequest();
-
-        Assert.assertEquals(HttpStatus.SC_MULTIPLE_CHOICES, response.getStatusLine().getStatusCode());
-        Assert.assertEquals("/oldlocation/", reqWrapper.getRequestLine().getUri());
-    }
-
-    @Test
-    public void testBasicRedirect301() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(
-                new BasicRedirectService(getSchemeName(), HttpStatus.SC_MOVED_PERMANENTLY)));
-        final HttpHost target = start();
-
-        final HttpClientContext context = HttpClientContext.create();
-
-        final HttpGet httpget = new HttpGet("/oldlocation/");
-
-        final Future<HttpResponse> future = this.httpclient.execute(target, httpget, context, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-
-        final HttpRequest reqWrapper = context.getRequest();
-        final HttpHost host = context.getTargetHost();
-
-        Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
-        Assert.assertEquals("/newlocation/", reqWrapper.getRequestLine().getUri());
-        Assert.assertEquals(target, host);
-    }
-
-    @Test
-    public void testBasicRedirect302() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(
-                new BasicRedirectService(getSchemeName(), HttpStatus.SC_MOVED_TEMPORARILY)));
-        final HttpHost target = start();
-
-        final HttpClientContext context = HttpClientContext.create();
-
-        final HttpGet httpget = new HttpGet("/oldlocation/");
-
-        final Future<HttpResponse> future = this.httpclient.execute(target, httpget, context, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-
-        final HttpRequest reqWrapper = context.getRequest();
-        final HttpHost host = context.getTargetHost();
-
-        Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
-        Assert.assertEquals("/newlocation/", reqWrapper.getRequestLine().getUri());
-        Assert.assertEquals(target, host);
-    }
-
-    @Test
-    public void testBasicRedirect302NoLocation() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(new HttpRequestHandler() {
-
-            @Override
-            public void handle(
-                    final HttpRequest request,
-                    final HttpResponse response,
-                    final HttpContext context) throws HttpException, IOException {
-                response.setStatusCode(HttpStatus.SC_MOVED_TEMPORARILY);
-            }
-
-        }));
-        final HttpHost target = start();
-
-        final HttpClientContext context = HttpClientContext.create();
-
-        final HttpGet httpget = new HttpGet("/oldlocation/");
-
-        final Future<HttpResponse> future = this.httpclient.execute(target, httpget, context, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-
-        final HttpRequest reqWrapper = context.getRequest();
-        final HttpHost host = context.getTargetHost();
-
-        Assert.assertEquals(HttpStatus.SC_MOVED_TEMPORARILY, response.getStatusLine().getStatusCode());
-        Assert.assertEquals("/oldlocation/", reqWrapper.getRequestLine().getUri());
-        Assert.assertEquals(target, host);
-    }
-
-    @Test
-    public void testBasicRedirect303() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(
-                new BasicRedirectService(getSchemeName(), HttpStatus.SC_SEE_OTHER)));
-        final HttpHost target = start();
-
-        final HttpClientContext context = HttpClientContext.create();
-
-        final HttpGet httpget = new HttpGet("/oldlocation/");
-
-        final Future<HttpResponse> future = this.httpclient.execute(target, httpget, context, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-
-        final HttpRequest reqWrapper = context.getRequest();
-        final HttpHost host = context.getTargetHost();
-
-        Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
-        Assert.assertEquals("/newlocation/", reqWrapper.getRequestLine().getUri());
-        Assert.assertEquals(target, host);
-    }
-
-    @Test
-    public void testBasicRedirect304() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(
-                new BasicRedirectService(getSchemeName(), HttpStatus.SC_NOT_MODIFIED)));
-        final HttpHost target = start();
-
-        final HttpClientContext context = HttpClientContext.create();
-
-        final HttpGet httpget = new HttpGet("/oldlocation/");
-
-        final Future<HttpResponse> future = this.httpclient.execute(target, httpget, context, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-
-        final HttpRequest reqWrapper = context.getRequest();
-
-        Assert.assertEquals(HttpStatus.SC_NOT_MODIFIED, response.getStatusLine().getStatusCode());
-        Assert.assertEquals("/oldlocation/", reqWrapper.getRequestLine().getUri());
-    }
-
-    @Test
-    public void testBasicRedirect305() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(
-                new BasicRedirectService(getSchemeName(), HttpStatus.SC_USE_PROXY)));
-        final HttpHost target = start();
-
-        final HttpClientContext context = HttpClientContext.create();
-
-        final HttpGet httpget = new HttpGet("/oldlocation/");
-
-        final Future<HttpResponse> future = this.httpclient.execute(target, httpget, context, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-
-        final HttpRequest reqWrapper = context.getRequest();
-
-        Assert.assertEquals(HttpStatus.SC_USE_PROXY, response.getStatusLine().getStatusCode());
-        Assert.assertEquals("/oldlocation/", reqWrapper.getRequestLine().getUri());
-    }
-
-    @Test
-    public void testBasicRedirect307() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(
-                new BasicRedirectService(getSchemeName(), HttpStatus.SC_TEMPORARY_REDIRECT)));
-        final HttpHost target = start();
-
-        final HttpClientContext context = HttpClientContext.create();
-
-        final HttpGet httpget = new HttpGet("/oldlocation/");
-
-        final Future<HttpResponse> future = this.httpclient.execute(target, httpget, context, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-
-        final HttpRequest reqWrapper = context.getRequest();
-        final HttpHost host = context.getTargetHost();
-
-        Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
-        Assert.assertEquals("/newlocation/", reqWrapper.getRequestLine().getUri());
-        Assert.assertEquals(target, host);
-    }
-
-    @Test(expected=ExecutionException.class)
-    public void testMaxRedirectCheck() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(new CircularRedirectService()));
-        final HttpHost target = start();
-
-        final RequestConfig config = RequestConfig.custom()
-                .setCircularRedirectsAllowed(true)
-                .setMaxRedirects(5).build();
-
-        final HttpGet httpget = new HttpGet("/circular-oldlocation/");
-        httpget.setConfig(config);
-        try {
-            final Future<HttpResponse> future = this.httpclient.execute(target, httpget, null);
-            future.get();
-        } catch (final ExecutionException e) {
-            Assert.assertTrue(e.getCause() instanceof RedirectException);
-            throw e;
-        }
-    }
-
-    @Test(expected=ExecutionException.class)
-    public void testCircularRedirect() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(new CircularRedirectService()));
-        final HttpHost target = start();
-
-        final RequestConfig config = RequestConfig.custom()
-                .setCircularRedirectsAllowed(false)
-                .setRelativeRedirectsAllowed(true)
-                .build();
-
-        final HttpGet httpget = new HttpGet("/circular-oldlocation/");
-        httpget.setConfig(config);
-        try {
-            final Future<HttpResponse> future = this.httpclient.execute(target, httpget, null);
-            future.get();
-        } catch (final ExecutionException e) {
-            Assert.assertTrue(e.getCause() instanceof CircularRedirectException);
-            throw e;
-        }
-    }
-
-    @Test
-    public void testPostNoRedirect() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(
-                new BasicRedirectService(getSchemeName(), HttpStatus.SC_MOVED_TEMPORARILY)));
-        final HttpHost target = start();
-
-        final HttpClientContext context = HttpClientContext.create();
-
-        final HttpPost httppost = new HttpPost("/oldlocation/");
-        httppost.setEntity(new NStringEntity("stuff"));
-
-        final Future<HttpResponse> future = this.httpclient.execute(target, httppost, context, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-
-        final HttpRequest reqWrapper = context.getRequest();
-
-        Assert.assertEquals(HttpStatus.SC_MOVED_TEMPORARILY, response.getStatusLine().getStatusCode());
-        Assert.assertEquals("/oldlocation/", reqWrapper.getRequestLine().getUri());
-        Assert.assertEquals("POST", reqWrapper.getRequestLine().getMethod());
-    }
-
-    @Test
-    public void testPostRedirectSeeOther() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(
-                new BasicRedirectService(getSchemeName(), HttpStatus.SC_SEE_OTHER)));
-        final HttpHost target = start();
-
-        final HttpClientContext context = HttpClientContext.create();
-
-        final HttpPost httppost = new HttpPost("/oldlocation/");
-        httppost.setEntity(new NStringEntity("stuff"));
-
-        final Future<HttpResponse> future = this.httpclient.execute(target, httppost, context, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-
-        final HttpRequest reqWrapper = context.getRequest();
-
-        Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
-        Assert.assertEquals("/newlocation/", reqWrapper.getRequestLine().getUri());
-        Assert.assertEquals("GET", reqWrapper.getRequestLine().getMethod());
-    }
-
-    @Test
-    public void testRelativeRedirect() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(new RelativeRedirectService()));
-        final HttpHost target = start();
-
-        final HttpClientContext context = HttpClientContext.create();
-
-        final RequestConfig config = RequestConfig.custom()
-                .setRelativeRedirectsAllowed(true)
-                .build();
-
-        final HttpGet httpget = new HttpGet("/oldlocation/");
-        httpget.setConfig(config);
-
-        final Future<HttpResponse> future = this.httpclient.execute(target, httpget, context, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-
-        final HttpRequest reqWrapper = context.getRequest();
-        final HttpHost host = context.getTargetHost();
-
-        Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
-        Assert.assertEquals("/relativelocation/", reqWrapper.getRequestLine().getUri());
-        Assert.assertEquals(target, host);
-    }
-
-    @Test
-    public void testRelativeRedirect2() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(new RelativeRedirectService2()));
-        final HttpHost target = start();
-
-        final HttpClientContext context = HttpClientContext.create();
-
-        final RequestConfig config = RequestConfig.custom()
-                .setRelativeRedirectsAllowed(true)
-                .build();
-
-        final HttpGet httpget = new HttpGet("/test/oldlocation");
-        httpget.setConfig(config);
-
-        final Future<HttpResponse> future = this.httpclient.execute(target, httpget, context, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-
-        final HttpRequest reqWrapper = context.getRequest();
-        final HttpHost host = context.getTargetHost();
-
-        Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
-        Assert.assertEquals("/test/relativelocation", reqWrapper.getRequestLine().getUri());
-        Assert.assertEquals(target, host);
-    }
-
-    @Test(expected=ExecutionException.class)
-    public void testRejectRelativeRedirect() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(new RelativeRedirectService()));
-        final HttpHost target = start();
-
-        final RequestConfig config = RequestConfig.custom()
-                .setRelativeRedirectsAllowed(false)
-                .build();
-
-        final HttpGet httpget = new HttpGet("/oldlocation/");
-        httpget.setConfig(config);
-        try {
-            final Future<HttpResponse> future = this.httpclient.execute(target, httpget, null);
-            future.get();
-        } catch (final ExecutionException e) {
-            Assert.assertTrue(e.getCause() instanceof ProtocolException);
-            throw e;
-        }
-    }
-
-    @Test(expected=ExecutionException.class)
-    public void testRejectBogusRedirectLocation() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(
-                new BogusRedirectService(getSchemeName(), "xxx://bogus", true)));
-        final HttpHost target = start();
-
-        final HttpGet httpget = new HttpGet("/oldlocation/");
-
-        try {
-            final Future<HttpResponse> future = this.httpclient.execute(target, httpget, null);
-            future.get();
-        } catch (final ExecutionException ex) {
-            Assert.assertTrue(ex.getCause() instanceof HttpException);
-            throw ex;
-        }
-    }
-
-    @Test(expected=ExecutionException.class)
-    public void testRejectInvalidRedirectLocation() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(
-                new BogusRedirectService(getSchemeName(), "/newlocation/?p=I have spaces", false)));
-        final HttpHost target = start();
-
-        final HttpGet httpget = new HttpGet("/oldlocation/");
-        try {
-            final Future<HttpResponse> future = this.httpclient.execute(target, httpget, null);
-            future.get();
-        } catch (final ExecutionException e) {
-            Assert.assertTrue(e.getCause() instanceof ProtocolException);
-            throw e;
-        }
-    }
-
-    @Test
-    public void testRedirectWithCookie() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(
-                new BasicRedirectService(getSchemeName(), HttpStatus.SC_MOVED_TEMPORARILY)));
-        final HttpHost target = start();
-
-        final CookieStore cookieStore = new BasicCookieStore();
-        final HttpClientContext context = HttpClientContext.create();
-        context.setCookieStore(cookieStore);
-
-        final BasicClientCookie cookie = new BasicClientCookie("name", "value");
-        cookie.setDomain(target.getHostName());
-        cookie.setPath("/");
-
-        cookieStore.addCookie(cookie);
-
-        final HttpGet httpget = new HttpGet("/oldlocation/");
-
-        final Future<HttpResponse> future = this.httpclient.execute(target, httpget, context, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-
-        final HttpRequest reqWrapper = context.getRequest();
-
-        Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
-        Assert.assertEquals("/newlocation/", reqWrapper.getRequestLine().getUri());
-
-        final Header[] headers = reqWrapper.getHeaders(SM.COOKIE);
-        Assert.assertEquals("There can only be one (cookie)", 1, headers.length);
-    }
-
-    @Test
-    public void testDefaultHeadersRedirect() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(
-                new BasicRedirectService(getSchemeName(), HttpStatus.SC_MOVED_TEMPORARILY)));
-
-        final List<Header> defaultHeaders = new ArrayList<Header>(1);
-        defaultHeaders.add(new BasicHeader(HTTP.USER_AGENT, "my-test-client"));
-        this.clientBuilder.setDefaultHeaders(defaultHeaders);
-
-        final HttpHost target = start();
-
-        final HttpClientContext context = HttpClientContext.create();
-
-        final HttpGet httpget = new HttpGet("/oldlocation/");
-
-        final Future<HttpResponse> future = this.httpclient.execute(target, httpget, context, null);
-        final HttpResponse response = future.get();
-        Assert.assertNotNull(response);
-
-        final HttpRequest reqWrapper = context.getRequest();
-
-        Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
-        Assert.assertEquals("/newlocation/", reqWrapper.getRequestLine().getUri());
-
-        final Header header = reqWrapper.getFirstHeader(HTTP.USER_AGENT);
-        Assert.assertEquals("my-test-client", header.getValue());
-    }
-
-    static class CrossSiteRedirectService implements HttpRequestHandler {
-
-        private final HttpHost host;
-
-        public CrossSiteRedirectService(final HttpHost host) {
-            super();
-            this.host = host;
-        }
-
-        @Override
-        public void handle(
-                final HttpRequest request,
-                final HttpResponse response,
-                final HttpContext context) throws HttpException, IOException {
-            final ProtocolVersion ver = request.getRequestLine().getProtocolVersion();
-            final String location;
-            try {
-                final URIBuilder uribuilder = new URIBuilder(request.getRequestLine().getUri());
-                uribuilder.setScheme(this.host.getSchemeName());
-                uribuilder.setHost(this.host.getHostName());
-                uribuilder.setPort(this.host.getPort());
-                uribuilder.setPath("/random/1024");
-                location = uribuilder.build().toASCIIString();
-            } catch (final URISyntaxException ex) {
-                throw new ProtocolException("Invalid request URI", ex);
-            }
-            response.setStatusLine(ver, HttpStatus.SC_TEMPORARY_REDIRECT);
-            response.addHeader(new BasicHeader("Location", location));
-        }
-    }
-
-    @Test
-    public void testCrossSiteRedirect() throws Exception {
-        this.serverBootstrap.registerHandler("/random/*", new BasicAsyncRequestHandler(
-                new RandomHandler()));
-        final HttpHost redirectTarget = start();
-
-        this.serverBootstrap.registerHandler("/redirect/*", new BasicAsyncRequestHandler(
-                new CrossSiteRedirectService(redirectTarget)));
-
-        final HttpServer secondServer = this.serverBootstrap.create();
-        try {
-            secondServer.start();
-            final ListenerEndpoint endpoint2 = secondServer.getEndpoint();
-            endpoint2.waitFor();
-
-            final InetSocketAddress address2 = (InetSocketAddress) endpoint2.getAddress();
-            final HttpHost initialTarget = new HttpHost("localhost", address2.getPort(), getSchemeName());
-
-            final Queue<Future<HttpResponse>> queue = new ConcurrentLinkedQueue<Future<HttpResponse>>();
-            for (int i = 0; i < 4; i++) {
-                final HttpClientContext context = HttpClientContext.create();
-                final HttpGet httpget = new HttpGet("/redirect/anywhere");
-                queue.add(this.httpclient.execute(initialTarget, httpget, context, null));
-            }
-            while (!queue.isEmpty()) {
-                final Future<HttpResponse> future = queue.remove();
-                final HttpResponse response = future.get();
-                Assert.assertNotNull(response);
-                Assert.assertEquals(200, response.getStatusLine().getStatusCode());
-            }
-        } finally {
-            this.server.shutdown(10, TimeUnit.SECONDS);
-        }
-    }
-
-    @Test
-    public void testRepeatRequest() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(new RomeRedirectService()));
-        final HttpHost target = start();
-
-        final HttpClientContext context = HttpClientContext.create();
-
-        final RequestConfig config = RequestConfig.custom().setRelativeRedirectsAllowed(true).build();
-        final HttpGet first = new HttpGet("/rome");
-        first.setConfig(config);
-
-        final Future<HttpResponse> future1 = this.httpclient.execute(target, first, context, null);
-        final HttpResponse response1 = future1.get();
-        Assert.assertNotNull(response1);
-
-        final HttpGet second = new HttpGet("/rome");
-        second.setConfig(config);
-
-        final Future<HttpResponse> future2 = this.httpclient.execute(target, second, context, null);
-        final HttpResponse response2 = future2.get();
-        Assert.assertNotNull(response2);
-
-        final HttpRequest reqWrapper = context.getRequest();
-        final HttpHost host = context.getTargetHost();
-
-        Assert.assertEquals(HttpStatus.SC_OK, response2.getStatusLine().getStatusCode());
-        Assert.assertEquals("/rome", reqWrapper.getRequestLine().getUri());
-        Assert.assertEquals(host, target);
-    }
-
-    @Test
-    public void testRepeatRequestRedirect() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(new RomeRedirectService()));
-        final HttpHost target = start();
-
-        final HttpClientContext context = HttpClientContext.create();
-
-        final RequestConfig config = RequestConfig.custom().setRelativeRedirectsAllowed(true).build();
-        final HttpGet first = new HttpGet("/lille");
-        first.setConfig(config);
-
-        final Future<HttpResponse> future1 = this.httpclient.execute(target, first, context, null);
-        final HttpResponse response1 = future1.get();
-        Assert.assertNotNull(response1);
-
-        final HttpGet second = new HttpGet("/lille");
-        second.setConfig(config);
-
-        final Future<HttpResponse> future2 = this.httpclient.execute(target, second, context, null);
-        final HttpResponse response2 = future2.get();
-        Assert.assertNotNull(response2);
-
-        final HttpRequest reqWrapper = context.getRequest();
-        final HttpHost host = context.getTargetHost();
-
-        Assert.assertEquals(HttpStatus.SC_OK, response2.getStatusLine().getStatusCode());
-        Assert.assertEquals("/rome", reqWrapper.getRequestLine().getUri());
-        Assert.assertEquals(host, target);
-    }
-
-    @Test
-    public void testDifferentRequestSameRedirect() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(new RomeRedirectService()));
-        final HttpHost target = start();
-
-        final HttpClientContext context = HttpClientContext.create();
-
-        final RequestConfig config = RequestConfig.custom().setRelativeRedirectsAllowed(true).build();
-        final HttpGet first = new HttpGet("/alian");
-        first.setConfig(config);
-
-        final Future<HttpResponse> future1 = this.httpclient.execute(target, first, context, null);
-        final HttpResponse response1 = future1.get();
-        Assert.assertNotNull(response1);
-
-        final HttpGet second = new HttpGet("/lille");
-        second.setConfig(config);
-
-        final Future<HttpResponse> future2 = this.httpclient.execute(target, second, context, null);
-        final HttpResponse response2 = future2.get();
-        Assert.assertNotNull(response2);
-
-        final HttpRequest reqWrapper = context.getRequest();
-        final HttpHost host = context.getTargetHost();
-
-        Assert.assertEquals(HttpStatus.SC_OK, response2.getStatusLine().getStatusCode());
-        Assert.assertEquals("/rome", reqWrapper.getRequestLine().getUri());
-        Assert.assertEquals(host, target);
-    }
-
-}
\ No newline at end of file
diff --git a/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestStatefulConnManagement.java b/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestStatefulConnManagement.java
deleted file mode 100644
index 5020073..0000000
--- a/httpasyncclient/src/test/java/org/apache/http/nio/client/integration/TestStatefulConnManagement.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.client.integration;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.concurrent.Future;
-
-import org.apache.http.localserver.HttpAsyncTestBase;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpException;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.UserTokenHandler;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.entity.ContentType;
-import org.apache.http.impl.nio.conn.CPoolUtils;
-import org.apache.http.nio.ContentDecoder;
-import org.apache.http.nio.IOControl;
-import org.apache.http.nio.NHttpClientConnection;
-import org.apache.http.nio.client.HttpAsyncClient;
-import org.apache.http.nio.entity.NStringEntity;
-import org.apache.http.nio.protocol.AbstractAsyncResponseConsumer;
-import org.apache.http.nio.protocol.BasicAsyncRequestHandler;
-import org.apache.http.nio.protocol.BasicAsyncRequestProducer;
-import org.apache.http.nio.reactor.IOEventDispatch;
-import org.apache.http.pool.PoolEntry;
-import org.apache.http.protocol.BasicHttpContext;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.protocol.HttpRequestHandler;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class TestStatefulConnManagement extends HttpAsyncTestBase {
-
-    static class SimpleService implements HttpRequestHandler {
-
-        public SimpleService() {
-            super();
-        }
-
-        @Override
-        public void handle(
-                final HttpRequest request,
-                final HttpResponse response,
-                final HttpContext context) throws HttpException, IOException {
-            response.setStatusCode(HttpStatus.SC_OK);
-            final NStringEntity entity = new NStringEntity("Whatever");
-            response.setEntity(entity);
-        }
-    }
-
-    @Test
-    public void testStatefulConnections() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(new SimpleService()));
-
-        final UserTokenHandler userTokenHandler = new UserTokenHandler() {
-
-            @Override
-            public Object getUserToken(final HttpContext context) {
-                return context.getAttribute("user");
-            }
-
-        };
-        this.clientBuilder.setUserTokenHandler(userTokenHandler);
-        final HttpHost target = start();
-
-        final int workerCount = 2;
-        final int requestCount = 5;
-
-        final HttpContext[] contexts = new HttpContext[workerCount];
-        final HttpWorker[] workers = new HttpWorker[workerCount];
-        for (int i = 0; i < contexts.length; i++) {
-            final HttpContext context = new BasicHttpContext();
-            final Object token = Integer.valueOf(i);
-            context.setAttribute("user", token);
-            contexts[i] = context;
-            workers[i] = new HttpWorker(context, requestCount, target, this.httpclient);
-        }
-
-        for (final HttpWorker worker : workers) {
-            worker.start();
-        }
-        for (final HttpWorker worker : workers) {
-            worker.join(10000);
-        }
-        for (final HttpWorker worker : workers) {
-            final Exception ex = worker.getException();
-            if (ex != null) {
-                throw ex;
-            }
-            Assert.assertEquals(requestCount, worker.getCount());
-        }
-
-        for (final HttpContext context : contexts) {
-            final Integer id = (Integer) context.getAttribute("user");
-
-            for (int r = 1; r < requestCount; r++) {
-                final Integer state = (Integer) context.getAttribute("r" + r);
-                Assert.assertEquals(id, state);
-            }
-        }
-
-    }
-
-    static class HttpWorker extends Thread {
-
-        private final HttpContext context;
-        private final int requestCount;
-        private final HttpHost target;
-        private final HttpAsyncClient httpclient;
-
-        private volatile Exception exception;
-        private volatile int count;
-
-        public HttpWorker(
-                final HttpContext context,
-                final int requestCount,
-                final HttpHost target,
-                final HttpAsyncClient httpclient) {
-            super();
-            this.context = context;
-            this.requestCount = requestCount;
-            this.target = target;
-            this.httpclient = httpclient;
-            this.count = 0;
-        }
-
-        public int getCount() {
-            return this.count;
-        }
-
-        public Exception getException() {
-            return this.exception;
-        }
-
-        @Override
-        public void run() {
-            try {
-                for (int r = 0; r < this.requestCount; r++) {
-                    final HttpGet httpget = new HttpGet("/");
-                    final Future<Object> future = this.httpclient.execute(
-                            new BasicAsyncRequestProducer(this.target, httpget),
-                            new AbstractAsyncResponseConsumer<Object>() {
-
-                                @Override
-                                protected void onResponseReceived(final HttpResponse response) {
-                                }
-
-                                @Override
-                                protected void onEntityEnclosed(
-                                        final HttpEntity entity,
-                                        final ContentType contentType) throws IOException {
-                                }
-
-                                @Override
-                                protected void onContentReceived(
-                                        final ContentDecoder decoder,
-                                        final IOControl ioctrl) throws IOException {
-                                    final ByteBuffer buf = ByteBuffer.allocate(2048);
-                                    decoder.read(buf);
-                                }
-
-                                @Override
-                                protected Object buildResult(final HttpContext context) throws Exception {
-                                    final NHttpClientConnection conn = (NHttpClientConnection) context.getAttribute(
-                                            IOEventDispatch.CONNECTION_KEY);
-
-                                    final PoolEntry<?, ?> entry = CPoolUtils.getPoolEntry(conn);
-                                    return entry.getState();
-                                }
-
-                                @Override
-                                protected void releaseResources() {
-                                }
-
-                            },
-                            this.context,
-                            null);
-                    this.count++;
-                    final Object state = future.get();
-                    this.context.setAttribute("r" + r, state);
-                }
-
-            } catch (final Exception ex) {
-                this.exception = ex;
-            }
-        }
-
-    }
-
-    @Test
-    public void testRouteSpecificPoolRecylcing() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(new SimpleService()));
-        // This tests what happens when a maxed connection pool needs
-        // to kill the last idle connection to a route to build a new
-        // one to the same route.
-        final UserTokenHandler userTokenHandler = new UserTokenHandler() {
-
-            @Override
-            public Object getUserToken(final HttpContext context) {
-                return context.getAttribute("user");
-            }
-
-        };
-        this.clientBuilder.setUserTokenHandler(userTokenHandler);
-
-        final HttpHost target = start();
-        final int maxConn = 2;
-        // We build a client with 2 max active // connections, and 2 max per route.
-        this.connMgr.setMaxTotal(maxConn);
-        this.connMgr.setDefaultMaxPerRoute(maxConn);
-
-        // Bottom of the pool : a *keep alive* connection to Route 1.
-        final HttpContext context1 = new BasicHttpContext();
-        context1.setAttribute("user", "stuff");
-
-        final Future<HttpResponse> future1 = this.httpclient.execute(
-                target, new HttpGet("/"), context1, null);
-        final HttpResponse response1 = future1.get();
-        Assert.assertNotNull(response1);
-        Assert.assertEquals(200, response1.getStatusLine().getStatusCode());
-
-        // The ConnPoolByRoute now has 1 free connection, out of 2 max
-        // The ConnPoolByRoute has one RouteSpcfcPool, that has one free connection
-        // for [localhost][stuff]
-
-        Thread.sleep(100);
-
-        // Send a very simple HTTP get (it MUST be simple, no auth, no proxy, no 302, no 401, ...)
-        // Send it to another route. Must be a keepalive.
-        final HttpContext context2 = new BasicHttpContext();
-
-        final Future<HttpResponse> future2 = this.httpclient.execute(
-                new HttpHost("127.0.0.1", target.getPort(), target.getSchemeName()),
-                new HttpGet("/"), context2, null);
-        final HttpResponse response2 = future2.get();
-        Assert.assertNotNull(response2);
-        Assert.assertEquals(200, response2.getStatusLine().getStatusCode());
-
-        // ConnPoolByRoute now has 2 free connexions, out of its 2 max.
-        // The [localhost][stuff] RouteSpcfcPool is the same as earlier
-        // And there is a [127.0.0.1][null] pool with 1 free connection
-
-        Thread.sleep(100);
-
-        // This will put the ConnPoolByRoute to the targeted state :
-        // [localhost][stuff] will not get reused because this call is [localhost][null]
-        // So the ConnPoolByRoute will need to kill one connection (it is maxed out globally).
-        // The killed conn is the oldest, which means the first HTTPGet ([localhost][stuff]).
-        // When this happens, the RouteSpecificPool becomes empty.
-        final HttpContext context3 = new BasicHttpContext();
-        final Future<HttpResponse> future3 = this.httpclient.execute(
-                target, new HttpGet("/"), context3, null);
-        final HttpResponse response3 = future3.get();
-        Assert.assertNotNull(response3);
-        Assert.assertEquals(200, response3.getStatusLine().getStatusCode());
-    }
-
-}
\ No newline at end of file
diff --git a/httpasyncclient/src/test/java/org/apache/http/nio/client/methods/TestAsyncConsumers.java b/httpasyncclient/src/test/java/org/apache/http/nio/client/methods/TestAsyncConsumers.java
deleted file mode 100644
index 1f957ea..0000000
--- a/httpasyncclient/src/test/java/org/apache/http/nio/client/methods/TestAsyncConsumers.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.client.methods;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.CharBuffer;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.atomic.AtomicLong;
-
-import org.apache.http.Consts;
-import org.apache.http.localserver.HttpAsyncTestBase;
-import org.apache.http.HttpException;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpResponse;
-import org.apache.http.entity.ContentType;
-import org.apache.http.localserver.EchoHandler;
-import org.apache.http.localserver.RandomHandler;
-import org.apache.http.nio.IOControl;
-import org.apache.http.nio.protocol.BasicAsyncRequestHandler;
-import org.apache.http.nio.protocol.HttpAsyncRequestProducer;
-import org.apache.http.protocol.HttpContext;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Matchers;
-import org.mockito.Mockito;
-
-public class TestAsyncConsumers extends HttpAsyncTestBase {
-
-    @Before @Override
-    public void setUp() throws Exception {
-        super.setUp();
-        this.serverBootstrap.registerHandler("/echo/*", new BasicAsyncRequestHandler(new EchoHandler()));
-        this.serverBootstrap.registerHandler("/random/*", new BasicAsyncRequestHandler(new RandomHandler()));
-    }
-
-    static class ByteCountingConsumer extends AsyncByteConsumer<Long> {
-
-        public ByteCountingConsumer() {
-            super();
-        }
-
-        public ByteCountingConsumer(final int bufSize) {
-            super(bufSize);
-        }
-
-        private final AtomicLong count = new AtomicLong(0);
-
-        @Override
-        protected void onResponseReceived(final HttpResponse response) {
-        }
-
-        @Override
-        protected void onByteReceived(final ByteBuffer buf, final IOControl ioctrl) {
-            this.count.addAndGet(buf.remaining());
-        }
-
-        @Override
-        protected Long buildResult(final HttpContext context) throws Exception {
-            return count.get();
-        }
-
-    }
-
-    @Test
-    public void testByteConsumer() throws Exception {
-        final HttpHost target = start();
-        for (int i = 0; i < 5; i++) {
-            final HttpAsyncRequestProducer httpget = HttpAsyncMethods.createGet(target.toURI() + "/random/20480");
-            final AsyncByteConsumer<Long> consumer = new ByteCountingConsumer();
-            final Future<Long> future = this.httpclient.execute(httpget, consumer, null);
-            final Long count = future.get();
-            Assert.assertEquals(20480, count.longValue());
-        }
-    }
-
-    @Test
-    public void testByteConsumerSmallBufffer() throws Exception {
-        final HttpHost target = start();
-        for (int i = 0; i < 5; i++) {
-            final HttpAsyncRequestProducer httpget = HttpAsyncMethods.createGet(target.toURI() + "/random/20480");
-            final AsyncByteConsumer<Long> consumer = new ByteCountingConsumer(512);
-            final Future<Long> future = this.httpclient.execute(httpget, consumer, null);
-            final Long count = future.get();
-            Assert.assertEquals(20480, count.longValue());
-        }
-    }
-
-    static class BufferingCharConsumer extends AsyncCharConsumer<String> {
-
-        public BufferingCharConsumer() {
-            super();
-        }
-
-        public BufferingCharConsumer(final int bufSize) {
-            super(bufSize);
-        }
-
-        private final StringBuilder sb = new StringBuilder();
-
-        @Override
-        public void onResponseReceived(final HttpResponse response) {
-        }
-
-        @Override
-        protected void onCharReceived(final CharBuffer buf, final IOControl ioctrl) throws IOException {
-            while (buf.hasRemaining()) {
-                this.sb.append(buf.get());
-            }
-        }
-
-        @Override
-        protected void releaseResources() {
-            super.releaseResources();
-            this.sb.setLength(0);
-        }
-
-        @Override
-        protected String buildResult(final HttpContext context) throws Exception {
-            return this.sb.toString();
-        }
-
-    }
-
-    @Test
-    public void testCharConsumer() throws Exception {
-        final HttpHost target = start();
-        final StringBuilder sb = new StringBuilder();
-        for (int i= 0; i < 25; i++) {
-            sb.append("blah blah blah blah\r\n");
-            sb.append("yada yada yada yada\r\n");
-        }
-        final String s = sb.toString();
-
-        for (int i = 0; i < 5; i++) {
-            final HttpAsyncRequestProducer httppost = HttpAsyncMethods.createPost(
-                    target.toURI() + "/echo/stuff", s,
-                    ContentType.create("text/plain", Consts.ASCII));
-            final AsyncCharConsumer<String> consumer = new BufferingCharConsumer();
-            final Future<String> future = this.httpclient.execute(httppost, consumer, null);
-            final String result = future.get();
-            Assert.assertEquals(s, result);
-        }
-    }
-
-    @Test
-    public void testCharConsumerSmallBufffer() throws Exception {
-        final HttpHost target = start();
-        final StringBuilder sb = new StringBuilder();
-        for (int i= 0; i < 25; i++) {
-            sb.append("blah blah blah blah\r\n");
-            sb.append("yada yada yada yada\r\n");
-        }
-        final String s = sb.toString();
-
-        for (int i = 0; i < 5; i++) {
-            final HttpAsyncRequestProducer httppost = HttpAsyncMethods.createPost(
-                    target.toURI() + "/echo/stuff", s,
-                    ContentType.create("text/plain", Consts.ASCII));
-            final AsyncCharConsumer<String> consumer = new BufferingCharConsumer(512);
-            final Future<String> future = this.httpclient.execute(httppost, consumer, null);
-            final String result = future.get();
-            Assert.assertEquals(s, result);
-        }
-    }
-
-    @Test
-    public void testResourceReleaseOnSuccess() throws Exception {
-        final HttpHost target = start();
-        final StringBuilder sb = new StringBuilder();
-        for (int i= 0; i < 25; i++) {
-            sb.append("blah blah blah blah\r\n");
-            sb.append("yada yada yada yada\r\n");
-        }
-        final String s = sb.toString();
-
-        final HttpAsyncRequestProducer httppost = HttpAsyncMethods.createPost(
-                target.toURI() + "/echo/stuff", s,
-                ContentType.create("text/plain", Consts.ASCII));
-        final BufferingCharConsumer consumer = Mockito.spy(new BufferingCharConsumer());
-        final Future<String> future = this.httpclient.execute(httppost, consumer, null);
-        final String result = future.get();
-        Assert.assertEquals(s, result);
-        Mockito.verify(consumer).buildResult(Matchers.any(HttpContext.class));
-        Mockito.verify(consumer).releaseResources();
-    }
-
-    @Test
-    public void testResourceReleaseOnException() throws Exception {
-        final HttpHost target = start();
-        final HttpAsyncRequestProducer httppost = HttpAsyncMethods.createPost(
-                target.toURI() + "/echo/stuff", "stuff",
-                ContentType.create("text/plain", Consts.ASCII));
-        final AsyncCharConsumer<String> consumer = Mockito.spy(new BufferingCharConsumer());
-        Mockito.doThrow(new IOException("Kaboom")).when(consumer).onCharReceived(
-                Matchers.any(CharBuffer.class), Matchers.any(IOControl.class));
-
-        final Future<String> future = this.httpclient.execute(httppost, consumer, null);
-        try {
-            future.get();
-            Assert.fail("ExecutionException expected");
-        } catch (final ExecutionException ex) {
-            final Throwable t = ex.getCause();
-            Assert.assertNotNull(t);
-            Assert.assertTrue(t instanceof IOException);
-            Assert.assertEquals("Kaboom", t.getMessage());
-        }
-        Mockito.verify(consumer).releaseResources();
-    }
-
-    @Test
-    public void testResourceReleaseOnBuildFailure() throws Exception {
-        final HttpHost target = start();
-        final HttpAsyncRequestProducer httppost = HttpAsyncMethods.createPost(
-                target.toURI() + "/echo/stuff", "stuff",
-                ContentType.create("text/plain", Consts.ASCII));
-        final BufferingCharConsumer consumer = Mockito.spy(new BufferingCharConsumer());
-        Mockito.doThrow(new HttpException("Kaboom")).when(consumer).buildResult(Matchers.any(HttpContext.class));
-
-        final Future<String> future = this.httpclient.execute(httppost, consumer, null);
-        try {
-            future.get();
-            Assert.fail("ExecutionException expected");
-        } catch (final ExecutionException ex) {
-            final Throwable t = ex.getCause();
-            Assert.assertNotNull(t);
-            Assert.assertTrue(t instanceof HttpException);
-            Assert.assertEquals("Kaboom", t.getMessage());
-        }
-        Mockito.verify(consumer).releaseResources();
-    }
-
-}
diff --git a/httpasyncclient/src/test/java/org/apache/http/nio/client/methods/TestZeroCopy.java b/httpasyncclient/src/test/java/org/apache/http/nio/client/methods/TestZeroCopy.java
deleted file mode 100644
index 7b7bb31..0000000
--- a/httpasyncclient/src/test/java/org/apache/http/nio/client/methods/TestZeroCopy.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.nio.client.methods;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.nio.charset.Charset;
-import java.util.concurrent.Future;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.io.LineIterator;
-import org.apache.commons.io.output.FileWriterWithEncoding;
-import org.apache.http.Consts;
-import org.apache.http.localserver.HttpAsyncTestBase;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpEntityEnclosingRequest;
-import org.apache.http.HttpException;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.BasicHttpEntity;
-import org.apache.http.entity.ContentType;
-import org.apache.http.nio.entity.NFileEntity;
-import org.apache.http.nio.entity.NStringEntity;
-import org.apache.http.nio.protocol.BasicAsyncRequestHandler;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.protocol.HttpRequestHandler;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-public class TestZeroCopy extends HttpAsyncTestBase {
-
-    private static final String[] TEXT = {
-        "blah blah blah blah blah blah blah blah blah blah blah blah blah blah",
-        "yada yada yada yada yada yada yada yada yada yada yada yada yada yada",
-        "da da da da da da da da da da da da da da da da da da da da da da da da",
-        "nyet nyet nyet nyet nyet nyet nyet nyet nyet nyet nyet nyet nyet nyet"
-    };
-
-    private static final Charset ASCII = Charset.forName("ascii");
-    private static File TEST_FILE;
-    private File tmpfile;
-
-    @BeforeClass
-    public static void createSrcFile() throws Exception {
-        final File tmpdir = FileUtils.getTempDirectory();
-        TEST_FILE = new File(tmpdir, "src.test");
-        final FileWriterWithEncoding out = new FileWriterWithEncoding(TEST_FILE, ASCII);
-        try {
-            for (int i = 0; i < 500; i++) {
-                for (final String line: TEXT) {
-                    out.write(line);
-                    out.write("\r\n");
-                }
-            }
-        } finally {
-            out.close();
-        }
-    }
-
-    @AfterClass
-    public static void deleteSrcFile() throws Exception {
-        if (TEST_FILE != null) {
-            TEST_FILE.delete();
-            TEST_FILE = null;
-        }
-    }
-
-    @After
-    public void cleanUp() throws Exception {
-        if (this.tmpfile != null && this.tmpfile.exists()) {
-            this.tmpfile.delete();
-        }
-    }
-
-    static class TestZeroCopyPost extends BaseZeroCopyRequestProducer {
-
-        private final boolean forceChunking;
-
-        protected TestZeroCopyPost(
-                final String requestURI,
-                final boolean forceChunking) throws FileNotFoundException {
-            super(URI.create(requestURI), TEST_FILE, ContentType.create("text/plain"));
-            this.forceChunking = forceChunking;
-        }
-
-        @Override
-        protected HttpEntityEnclosingRequest createRequest(final URI requestURI, final HttpEntity entity) {
-            final HttpPost httppost = new HttpPost(requestURI);
-            if (this.forceChunking) {
-                final BasicHttpEntity chunkedEntity = new BasicHttpEntity();
-                chunkedEntity.setChunked(true);
-                httppost.setEntity(chunkedEntity);
-            } else {
-                httppost.setEntity(entity);
-            }
-            return httppost;
-        }
-
-    }
-
-    static class TestZeroCopyConsumer extends ZeroCopyConsumer<Integer> {
-
-        public TestZeroCopyConsumer(final File file) throws FileNotFoundException {
-            super(file);
-        }
-
-        @Override
-        protected Integer process(
-                final HttpResponse response,
-                final File file,
-                final ContentType contentType) {
-            return response.getStatusLine().getStatusCode();
-        }
-
-    }
-
-    static class TestHandler implements HttpRequestHandler {
-
-        private final boolean forceChunking;
-
-        TestHandler(final boolean forceChunking) {
-            super();
-            this.forceChunking = forceChunking;
-        }
-
-        @Override
-        public void handle(
-                final HttpRequest request,
-                final HttpResponse response,
-                final HttpContext context) throws HttpException, IOException {
-            HttpEntity requestEntity = null;
-            if (request instanceof HttpEntityEnclosingRequest) {
-                requestEntity = ((HttpEntityEnclosingRequest) request).getEntity();
-            }
-            if (requestEntity == null) {
-                response.setEntity(new NStringEntity("Empty content"));
-                return;
-            }
-
-            boolean ok = true;
-
-            final InputStream instream = requestEntity.getContent();
-            try {
-                final ContentType contentType = ContentType.getOrDefault(requestEntity);
-                Charset charset = contentType.getCharset();
-                if (charset == null) {
-                    charset = Consts.ISO_8859_1;
-                }
-                final LineIterator it = IOUtils.lineIterator(instream, charset.name());
-                int count = 0;
-                while (it.hasNext()) {
-                    final String line = it.next();
-                    final int i = count % TEXT.length;
-                    final String expected = TEXT[i];
-                    if (!line.equals(expected)) {
-                        ok = false;
-                        break;
-                    }
-                    count++;
-                }
-            } finally {
-                instream.close();
-            }
-            if (ok) {
-                final NFileEntity responseEntity = new NFileEntity(TEST_FILE,
-                        ContentType.create("text/plian"));
-                if (this.forceChunking) {
-                    responseEntity.setChunked(true);
-                }
-                response.setEntity(responseEntity);
-            } else {
-                response.setEntity(new NStringEntity("Invalid content"));
-            }
-        }
-    }
-
-    @Test
-    public void testTwoWayZeroCopy() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(new TestHandler(false)));
-        final HttpHost target = start();
-
-        final File tmpdir = FileUtils.getTempDirectory();
-        this.tmpfile = new File(tmpdir, "dst.test");
-        final TestZeroCopyPost httppost = new TestZeroCopyPost(target.toURI() + "/bounce", false);
-        final TestZeroCopyConsumer consumer = new TestZeroCopyConsumer(this.tmpfile);
-        final Future<Integer> future = this.httpclient.execute(httppost, consumer, null);
-        final Integer status = future.get();
-        Assert.assertNotNull(status);
-        Assert.assertEquals(HttpStatus.SC_OK, status.intValue());
-        final InputStream instream = new FileInputStream(this.tmpfile);
-        try {
-            final LineIterator it = IOUtils.lineIterator(instream, ASCII.name());
-            int count = 0;
-            while (it.hasNext()) {
-                final String line = it.next();
-                final int i = count % TEXT.length;
-                final String expected = TEXT[i];
-                Assert.assertEquals(expected, line);
-                count++;
-            }
-        } finally {
-            instream.close();
-        }
-    }
-
-    @Test
-    public void testZeroCopyFallback() throws Exception {
-        this.serverBootstrap.registerHandler("*", new BasicAsyncRequestHandler(new TestHandler(true)));
-        final HttpHost target = start();
-        final File tmpdir = FileUtils.getTempDirectory();
-        this.tmpfile = new File(tmpdir, "dst.test");
-        final TestZeroCopyPost httppost = new TestZeroCopyPost(target.toURI() + "/bounce", true);
-        final TestZeroCopyConsumer consumer = new TestZeroCopyConsumer(this.tmpfile);
-        final Future<Integer> future = this.httpclient.execute(httppost, consumer, null);
-        final Integer status = future.get();
-        Assert.assertNotNull(status);
-        Assert.assertEquals(HttpStatus.SC_OK, status.intValue());
-        final InputStream instream = new FileInputStream(this.tmpfile);
-        try {
-            final LineIterator it = IOUtils.lineIterator(instream, ASCII.name());
-            int count = 0;
-            while (it.hasNext()) {
-                final String line = it.next();
-                final int i = count % TEXT.length;
-                final String expected = TEXT[i];
-                Assert.assertEquals(expected, line);
-                count++;
-            }
-        } finally {
-            instream.close();
-        }
-    }
-
-}
diff --git a/httpasyncclient/src/test/resources/commons-logging.properties b/httpasyncclient/src/test/resources/commons-logging.properties
deleted file mode 100644
index 2fa1b3b..0000000
--- a/httpasyncclient/src/test/resources/commons-logging.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-# ====================================================================
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-# ====================================================================
-#
-# This software consists of voluntary contributions made by many
-# individuals on behalf of the Apache Software Foundation.  For more
-# information on the Apache Software Foundation, please see
-# <http://www.apache.org/>.
-
-# Disable logging for unit tests
-org.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog
diff --git a/httpasyncclient/src/test/resources/test.keystore b/httpasyncclient/src/test/resources/test.keystore
deleted file mode 100644
index 917f83e..0000000
--- a/httpasyncclient/src/test/resources/test.keystore
+++ /dev/null
Binary files differ
diff --git a/pom.xml b/pom.xml
deleted file mode 100644
index 8296ca5..0000000
--- a/pom.xml
+++ /dev/null
@@ -1,311 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one
-   or more contributor license agreements.  See the NOTICE file
-   distributed with this work for additional information
-   regarding copyright ownership.  The ASF licenses this file
-   to you under the Apache License, Version 2.0 (the
-   "License"); you may not use this file except in compliance
-   with the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing,
-   software distributed under the License is distributed on an
-   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-   KIND, either express or implied.  See the License for the
-   specific language governing permissions and limitations
-   under the License.
-   ====================================================================
-
-   This software consists of voluntary contributions made by many
-   individuals on behalf of the Apache Software Foundation.  For more
-   information on the Apache Software Foundation, please see
-   <http://www.apache.org />.
- --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>
-      <artifactId>project</artifactId>
-      <groupId>org.apache.httpcomponents</groupId>
-      <version>7</version>
-      <relativePath>../project/pom.xml</relativePath>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-  <artifactId>httpcomponents-asyncclient</artifactId>
-  <name>Apache HttpComponents AsyncClient</name>
-  <version>4.2-alpha1-SNAPSHOT</version>
-  <description>Apache components to build asynchronous client side HTTP services</description>
-  <url>http://hc.apache.org/httpcomponents-asyncclient</url>
-  <inceptionYear>2010</inceptionYear>
-  <packaging>pom</packaging>
-
-  <organization>
-    <name>The Apache Software Foundation</name>
-    <url>http://www.apache.org/</url>
-  </organization>
-
-  <licenses>
-    <license>
-      <name>Apache License, Version 2.0</name>
-      <url>LICENSE.txt</url>
-      <distribution>repo</distribution>
-    </license>
-  </licenses>
-
-  <issueManagement>
-    <system>Jira</system>
-    <url>http://issues.apache.org/jira/browse/HTTPASYNC</url>
-  </issueManagement>
-
-  <scm>
-    <connection>scm:svn:https://svn.apache.org/repos/asf/httpcomponents/httpasyncclient/trunk</connection>
-    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/httpcomponents/httpasyncclient/trunk</developerConnection>
-    <url>https://svn.apache.org/repos/asf/httpcomponents/httpasyncclient/trunk</url>
-  </scm>
-
-  <properties>
-    <maven.compiler.source>1.6</maven.compiler.source>
-    <maven.compiler.target>1.6</maven.compiler.target>
-    <httpcore.version>4.4.1</httpcore.version>
-    <httpclient.version>4.4.1</httpclient.version>
-    <commons-logging.version>1.2</commons-logging.version>
-    <commons-io.version>2.4</commons-io.version>
-    <junit.version>4.11</junit.version>
-    <easymock.version>2.5.2</easymock.version>
-    <mockito.version>1.8.5</mockito.version>
-    <hc.stylecheck.version>1</hc.stylecheck.version>
-    <api.comparison.version>4.0</api.comparison.version>
-  </properties>
-
-  <dependencyManagement>
-    <dependencies>
-      <dependency>
-        <groupId>org.apache.httpcomponents</groupId>
-        <artifactId>httpcore</artifactId>
-        <version>${httpcore.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.httpcomponents</groupId>
-        <artifactId>httpcore-nio</artifactId>
-        <version>${httpcore.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.httpcomponents</groupId>
-        <artifactId>httpclient</artifactId>
-        <version>${httpclient.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.httpcomponents</groupId>
-        <artifactId>httpclient-cache</artifactId>
-        <version>${httpclient.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>commons-logging</groupId>
-        <artifactId>commons-logging</artifactId>
-        <version>${commons-logging.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>junit</groupId>
-        <artifactId>junit</artifactId>
-        <version>${junit.version}</version>
-        <scope>test</scope>
-      </dependency>
-      <dependency>
-        <groupId>org.mockito</groupId>
-        <artifactId>mockito-core</artifactId>
-        <version>${mockito.version}</version>
-        <scope>test</scope>
-      </dependency>
-      <dependency>
-        <groupId>org.easymock</groupId>
-        <artifactId>easymock</artifactId>
-        <version>${easymock.version}</version>
-        <scope>test</scope>
-      </dependency>
-      <dependency>
-        <groupId>org.easymock</groupId>
-        <artifactId>easymockclassextension</artifactId>
-        <version>${easymock.version}</version>
-        <scope>test</scope>
-      </dependency>
-      <dependency>
-        <groupId>commons-io</groupId>
-        <artifactId>commons-io</artifactId>
-        <version>${commons-io.version}</version>
-        <scope>test</scope>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.httpcomponents</groupId>
-        <artifactId>httpclient-cache</artifactId>
-        <version>${httpclient.version}</version>
-        <type>test-jar</type>
-        <scope>test</scope>
-      </dependency>
-    </dependencies>
-  </dependencyManagement>
-
-  <modules>
-    <module>httpasyncclient</module>
-    <module>httpasyncclient-cache</module>
-    <module>httpasyncclient-osgi</module>
-  </modules>
-
-  <build>
-    <plugins>
-      <plugin>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifestEntries>
-              <Specification-Title>HttpComponents ${project.name}</Specification-Title>
-              <Specification-Version>${project.version}</Specification-Version>
-              <Specification-Vendor>The Apache Software Foundation</Specification-Vendor>
-              <Implementation-Title>HttpComponents ${project.name}</Implementation-Title>
-              <Implementation-Version>${project.version}</Implementation-Version>
-              <Implementation-Vendor>The Apache Software Foundation</Implementation-Vendor>
-              <Implementation-Vendor-Id>org.apache</Implementation-Vendor-Id>
-              <url>${project.url}</url>
-            </manifestEntries>
-          </archive>
-        </configuration>
-      </plugin>
-      <plugin>
-        <artifactId>maven-source-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>attach-sources</id>
-            <goals>
-              <goal>jar</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <artifactId>maven-javadoc-plugin</artifactId>
-        <configuration>
-          <source>${maven.compiler.source}</source>
-          <links>
-            <link>http://docs.oracle.com/javase/6/docs/api/</link>
-            <link>http://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/</link>
-            <link>http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/</link>
-          </links>
-        </configuration>
-      </plugin>
-      <plugin>
-        <artifactId>maven-site-plugin</artifactId>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-checkstyle-plugin</artifactId>
-        <version>2.9.1</version>
-        <dependencies>
-          <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>hc-stylecheck</artifactId>
-            <version>${hc.stylecheck.version}</version>
-          </dependency>
-        </dependencies>
-        <configuration>
-          <encoding>UTF-8</encoding>
-        </configuration>
-        <executions>
-          <execution>
-            <id>validate-main</id>
-            <phase>validate</phase>
-            <configuration>
-              <configLocation>hc-stylecheck/default.xml</configLocation>
-              <headerLocation>hc-stylecheck/asl2.header</headerLocation>
-              <consoleOutput>true</consoleOutput>
-              <failsOnError>true</failsOnError>
-              <linkXRef>false</linkXRef>
-              <sourceDirectory>${basedir}/src/main</sourceDirectory>
-            </configuration>
-            <goals>
-              <goal>checkstyle</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>validate-test</id>
-            <phase>validate</phase>
-            <configuration>
-              <configLocation>hc-stylecheck/default.xml</configLocation>
-              <headerLocation>hc-stylecheck/asl2.header</headerLocation>
-              <consoleOutput>true</consoleOutput>
-              <failsOnError>true</failsOnError>
-              <linkXRef>false</linkXRef>
-              <sourceDirectory>${basedir}/src/test</sourceDirectory>
-            </configuration>
-            <goals>
-              <goal>checkstyle</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>validate-examples</id>
-            <phase>validate</phase>
-            <configuration>
-              <configLocation>hc-stylecheck/minimal.xml</configLocation>
-              <headerLocation>hc-stylecheck/asl2.header</headerLocation>
-              <consoleOutput>true</consoleOutput>
-              <failsOnError>true</failsOnError>
-              <linkXRef>false</linkXRef>
-              <sourceDirectory>${basedir}/src/examples</sourceDirectory>
-            </configuration>
-            <goals>
-              <goal>checkstyle</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>clirr-maven-plugin</artifactId>
-        <version>${hc.clirr.version}</version>
-        <configuration>
-          <comparisonVersion>${api.comparison.version}</comparisonVersion>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.rat</groupId>
-        <artifactId>apache-rat-plugin</artifactId>
-        <version>0.11</version>
-        <executions>
-          <execution>
-            <phase>verify</phase>
-            <goals>
-              <goal>check</goal>
-            </goals>
-          </execution>
-        </executions>
-        <configuration>
-          <excludes>
-            <exclude>src/test/resources/*.truststore</exclude>
-          </excludes>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
-  <reporting>
-    <plugins>
-
-      <plugin>
-        <artifactId>maven-project-info-reports-plugin</artifactId>
-        <version>${hc.project-info.version}</version>
-        <inherited>false</inherited>
-        <reportSets>
-          <reportSet>
-            <reports>
-              <report>dependency-management</report>
-              <report>issue-tracking</report>
-              <report>license</report>
-              <report>scm</report>
-              <report>summary</report>
-            </reports>
-          </reportSet>
-        </reportSets>
-      </plugin>
-
-    </plugins>
-  </reporting>
-
-</project>
